From da631a40df545337ca5060768c7ee986192bdfff Mon Sep 17 00:00:00 2001 From: unknown <2425798972@qq.com> Date: Thu, 10 Apr 2025 14:07:11 +0800 Subject: [PATCH 001/143] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=8C=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/.gitattributes | 2 + demo/.gitignore | 33 +++ demo/.mvn/wrapper/maven-wrapper.properties | 19 ++ demo/mvnw | 259 ++++++++++++++++++ demo/mvnw.cmd | 149 ++++++++++ demo/pom.xml | 138 ++++++++++ .../java/com/dite/znpt/DiteApplication.java | 18 ++ .../com/dite/znpt/aspect/HttpLogAspect.java | 82 ++++++ .../znpt/config/BeanPostProcessorConfig.java | 49 ++++ .../dite/znpt/config/GlobalCorsConfig.java | 32 +++ .../com/dite/znpt/config/JacksonConfig.java | 31 +++ .../dite/znpt/config/SaTokenConfigure.java | 76 +++++ .../com/dite/znpt/config/SwaggerConfig.java | 53 ++++ .../com/dite/znpt/config/WebMvcConfig.java | 25 ++ .../controller/CombinedDictController.java | 63 +++++ .../znpt/controller/DefectController.java | 63 +++++ .../znpt/controller/FileInfoController.java | 63 +++++ .../znpt/controller/PersonnelController.java | 63 +++++ .../controller/ProjectCompanyController.java | 63 +++++ .../znpt/controller/ProjectController.java | 63 +++++ .../znpt/controller/TCompanyController.java | 63 +++++ .../controller/TConstructionController.java | 63 +++++ .../znpt/controller/TurbineController.java | 63 +++++ .../controller/WeatherTypeController.java | 63 +++++ .../com/dite/znpt/domain/AuditableEntity.java | 43 +++ .../java/com/dite/znpt/domain/Constants.java | 24 ++ .../java/com/dite/znpt/domain/Result.java | 67 +++++ .../domain/entity/CombinedDictEntity.java | 49 ++++ .../dite/znpt/domain/entity/DefectEntity.java | 66 +++++ .../znpt/domain/entity/FileInfoEntity.java | 37 +++ .../znpt/domain/entity/PersonnelEntity.java | 45 +++ .../domain/entity/ProjectCompanyEntity.java | 36 +++ .../znpt/domain/entity/ProjectEntity.java | 58 ++++ .../znpt/domain/entity/TCompanyEntity.java | 37 +++ .../domain/entity/TConstructionEntity.java | 70 +++++ .../znpt/domain/entity/TurbineEntity.java | 33 +++ .../znpt/domain/entity/WeatherTypeEntity.java | 37 +++ .../com/dite/znpt/domain/page/PageDomain.java | 67 +++++ .../dite/znpt/domain/page/TableSupport.java | 74 +++++ .../znpt/domain/vo/CombinedDictListReq.java | 42 +++ .../dite/znpt/domain/vo/CombinedDictResp.java | 18 ++ .../dite/znpt/domain/vo/DefectListReq.java | 55 ++++ .../com/dite/znpt/domain/vo/DefectResp.java | 19 ++ .../dite/znpt/domain/vo/FileInfoListReq.java | 33 +++ .../com/dite/znpt/domain/vo/FileInfoResp.java | 18 ++ .../dite/znpt/domain/vo/PersonnelListReq.java | 39 +++ .../dite/znpt/domain/vo/PersonnelResp.java | 18 ++ .../znpt/domain/vo/ProjectCompanyListReq.java | 33 +++ .../znpt/domain/vo/ProjectCompanyResp.java | 18 ++ .../dite/znpt/domain/vo/ProjectListReq.java | 48 ++++ .../com/dite/znpt/domain/vo/ProjectResp.java | 18 ++ .../dite/znpt/domain/vo/TCompanyListReq.java | 33 +++ .../com/dite/znpt/domain/vo/TCompanyResp.java | 18 ++ .../znpt/domain/vo/TConstructionListReq.java | 58 ++++ .../znpt/domain/vo/TConstructionResp.java | 19 ++ .../dite/znpt/domain/vo/TurbineListReq.java | 30 ++ .../com/dite/znpt/domain/vo/TurbineResp.java | 18 ++ .../znpt/domain/vo/WeatherTypeListReq.java | 33 +++ .../dite/znpt/domain/vo/WeatherTypeResp.java | 18 ++ .../RestResponseEntityExceptionHandler.java | 51 ++++ .../dite/znpt/exception/ServiceException.java | 15 + .../dite/znpt/mapper/CombinedDictMapper.java | 19 ++ .../com/dite/znpt/mapper/DefectMapper.java | 19 ++ .../com/dite/znpt/mapper/FileInfoMapper.java | 19 ++ .../com/dite/znpt/mapper/PersonnelMapper.java | 19 ++ .../znpt/mapper/ProjectCompanyMapper.java | 19 ++ .../com/dite/znpt/mapper/ProjectMapper.java | 19 ++ .../com/dite/znpt/mapper/TCompanyMapper.java | 19 ++ .../dite/znpt/mapper/TConstructionMapper.java | 19 ++ .../com/dite/znpt/mapper/TurbineMapper.java | 19 ++ .../dite/znpt/mapper/WeatherTypeMapper.java | 19 ++ .../znpt/service/CombinedDictService.java | 65 +++++ .../com/dite/znpt/service/DefectService.java | 65 +++++ .../dite/znpt/service/FileInfoService.java | 65 +++++ .../dite/znpt/service/PersonnelService.java | 65 +++++ .../znpt/service/ProjectCompanyService.java | 65 +++++ .../com/dite/znpt/service/ProjectService.java | 65 +++++ .../dite/znpt/service/TCompanyService.java | 65 +++++ .../znpt/service/TConstructionService.java | 65 +++++ .../com/dite/znpt/service/TurbineService.java | 65 +++++ .../dite/znpt/service/WeatherTypeService.java | 65 +++++ .../service/impl/CombinedDictServiceImpl.java | 100 +++++++ .../znpt/service/impl/DefectServiceImpl.java | 100 +++++++ .../service/impl/FileInfoServiceImpl.java | 100 +++++++ .../service/impl/PersonnelServiceImpl.java | 100 +++++++ .../impl/ProjectCompanyServiceImpl.java | 100 +++++++ .../znpt/service/impl/ProjectServiceImpl.java | 100 +++++++ .../service/impl/TCompanyServiceImpl.java | 100 +++++++ .../impl/TConstructionServiceImpl.java | 100 +++++++ .../znpt/service/impl/TurbineServiceImpl.java | 100 +++++++ .../service/impl/WeatherTypeServiceImpl.java | 100 +++++++ .../java/com/dite/znpt/util/PageUtil.java | 25 ++ .../java/com/dite/znpt/util/PasswordUtil.java | 16 ++ .../main/java/com/dite/znpt/util/SqlUtil.java | 36 +++ demo/src/main/resources/application-dev.yml | 89 ++++++ demo/src/main/resources/application.yml | 20 ++ .../resources/mapper/CombinedDictMapper.xml | 39 +++ .../main/resources/mapper/DefectMapper.xml | 52 ++++ .../main/resources/mapper/FileInfoMapper.xml | 29 ++ .../main/resources/mapper/PersonnelMapper.xml | 36 +++ .../resources/mapper/ProjectCompanyMapper.xml | 29 ++ .../main/resources/mapper/ProjectMapper.xml | 45 +++ .../main/resources/mapper/TCompanyMapper.xml | 29 ++ .../resources/mapper/TConstructionMapper.xml | 55 ++++ .../main/resources/mapper/TurbineMapper.xml | 26 ++ .../resources/mapper/WeatherTypeMapper.xml | 29 ++ .../example/demo/DiteApplicationTests.java | 13 + 107 files changed, 5399 insertions(+) create mode 100644 demo/.gitattributes create mode 100644 demo/.gitignore create mode 100644 demo/.mvn/wrapper/maven-wrapper.properties create mode 100644 demo/mvnw create mode 100644 demo/mvnw.cmd create mode 100644 demo/pom.xml create mode 100644 demo/src/main/java/com/dite/znpt/DiteApplication.java create mode 100644 demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java create mode 100644 demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java create mode 100644 demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java create mode 100644 demo/src/main/java/com/dite/znpt/config/JacksonConfig.java create mode 100644 demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java create mode 100644 demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java create mode 100644 demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/DefectController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/FileInfoController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/PersonnelController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/ProjectController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/TCompanyController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/TConstructionController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/TurbineController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/Constants.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/Result.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java create mode 100644 demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java create mode 100644 demo/src/main/java/com/dite/znpt/exception/ServiceException.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/service/CombinedDictService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/DefectService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/FileInfoService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/PersonnelService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/ProjectService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/TCompanyService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/TConstructionService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/TurbineService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/util/PageUtil.java create mode 100644 demo/src/main/java/com/dite/znpt/util/PasswordUtil.java create mode 100644 demo/src/main/java/com/dite/znpt/util/SqlUtil.java create mode 100644 demo/src/main/resources/application-dev.yml create mode 100644 demo/src/main/resources/application.yml create mode 100644 demo/src/main/resources/mapper/CombinedDictMapper.xml create mode 100644 demo/src/main/resources/mapper/DefectMapper.xml create mode 100644 demo/src/main/resources/mapper/FileInfoMapper.xml create mode 100644 demo/src/main/resources/mapper/PersonnelMapper.xml create mode 100644 demo/src/main/resources/mapper/ProjectCompanyMapper.xml create mode 100644 demo/src/main/resources/mapper/ProjectMapper.xml create mode 100644 demo/src/main/resources/mapper/TCompanyMapper.xml create mode 100644 demo/src/main/resources/mapper/TConstructionMapper.xml create mode 100644 demo/src/main/resources/mapper/TurbineMapper.xml create mode 100644 demo/src/main/resources/mapper/WeatherTypeMapper.xml create mode 100644 demo/src/test/java/com/example/demo/DiteApplicationTests.java diff --git a/demo/.gitattributes b/demo/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/demo/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/demo/.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/ diff --git a/demo/.mvn/wrapper/maven-wrapper.properties b/demo/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/demo/.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 diff --git a/demo/mvnw b/demo/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/demo/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-,maven-mvnd--}/ +[ -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 "$@" diff --git a/demo/mvnw.cmd b/demo/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/demo/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-,maven-mvnd--}/ +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" diff --git a/demo/pom.xml b/demo/pom.xml new file mode 100644 index 0000000..7202b1a --- /dev/null +++ b/demo/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + com.dite + znpt + 0.0.1-SNAPSHOT + znpt + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-crypto + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.11 + + + io.springfox + springfox-boot-starter + 3.0.0 + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + + + com.baomidou + mybatis-plus-generator + 3.5.11 + + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + + com.alibaba + druid-spring-boot-starter + 1.2.22 + + + + org.springframework + spring-jdbc + + + + + org.freemarker + freemarker + + + + org.springframework + spring-tx + + + cn.hutool + hutool-all + 5.8.22 + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.7 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 8 + 8 + + + + + + diff --git a/demo/src/main/java/com/dite/znpt/DiteApplication.java b/demo/src/main/java/com/dite/znpt/DiteApplication.java new file mode 100644 index 0000000..1ec3ff9 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/DiteApplication.java @@ -0,0 +1,18 @@ +package com.dite.znpt; + +import cn.hutool.extra.spring.EnableSpringUtil; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@MapperScan("com.dite.znpt.mapper") +@EnableSpringUtil +public class DiteApplication { + + public static void main(String[] args) { + SpringApplication.run(DiteApplication.class, args); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java b/demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java new file mode 100644 index 0000000..b11acd8 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java @@ -0,0 +1,82 @@ +package com.dite.znpt.aspect; + +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * @date 2022/1/4 7:39 上午 + * @description: + */ +@Slf4j +@Aspect +@Component +public class HttpLogAspect { + + /** + * 换行符 + */ + private static final String LINE_SEPARATOR = System.lineSeparator(); + + /** + * 自定义切点 + */ + @Pointcut("execution(* com.dite.*.controller.*.*(..)) ") + public void log() { + } + + /** + * 在切点之前织入 + * + * @param joinPoint + */ + @Before("log()") + public void doBefore(JoinPoint joinPoint) throws Exception { + + // 开始打印请求日志 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + // 打印请求相关参数 + log.info("\n=============== Start ==================="); + // 打印请求 url + log.info("请求路径 : {}", request.getRequestURL().toString()); + // 打印 Http method + log.info("请求方法 : {}", request.getMethod()); + // 打印调用 controller 的全路径以及执行方法 + log.info("调用方法 : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); + //获取传入目标方法的参数 + log.info("请求参数 : {}", JSONUtil.toJsonStr(joinPoint.getArgs())); + + } + + /** + * 环绕 + * + * @param proceedingJoinPoint + * @return + * @throws Throwable + */ + @Around("log()") + public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + long startTime = System.currentTimeMillis(); + Object result = proceedingJoinPoint.proceed(); + // 打印出参 + log.info("响应结果 : {}", JSONUtil.toJsonStr(result)); + // 执行耗时 + log.info("请求耗时 : {} ms", System.currentTimeMillis() - startTime); + + log.info("\n=========================================== End ===========================================" + LINE_SEPARATOR); + return result; + } + +} diff --git a/demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java b/demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java new file mode 100644 index 0000000..c759a00 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java @@ -0,0 +1,49 @@ +package com.dite.znpt.config; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; +import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; + +@Configuration +public class BeanPostProcessorConfig { + + @Bean + public BeanPostProcessor beanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + handlerMappings(getHandlerMappings(bean)); + } + return bean; + } + + private void handlerMappings(List mappings) { + List copy = mappings.stream() + .filter(mapping -> mapping.getPatternParser() == null) + .collect(Collectors.toList()); + mappings.clear(); + mappings.addAll(copy); + } + + private List getHandlerMappings(Object bean) { + try { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + field.setAccessible(true); + return (List) field.get(bean); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + }; + } +} diff --git a/demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java b/demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java new file mode 100644 index 0000000..364e2c3 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java @@ -0,0 +1,32 @@ +package com.dite.znpt.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + + +/** + * @date 2023/4/5 11:30 + * @description: 全局过滤器 + */ +@Configuration +public class GlobalCorsConfig { + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + //允许所有域名进行跨域调用 + config.addAllowedOriginPattern("*");//替换这个 + //允许跨越发送cookie + config.setAllowCredentials(true); + //放行全部原始头信息 + config.addAllowedHeader("*"); + //允许所有请求方法跨域调用 + config.addAllowedMethod("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} diff --git a/demo/src/main/java/com/dite/znpt/config/JacksonConfig.java b/demo/src/main/java/com/dite/znpt/config/JacksonConfig.java new file mode 100644 index 0000000..2ac506a --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/JacksonConfig.java @@ -0,0 +1,31 @@ +package com.dite.znpt.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; + +/** + * @date 2022/3/20 10:34 上午 + * @description: + */ +@Configuration +public class JacksonConfig { + + @Bean + @Primary + @ConditionalOnMissingBean(ObjectMapper.class) + public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + // 全局配置序列化返回 JSON 处理 + SimpleModule simpleModule = new SimpleModule(); + //JSON Long ==> String + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + objectMapper.registerModule(simpleModule); + return objectMapper; + } +} diff --git a/demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java b/demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java new file mode 100644 index 0000000..31f54d8 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java @@ -0,0 +1,76 @@ +//package com.dite.znpt.configuration; +// +//import cn.dev33.satoken.config.SaTokenConfig; +//import cn.dev33.satoken.context.SaHolder; +//import cn.dev33.satoken.exception.NotLoginException; +//import cn.dev33.satoken.filter.SaServletFilter; +//import cn.dev33.satoken.interceptor.SaInterceptor; +//import cn.dev33.satoken.stp.StpUtil; +//import cn.dev33.satoken.util.SaResult; +//import cn.hutool.extra.spring.SpringUtil; +//import com.gaea.common.common.constants.Constants; +//import com.gaea.common.common.enums.CommonEOS; +//import com.gaea.data.base.context.UserContext; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; +//import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +///** +// * @description: Sa-Token 权限认证 配置类 +// */ +//@Slf4j +//@Configuration +//public class SaTokenConfigure implements WebMvcConfigurer { +// +// @Value("${spring.profiles.active}") +// private String profile; +// +// /** +// * @author wujinsong +// * @date 2021/11/20 9:22 下午 +// * @description: 注册 Sa-Token 全局过滤器 +// * @Param [] +// * @Return cn.dev33.satoken.filter.SaServletFilter +// */ +// @Bean +// public SaServletFilter getSaServletFilter() { +// +// return new SaServletFilter().addInclude("/**").addExclude("/favicon.ico", "/user/login").setAuth(obj -> { +// // 校验 Id-Token 身份凭证 +// if (!Constants.PROFILE_DEV.equals(profile)) { +//// StpUtil.checkLogin(); +// boolean isLogin = SpringUtil.getBean(UserContext.class).checkLogin(); +// if (!isLogin) { +// throw NotLoginException.newInstance(StpUtil.TYPE, NotLoginException.NOT_TOKEN); +// } +// } +// }).setError(e -> { +// SaHolder.getResponse().setHeader("Content-Type", "application/json; charset=utf-8"); +// return SaResult.error(CommonEOS.E25000007.getName()); +// }); +// } +// +// @Bean +// @Primary +// public SaTokenConfig getSaTokenConfigPrimary() { +// SaTokenConfig config = new SaTokenConfig(); +// config.setTokenName("satoken"); +// config.setActivityTimeout(6000 * 30); +// config.setIsConcurrent(true); +// config.setIsShare(true); +// config.setTokenStyle("uuid"); +// config.setIsLog(false); +// return config; +// } +// +// // 注册Sa-Token的注解拦截器,打开注解式鉴权功能 +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// // 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关) +// registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**").excludePathPatterns("/favicon.ico", "/user/login"); +// } +//} diff --git a/demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java b/demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java new file mode 100644 index 0000000..5f30e05 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java @@ -0,0 +1,53 @@ +package com.dite.znpt.config; + + +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.builders.RequestParameterBuilder; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ParameterType; +import springfox.documentation.service.RequestParameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; +import java.util.List; + +@Configuration +@EnableOpenApi +public class SwaggerConfig { + + @Bean + public Docket docket() { + RequestParameterBuilder parameterBuilder = new RequestParameterBuilder(); + List parameters = new ArrayList<>(); + parameterBuilder.name("Authorization") + .description("token值") + .in(ParameterType.HEADER) +// todo 暂时设置为false,后续上登录后需要开启 + .required(false) + .build(); + parameters.add(parameterBuilder.build()); + return new Docket(DocumentationType.OAS_30) + .apiInfo(apiInfo()) + .enable(true)//开启Swagger文档 + .select() + .apis(RequestHandlerSelectors.basePackage("com.dite")) + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .paths(PathSelectors.any()) + .build() + .globalRequestParameters(parameters); + } + + public ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("智能平台") + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java new file mode 100644 index 0000000..ce50e9b --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -0,0 +1,25 @@ +package com.dite.znpt.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +@Configuration +public class WebMvcConfig extends WebMvcConfigurationSupport { + /** + * MVC 加载Swagger静态资源 + * @param registry + */ + @Override + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + super.addResourceHandlers(registry); + } +} \ No newline at end of file diff --git a/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java b/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java new file mode 100644 index 0000000..65cbab0 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.CombinedDictListReq; +import com.dite.znpt.domain.vo.CombinedDictResp; +import com.dite.znpt.domain.entity.CombinedDictEntity; +import com.dite.znpt.service.CombinedDictService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "字典") +@RestController +@RequestMapping("/combined-dict") +public class CombinedDictController { + @Resource + private CombinedDictService combinedDictService; + + @ApiOperation(value = "获取字典列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(CombinedDictListReq combinedDictReq) { + PageInfo page = combinedDictService.selectList(combinedDictReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据字典Id获取详细信息", httpMethod = "GET") + @GetMapping("/{dictId}") + public Result getInfo(@PathVariable String dictId) { + return Result.ok(combinedDictService.selectById(dictId)); + } + + @ApiOperation(value = "新增字典", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody CombinedDictEntity combinedDict) { + combinedDictService.saveData(combinedDict); + return Result.ok(); + } + + @ApiOperation(value = "修改字典", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody CombinedDictEntity combinedDict) { + combinedDictService.updateData(combinedDict); + return Result.ok(); + } + + @ApiOperation(value = "删除字典", httpMethod = "DELETE") + @DeleteMapping("/{dictId}") + public Result remove(@PathVariable String dictId) { + combinedDictService.deleteById(dictId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/DefectController.java b/demo/src/main/java/com/dite/znpt/controller/DefectController.java new file mode 100644 index 0000000..a07d624 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/DefectController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.service.DefectService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "缺陷记录") +@RestController +@RequestMapping("/defect") +public class DefectController { + @Resource + private DefectService defectService; + + @ApiOperation(value = "获取缺陷记录列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(DefectListReq defectReq) { + PageInfo page = defectService.selectList(defectReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据缺陷记录Id获取详细信息", httpMethod = "GET") + @GetMapping("/{defectId}") + public Result getInfo(@PathVariable String defectId) { + return Result.ok(defectService.selectById(defectId)); + } + + @ApiOperation(value = "新增缺陷记录", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody DefectEntity defect) { + defectService.saveData(defect); + return Result.ok(); + } + + @ApiOperation(value = "修改缺陷记录", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody DefectEntity defect) { + defectService.updateData(defect); + return Result.ok(); + } + + @ApiOperation(value = "删除缺陷记录", httpMethod = "DELETE") + @DeleteMapping("/{defectId}") + public Result remove(@PathVariable String defectId) { + defectService.deleteById(defectId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java b/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java new file mode 100644 index 0000000..9ae3a51 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.FileInfoListReq; +import com.dite.znpt.domain.vo.FileInfoResp; +import com.dite.znpt.domain.entity.FileInfoEntity; +import com.dite.znpt.service.FileInfoService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "文件信息") +@RestController +@RequestMapping("/file-info") +public class FileInfoController { + @Resource + private FileInfoService fileInfoService; + + @ApiOperation(value = "获取文件信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(FileInfoListReq fileInfoReq) { + PageInfo page = fileInfoService.selectList(fileInfoReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据文件信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{fileId}") + public Result getInfo(@PathVariable Long fileId) { + return Result.ok(fileInfoService.selectById(fileId)); + } + + @ApiOperation(value = "新增文件信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody FileInfoEntity fileInfo) { + fileInfoService.saveData(fileInfo); + return Result.ok(); + } + + @ApiOperation(value = "修改文件信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody FileInfoEntity fileInfo) { + fileInfoService.updateData(fileInfo); + return Result.ok(); + } + + @ApiOperation(value = "删除文件信息", httpMethod = "DELETE") + @DeleteMapping("/{fileId}") + public Result remove(@PathVariable Long fileId) { + fileInfoService.deleteById(fileId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java b/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java new file mode 100644 index 0000000..eb1793b --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.PersonnelListReq; +import com.dite.znpt.domain.vo.PersonnelResp; +import com.dite.znpt.domain.entity.PersonnelEntity; +import com.dite.znpt.service.PersonnelService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "人员信息") +@RestController +@RequestMapping("/personnel") +public class PersonnelController { + @Resource + private PersonnelService personnelService; + + @ApiOperation(value = "获取人员信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(PersonnelListReq personnelReq) { + PageInfo page = personnelService.selectList(personnelReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据人员信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{personId}") + public Result getInfo(@PathVariable String personId) { + return Result.ok(personnelService.selectById(personId)); + } + + @ApiOperation(value = "新增人员信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody PersonnelEntity personnel) { + personnelService.saveData(personnel); + return Result.ok(); + } + + @ApiOperation(value = "修改人员信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody PersonnelEntity personnel) { + personnelService.updateData(personnel); + return Result.ok(); + } + + @ApiOperation(value = "删除人员信息", httpMethod = "DELETE") + @DeleteMapping("/{personId}") + public Result remove(@PathVariable String personId) { + personnelService.deleteById(personId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java b/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java new file mode 100644 index 0000000..d1291c6 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.ProjectCompanyListReq; +import com.dite.znpt.domain.vo.ProjectCompanyResp; +import com.dite.znpt.domain.entity.ProjectCompanyEntity; +import com.dite.znpt.service.ProjectCompanyService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "项目-公司关联信息") +@RestController +@RequestMapping("/project-company") +public class ProjectCompanyController { + @Resource + private ProjectCompanyService projectCompanyService; + + @ApiOperation(value = "获取项目-公司关联信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(ProjectCompanyListReq projectCompanyReq) { + PageInfo page = projectCompanyService.selectList(projectCompanyReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据项目-公司关联信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{projectId}") + public Result getInfo(@PathVariable String projectId) { + return Result.ok(projectCompanyService.selectById(projectId)); + } + + @ApiOperation(value = "新增项目-公司关联信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody ProjectCompanyEntity projectCompany) { + projectCompanyService.saveData(projectCompany); + return Result.ok(); + } + + @ApiOperation(value = "修改项目-公司关联信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody ProjectCompanyEntity projectCompany) { + projectCompanyService.updateData(projectCompany); + return Result.ok(); + } + + @ApiOperation(value = "删除项目-公司关联信息", httpMethod = "DELETE") + @DeleteMapping("/{projectId}") + public Result remove(@PathVariable String projectId) { + projectCompanyService.deleteById(projectId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectController.java b/demo/src/main/java/com/dite/znpt/controller/ProjectController.java new file mode 100644 index 0000000..0ed400d --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/ProjectController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectResp; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "项目信息") +@RestController +@RequestMapping("/project") +public class ProjectController { + @Resource + private ProjectService projectService; + + @ApiOperation(value = "获取项目信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(ProjectListReq projectReq) { + PageInfo page = projectService.selectList(projectReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据项目信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{projectId}") + public Result getInfo(@PathVariable String projectId) { + return Result.ok(projectService.selectById(projectId)); + } + + @ApiOperation(value = "新增项目信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody ProjectEntity project) { + projectService.saveData(project); + return Result.ok(); + } + + @ApiOperation(value = "修改项目信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody ProjectEntity project) { + projectService.updateData(project); + return Result.ok(); + } + + @ApiOperation(value = "删除项目信息", httpMethod = "DELETE") + @DeleteMapping("/{projectId}") + public Result remove(@PathVariable String projectId) { + projectService.deleteById(projectId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java b/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java new file mode 100644 index 0000000..3530904 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.TCompanyListReq; +import com.dite.znpt.domain.vo.TCompanyResp; +import com.dite.znpt.domain.entity.TCompanyEntity; +import com.dite.znpt.service.TCompanyService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "公司信息") +@RestController +@RequestMapping("/t-company") +public class TCompanyController { + @Resource + private TCompanyService tCompanyService; + + @ApiOperation(value = "获取公司信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(TCompanyListReq tCompanyReq) { + PageInfo page = tCompanyService.selectList(tCompanyReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据公司信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{companyId}") + public Result getInfo(@PathVariable String companyId) { + return Result.ok(tCompanyService.selectById(companyId)); + } + + @ApiOperation(value = "新增公司信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody TCompanyEntity tCompany) { + tCompanyService.saveData(tCompany); + return Result.ok(); + } + + @ApiOperation(value = "修改公司信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody TCompanyEntity tCompany) { + tCompanyService.updateData(tCompany); + return Result.ok(); + } + + @ApiOperation(value = "删除公司信息", httpMethod = "DELETE") + @DeleteMapping("/{companyId}") + public Result remove(@PathVariable String companyId) { + tCompanyService.deleteById(companyId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java b/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java new file mode 100644 index 0000000..4742d4c --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionResp; +import com.dite.znpt.domain.entity.TConstructionEntity; +import com.dite.znpt.service.TConstructionService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "施工信息") +@RestController +@RequestMapping("/t-construction") +public class TConstructionController { + @Resource + private TConstructionService tConstructionService; + + @ApiOperation(value = "获取施工信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(TConstructionListReq tConstructionReq) { + PageInfo page = tConstructionService.selectList(tConstructionReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据施工信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{constructionId}") + public Result getInfo(@PathVariable String constructionId) { + return Result.ok(tConstructionService.selectById(constructionId)); + } + + @ApiOperation(value = "新增施工信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody TConstructionEntity tConstruction) { + tConstructionService.saveData(tConstruction); + return Result.ok(); + } + + @ApiOperation(value = "修改施工信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody TConstructionEntity tConstruction) { + tConstructionService.updateData(tConstruction); + return Result.ok(); + } + + @ApiOperation(value = "删除施工信息", httpMethod = "DELETE") + @DeleteMapping("/{constructionId}") + public Result remove(@PathVariable String constructionId) { + tConstructionService.deleteById(constructionId); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/TurbineController.java b/demo/src/main/java/com/dite/znpt/controller/TurbineController.java new file mode 100644 index 0000000..8769745 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/TurbineController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.TurbineListReq; +import com.dite.znpt.domain.vo.TurbineResp; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.service.TurbineService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "机组-项目关联") +@RestController +@RequestMapping("/turbine") +public class TurbineController { + @Resource + private TurbineService turbineService; + + @ApiOperation(value = "获取机组-项目关联列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(TurbineListReq turbineReq) { + PageInfo page = turbineService.selectList(turbineReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据机组-项目关联Id获取详细信息", httpMethod = "GET") + @GetMapping("/{turbineCode}") + public Result getInfo(@PathVariable String turbineCode) { + return Result.ok(turbineService.selectById(turbineCode)); + } + + @ApiOperation(value = "新增机组-项目关联", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody TurbineEntity turbine) { + turbineService.saveData(turbine); + return Result.ok(); + } + + @ApiOperation(value = "修改机组-项目关联", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody TurbineEntity turbine) { + turbineService.updateData(turbine); + return Result.ok(); + } + + @ApiOperation(value = "删除机组-项目关联", httpMethod = "DELETE") + @DeleteMapping("/{turbineCode}") + public Result remove(@PathVariable String turbineCode) { + turbineService.deleteById(turbineCode); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java b/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java new file mode 100644 index 0000000..f96fdc7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.vo.WeatherTypeListReq; +import com.dite.znpt.domain.vo.WeatherTypeResp; +import com.dite.znpt.domain.entity.WeatherTypeEntity; +import com.dite.znpt.service.WeatherTypeService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import com.github.pagehelper.PageInfo; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 14:37 + */ +@Api(tags = "天气类型") +@RestController +@RequestMapping("/weather-type") +public class WeatherTypeController { + @Resource + private WeatherTypeService weatherTypeService; + + @ApiOperation(value = "获取天气类型列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(WeatherTypeListReq weatherTypeReq) { + PageInfo page = weatherTypeService.selectList(weatherTypeReq); + return Result.ok(page); + } + + @ApiOperation(value = "根据天气类型Id获取详细信息", httpMethod = "GET") + @GetMapping("/{weatherCode}") + public Result getInfo(@PathVariable String weatherCode) { + return Result.ok(weatherTypeService.selectById(weatherCode)); + } + + @ApiOperation(value = "新增天气类型", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody WeatherTypeEntity weatherType) { + weatherTypeService.saveData(weatherType); + return Result.ok(); + } + + @ApiOperation(value = "修改天气类型", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody WeatherTypeEntity weatherType) { + weatherTypeService.updateData(weatherType); + return Result.ok(); + } + + @ApiOperation(value = "删除天气类型", httpMethod = "DELETE") + @DeleteMapping("/{weatherCode}") + public Result remove(@PathVariable String weatherCode) { + weatherTypeService.deleteById(weatherCode); + return Result.ok(); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java new file mode 100644 index 0000000..b4da55a --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -0,0 +1,43 @@ +package com.dite.znpt.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * @description: 统一定义顶层Entity实体审计 基类 + * 基类统一定义id的属性名称、数据类型、列名映射及生成策略. + */ +@AllArgsConstructor +@NoArgsConstructor +@Data +@SuperBuilder(toBuilder = true) +public class AuditableEntity implements Serializable { + private static final long serialVersionUID = 141481953116476081L; + +// @ApiParam(hidden = true) +// private String createBy; +// +// @ApiParam(hidden = true) +// private String updateBy; +// +// @ApiModelProperty(value = "创建时间", example = "2022-01-22", notes = "创建时间", hidden = true) +// private Date createTime; +// +// @ApiModelProperty(hidden = true) +// private Date updateTime; + + @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") + private List idList; + + @ApiModelProperty(value = "当前页", example = "1", notes = "0") + int page = 1; + + @ApiModelProperty(value = "页大小", example = "10", notes = "10") + int pageSize = 10; +} diff --git a/demo/src/main/java/com/dite/znpt/domain/Constants.java b/demo/src/main/java/com/dite/znpt/domain/Constants.java new file mode 100644 index 0000000..c005435 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/Constants.java @@ -0,0 +1,24 @@ +package com.dite.znpt.domain; + +/** + * @description: 常量 + */ +public class Constants { + + /** + * 系统异常 + */ + public static final String SYSTEM_EXCEPTION = "000001"; + + /** + * 服务异常 + */ + public static final String SERVICE_EXCEPTION = "000003"; + + public static final String SERVICE_EXCEPTION_MESSAGE = "服务开小差,请稍后再试!"; + + /** + * 参数异常 + */ + public static final String PARAMETER_EXCEPTION = "000004"; +} diff --git a/demo/src/main/java/com/dite/znpt/domain/Result.java b/demo/src/main/java/com/dite/znpt/domain/Result.java new file mode 100644 index 0000000..817b728 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/Result.java @@ -0,0 +1,67 @@ +package com.dite.znpt.domain; + +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; + +import java.io.Serializable; + +/** + * @description: 返回结果 + */ +@Data +public class Result implements Serializable { + private static final Logger LOGGER = LoggerFactory.getLogger(Result.class); + private static final String SUCCESS = "success"; + private static final Integer SUCCESS_CODE = 200; + + private int status; + + private T data; + + private String msg; + + private Integer code; + + public Result(HttpStatus status, T data, Integer code, String msg) { + this.status = status.value(); + this.data = data; + this.code = code; + this.msg = msg; + } + + public boolean isSuccess() { + return this.getCode().equals(SUCCESS_CODE); + } + + public static Result okM(String msg) { + return new Result<>(HttpStatus.OK, null, SUCCESS_CODE, msg); + } + + public static Result ok() { + return new Result<>(HttpStatus.OK, null, SUCCESS_CODE, StringUtils.EMPTY); + } + + public static Result okM(T t, String msg) { + return new Result<>(HttpStatus.OK, t, SUCCESS_CODE, msg); + } + + public static Result ok(T t) { + return new Result<>(HttpStatus.OK, t, SUCCESS_CODE, StringUtils.EMPTY); + } + + public static Result okTrue() { + return new Result(HttpStatus.OK, Boolean.TRUE, SUCCESS_CODE, StringUtils.EMPTY); + } + + public static Result okFalse() { + return new Result(HttpStatus.OK, Boolean.FALSE, SUCCESS_CODE, StringUtils.EMPTY); + } + + public static Result warn(String code, String msg) { + return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(code), msg); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java new file mode 100644 index 0000000..d982ea4 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java @@ -0,0 +1,49 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 字典表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("combined_dict") +@ApiModel(value="CombinedDictEntity对象", description="字典表") +public class CombinedDictEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -40324154726527318L; + + @ApiModelProperty("字典id") + @TableId(value = "dict_id", type = IdType.ASSIGN_ID) + private String dictId; + + @ApiModelProperty("字典类型") + @TableField("dict_type") + private String dictType; + + @ApiModelProperty("字典名称") + @TableField("dict_name") + private String dictName; + + @ApiModelProperty("父级id") + @TableField("parent_id") + private Long parentId; + + @ApiModelProperty("字典排序") + @TableField("sort_order") + private Integer sortOrder; + + @ApiModelProperty("是否字典终值") + @TableField("final_state") + private Integer finalState; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java new file mode 100644 index 0000000..f3ad703 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -0,0 +1,66 @@ +package com.dite.znpt.domain.entity; + +import java.math.BigDecimal; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 缺陷记录表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("defect") +@ApiModel(value="DefectEntity对象", description="缺陷记录表") +public class DefectEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -74938532938992308L; + + @ApiModelProperty("缺陷id") + @TableId(value = "defect_id", type = IdType.ASSIGN_ID) + private String defectId; + + @ApiModelProperty("机组id") + @TableField("turbine_code") + private String turbineCode; + + @ApiModelProperty("叶片号") + @TableField("blade_code") + private String bladeCode; + + @ApiModelProperty("损伤面,字典surface_type") + @TableField("surface_type") + private String surfaceType; + + @ApiModelProperty("缺陷类型,字典defect_type") + @TableField("defect_type") + private String defectType; + + @ApiModelProperty("危重等级,字典defect_level") + @TableField("defect_level") + private String defectLevel; + + @ApiModelProperty("轴向长度(mm)") + @TableField("axial_length") + private BigDecimal axialLength; + + @ApiModelProperty("弦向长度(mm)") + @TableField("chord_length") + private BigDecimal chordLength; + + @ApiModelProperty("处理建议") + @TableField("image_path") + private String imagePath; + + @ApiModelProperty("图片详情") + @TableField("image_hash") + private String imageHash; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java new file mode 100644 index 0000000..de8f9c5 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 文件信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("file_info") +@ApiModel(value="FileInfoEntity对象", description="文件信息表") +public class FileInfoEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 102386713213268589L; + + @ApiModelProperty("文件id") + @TableId(value = "file_id", type = IdType.ASSIGN_ID) + private Long fileId; + + @ApiModelProperty("业务id") + @TableField("business_id") + private String businessId; + + @ApiModelProperty("minio相对路径") + @TableField("minio_path") + private String minioPath; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java new file mode 100644 index 0000000..d1da33f --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 人员信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("personnel") +@ApiModel(value="PersonnelEntity对象", description="人员信息表") +public class PersonnelEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 351217700568175283L; + + @ApiModelProperty("用户名") + @TableId(value = "person_id", type = IdType.ASSIGN_ID) + private String personId; + + @ApiModelProperty("姓名") + @TableField("name") + private String name; + + @ApiModelProperty("角色类型,字典role_type") + @TableField("role_type") + private String roleType; + + @ApiModelProperty("公司id") + @TableField("company_id") + private String companyId; + + @ApiModelProperty("密码") + @TableField("password") + private String password; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java new file mode 100644 index 0000000..2f73946 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author sakura + * @date 2025/04/10 13:42 + * @Description: 项目-公司关联信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_company") +@ApiModel(value="ProjectCompanyEntity对象", description="项目-公司关联信息表") +public class ProjectCompanyEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 128834719624205451L; + + @ApiModelProperty("项目id") + @TableId(value = "project_id", type = IdType.ASSIGN_ID) + private String projectId; + + @ApiModelProperty("公司id") + @TableField("company_id") + private String companyId; + + @ApiModelProperty("单位类型(检查/委托)") + @TableField("relation_type") + private String relationType; +} \ No newline at end of file diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java new file mode 100644 index 0000000..2821ca2 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -0,0 +1,58 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author sakura + * @date 2025/04/10 13:31 + * @Description: 项目信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project") +@ApiModel(value="ProjectEntity对象", description="项目信息表") +public class ProjectEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 676511262353737882L; + + @ApiModelProperty("项目id") + @TableId(value = "project_id", type = IdType.ASSIGN_ID) + private String projectId; + + @ApiModelProperty("项目名称") + @TableField("project_name") + private String projectName; + + @ApiModelProperty("风场名称") + @TableField("farm_name") + private String farmName; + + @ApiModelProperty("风场地址") + @TableField("farm_address") + private String farmAddress; + + @ApiModelProperty("委托单位") + @TableField("client_id") + private String clientId; + + @ApiModelProperty("检查方式,字典method_id") + @TableField("method_id") + private String methodId; + + @ApiModelProperty("项目规模") + @TableField("scale") + private String scale; + + @ApiModelProperty("风机型号") + @TableField("turbine_model") + private String turbineModel; +} + + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java new file mode 100644 index 0000000..26c82fd --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 公司信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("t_company") +@ApiModel(value="TCompanyEntity对象", description="公司信息表") +public class TCompanyEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -72804777209522073L; + + @ApiModelProperty("公司id") + @TableId(value = "company_id", type = IdType.ASSIGN_ID) + private String companyId; + + @ApiModelProperty("公司名称") + @TableField("company_name") + private String companyName; + + @ApiModelProperty("公司地址") + @TableField("address") + private String address; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java new file mode 100644 index 0000000..23b1c0e --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java @@ -0,0 +1,70 @@ +package com.dite.znpt.domain.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author sakura + * @date 2025/04/10 13:35 + * @Description: 施工信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("t_construction") +@ApiModel(value="TConstructionEntity对象", description="施工信息表") +public class TConstructionEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 295094962841990277L; + + @ApiModelProperty("施工id") + @TableId(value = "construction_id", type = IdType.ASSIGN_ID) + private String constructionId; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ApiModelProperty("机组id") + @TableField("turbine_code") + private String turbineCode; + + @ApiModelProperty("作业开始时间") + @TableField("start_time") + private LocalDateTime startTime; + + @ApiModelProperty("作业结束时间") + @TableField("end_time") + private LocalDateTime endTime; + + @ApiModelProperty("温度(℃)") + @TableField("temperature") + private Double temperature; + + @ApiModelProperty("风速(m/s)") + @TableField("wind_speed") + private Double windSpeed; + + @ApiModelProperty("采集图片数量") + @TableField("image_count") + private Integer imageCount; + + @ApiModelProperty("天气id") + @TableField("weather_code") + private String weatherCode; + + @ApiModelProperty("施工状态") + @TableField("status_id") + private String statusId; + + @ApiModelProperty("当前时间") + @TableField("created_at") + private LocalDateTime createdAt; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java new file mode 100644 index 0000000..94efacf --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 机组-项目关联表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("turbine") +@ApiModel(value="TurbineEntity对象", description="机组-项目关联表") +public class TurbineEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -38088185643803512L; + + @ApiModelProperty("机组号") + @TableId(value = "turbine_code", type = IdType.ASSIGN_ID) + private String turbineCode; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java new file mode 100644 index 0000000..08cf9e7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 天气类型表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("weather_type") +@ApiModel(value="WeatherTypeEntity对象", description="天气类型表") +public class WeatherTypeEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 736371527640486906L; + + @ApiModelProperty("天气类型id") + @TableId(value = "weather_code", type = IdType.ASSIGN_ID) + private String weatherCode; + + @ApiModelProperty("天气类型中文描述") + @TableField("chinese_name") + private String chineseName; + + @ApiModelProperty("对施工进度的影响系数") + @TableField("impact_factor") + private Double impactFactor; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java b/demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java new file mode 100644 index 0000000..bcab0d1 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java @@ -0,0 +1,67 @@ +package com.dite.znpt.domain.page; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.util.Objects; + +/** + * 分页数据 + * + * @author kyland + */ +@Data +public class PageDomain { + /** + * 当前记录起始索引 + */ + private Integer pageNum; + + /** + * 每页显示记录数 + */ + private Integer pageSize; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc = "asc"; + + /** + * 分页参数合理化 + */ + private Boolean reasonable = true; + + public String getOrderBy() { + if (StrUtil.isEmpty(orderByColumn)) { + return ""; + } + return StrUtil.toUnderlineCase(orderByColumn) + " " + isAsc; + } + + public void setIsAsc(String isAsc) { + if (StrUtil.isNotEmpty(isAsc)) { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) { + isAsc = "asc"; + } else if ("descending".equals(isAsc)) { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public boolean getReasonable() { + return BooleanUtil.isTrue(reasonable)|| Objects.isNull(reasonable); + } + + public void setReasonable(Boolean reasonable) { + this.reasonable = reasonable; + } +} diff --git a/demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java b/demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java new file mode 100644 index 0000000..fd07849 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java @@ -0,0 +1,74 @@ +package com.dite.znpt.domain.page; + +import cn.hutool.core.convert.Convert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * 表格数据处理 + * + * @author kyland + */ +public class TableSupport { + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(getRequest().getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(getRequest().getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(getRequest().getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(getRequest().getParameter(IS_ASC)); + pageDomain.setReasonable(Convert.toBool(getRequest().getParameter(REASONABLE))); + return pageDomain; + } + + public static PageDomain buildPageRequest() { + return getPageDomain(); + } + + public static ServletRequestAttributes getRequestAttributes() { + try { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes)attributes; + } catch (Exception var1) { + return null; + } + } + + public static HttpServletRequest getRequest() { + try { + return getRequestAttributes().getRequest(); + } catch (Exception var1) { + return null; + } + } +} diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java new file mode 100644 index 0000000..147cce4 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java @@ -0,0 +1,42 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 字典请求实体 + */ +@Data +@ApiModel("字典列表请求实体") +public class CombinedDictListReq implements Serializable { + + private static final long serialVersionUID = 194796910937180049L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("字典Id") + private String dictId; + + @ApiModelProperty("字典类型") + private String dictType; + + @ApiModelProperty("字典名称") + private String dictName; + + @ApiModelProperty("父级id") + private Long parentId; + + @ApiModelProperty("字典排序") + private Integer sortOrder; + + @ApiModelProperty("是否字典终值") + private Integer finalState; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java new file mode 100644 index 0000000..45eb1db --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.CombinedDictEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 字典响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("字典响应实体") +public class CombinedDictResp extends CombinedDictEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java new file mode 100644 index 0000000..38a1802 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 缺陷记录请求实体 + */ +@Data +@ApiModel("缺陷记录列表请求实体") +public class DefectListReq implements Serializable { + + private static final long serialVersionUID = 692832532969251285L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("缺陷记录Id") + private String defectId; + + @ApiModelProperty("机组id") + private String turbineCode; + + @ApiModelProperty("叶片号") + private String bladeCode; + + @ApiModelProperty("损伤面,字典surface_type") + private String surfaceType; + + @ApiModelProperty("缺陷类型,字典defect_type") + private String defectType; + + @ApiModelProperty("危重等级,字典defect_level") + private String defectLevel; + + @ApiModelProperty("轴向长度(mm)") + private BigDecimal axialLength; + + @ApiModelProperty("弦向长度(mm)") + private BigDecimal chordLength; + + @ApiModelProperty("处理建议") + private String imagePath; + + @ApiModelProperty("图片详情") + private String imageHash; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java new file mode 100644 index 0000000..238214d --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.DefectEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 缺陷记录响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("缺陷记录响应实体") +public class DefectResp extends DefectEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java new file mode 100644 index 0000000..3fa10ac --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 文件信息请求实体 + */ +@Data +@ApiModel("文件信息列表请求实体") +public class FileInfoListReq implements Serializable { + + private static final long serialVersionUID = -78389740283645796L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("文件信息Id") + private Long fileId; + + @ApiModelProperty("业务id") + private String businessId; + + @ApiModelProperty("minio相对路径") + private String minioPath; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java new file mode 100644 index 0000000..7586540 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.FileInfoEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 文件信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("文件信息响应实体") +public class FileInfoResp extends FileInfoEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java new file mode 100644 index 0000000..35c0f7b --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 人员信息请求实体 + */ +@Data +@ApiModel("人员信息列表请求实体") +public class PersonnelListReq implements Serializable { + + private static final long serialVersionUID = -82418737525015596L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("人员信息Id") + private String personId; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("角色类型,字典role_type") + private String roleType; + + @ApiModelProperty("公司id") + private String companyId; + + @ApiModelProperty("密码") + private String password; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java new file mode 100644 index 0000000..77c50e4 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.PersonnelEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 人员信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("人员信息响应实体") +public class PersonnelResp extends PersonnelEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java new file mode 100644 index 0000000..14c37ef --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 项目-公司关联信息请求实体 + */ +@Data +@ApiModel("项目-公司关联信息列表请求实体") +public class ProjectCompanyListReq implements Serializable { + + private static final long serialVersionUID = -62483123283940291L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目-公司关联信息Id") + private String projectId; + + @ApiModelProperty("公司id") + private String companyId; + + @ApiModelProperty("关联类型") + private String relationType; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java new file mode 100644 index 0000000..d13ba5e --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ProjectCompanyEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 项目-公司关联信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目-公司关联信息响应实体") +public class ProjectCompanyResp extends ProjectCompanyEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java new file mode 100644 index 0000000..4cbf2b8 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -0,0 +1,48 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 项目信息请求实体 + */ +@Data +@ApiModel("项目信息列表请求实体") +public class ProjectListReq implements Serializable { + + private static final long serialVersionUID = -18175772339033037L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目信息Id") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("${column.comment}") + private String clientId; + + @ApiModelProperty("xx,字典xx") + private String methodId; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("风机型号") + private String turbineModel; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java new file mode 100644 index 0000000..ad8880a --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ProjectEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 项目信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目信息响应实体") +public class ProjectResp extends ProjectEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java new file mode 100644 index 0000000..b42ab31 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 公司信息请求实体 + */ +@Data +@ApiModel("公司信息列表请求实体") +public class TCompanyListReq implements Serializable { + + private static final long serialVersionUID = 948606394919949641L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("公司信息Id") + private String companyId; + + @ApiModelProperty("公司名称") + private String companyName; + + @ApiModelProperty("公司地址") + private String address; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java new file mode 100644 index 0000000..05eb171 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.TCompanyEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 公司信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("公司信息响应实体") +public class TCompanyResp extends TCompanyEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java new file mode 100644 index 0000000..b39bc7f --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java @@ -0,0 +1,58 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 施工信息请求实体 + */ +@Data +@ApiModel("施工信息列表请求实体") +public class TConstructionListReq implements Serializable { + + private static final long serialVersionUID = -21906313443453398L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("施工信息Id") + private String constructionId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组id") + private String turbineCode; + + @ApiModelProperty("作业开始时间") + private LocalDateTime startTime; + + @ApiModelProperty("作业结束时间") + private LocalDateTime endTime; + + @ApiModelProperty("温度(℃)") + private Double temperature; + + @ApiModelProperty("风速(m/s)") + private Double windSpeed; + + @ApiModelProperty("采集图片数量") + private Integer imageCount; + + @ApiModelProperty("天气id") + private String weatherCode; + + @ApiModelProperty("${column.comment}") + private String statusId; + + @ApiModelProperty("${column.comment}") + private LocalDateTime createdAt; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java new file mode 100644 index 0000000..41fe047 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.TConstructionEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 施工信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("施工信息响应实体") +public class TConstructionResp extends TConstructionEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java new file mode 100644 index 0000000..fa23a69 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java @@ -0,0 +1,30 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 机组-项目关联请求实体 + */ +@Data +@ApiModel("机组-项目关联列表请求实体") +public class TurbineListReq implements Serializable { + + private static final long serialVersionUID = -35973498612681953L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("机组-项目关联Id") + private String turbineCode; + + @ApiModelProperty("项目id") + private String projectId; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java new file mode 100644 index 0000000..f7d687e --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.TurbineEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 机组-项目关联响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("机组-项目关联响应实体") +public class TurbineResp extends TurbineEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java new file mode 100644 index 0000000..a3f49c7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 天气类型请求实体 + */ +@Data +@ApiModel("天气类型列表请求实体") +public class WeatherTypeListReq implements Serializable { + + private static final long serialVersionUID = 959320839630572326L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("天气类型Id") + private String weatherCode; + + @ApiModelProperty("天气类型中文描述") + private String chineseName; + + @ApiModelProperty("对施工进度的影响系数") + private Double impactFactor; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java new file mode 100644 index 0000000..7da231c --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.WeatherTypeEntity; + +/** + * @author huise23 + * @date 2025/04/09 14:39 + * @Description: 天气类型响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("天气类型响应实体") +public class WeatherTypeResp extends WeatherTypeEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java b/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java new file mode 100644 index 0000000..ed392ef --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java @@ -0,0 +1,51 @@ +package com.dite.znpt.exception; + +import com.dite.znpt.domain.Constants; +import com.dite.znpt.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestController; + +/** + * @description: 全局异常处理 + */ +@ControllerAdvice +@RestController +public class RestResponseEntityExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class); + + @ExceptionHandler(Exception.class) + public final Result handler(Exception e) { + logger.error("出现系统异常:{},异常类型:{},详细堆栈:", e.getMessage(), e.getClass(), e); + return Result.warn(Constants.SYSTEM_EXCEPTION, Constants.SERVICE_EXCEPTION_MESSAGE); + } + + @ExceptionHandler(ServiceException.class) + public final Result handler(ServiceException e) { + logger.error("出现服务异常:{},异常类型:{},详细堆栈:", e.getMessage(), e.getClass(), e); + return Result.warn(Constants.SERVICE_EXCEPTION, e.getMessage()); + } + + /** + * @author wujinsong + * @date 2021/10/9 1:28 下午 + * @description: 数据效验的异常处理 + * @Param [e] + * @Return R + */ + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public Result handleValidException(MethodArgumentNotValidException e) { + logger.error("数据效验出现了异常:{},异常类型:{},详细堆栈:", e.getMessage(), e.getClass(), e); + StringBuilder sb = new StringBuilder(); + BindingResult bindingResult = e.getBindingResult(); + bindingResult.getFieldErrors().forEach((fieldError) -> { + sb.append(fieldError.getField()).append(fieldError.getDefaultMessage()).append(";"); + }); + + return Result.warn(Constants.PARAMETER_EXCEPTION, sb.toString()); + } +} diff --git a/demo/src/main/java/com/dite/znpt/exception/ServiceException.java b/demo/src/main/java/com/dite/znpt/exception/ServiceException.java new file mode 100644 index 0000000..c79d673 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/exception/ServiceException.java @@ -0,0 +1,15 @@ +package com.dite.znpt.exception; + +/** + * @description: 服务异常 + */ +public class ServiceException extends RuntimeException { + private Integer code; + + public ServiceException() { + } + + public ServiceException(String message) { + super(message); + } +} diff --git a/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java b/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java new file mode 100644 index 0000000..fc675b7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.CombinedDictEntity; +import com.dite.znpt.domain.vo.CombinedDictListReq; +import com.dite.znpt.domain.vo.CombinedDictResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 字典表数据库访问层 + */ +public interface CombinedDictMapper extends BaseMapper { + List queryBySelective(CombinedDictListReq combinedDictReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java b/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java new file mode 100644 index 0000000..0e9ca4c --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 缺陷记录表数据库访问层 + */ +public interface DefectMapper extends BaseMapper { + List queryBySelective(DefectListReq defectReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java b/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java new file mode 100644 index 0000000..f99bd74 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.FileInfoEntity; +import com.dite.znpt.domain.vo.FileInfoListReq; +import com.dite.znpt.domain.vo.FileInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 文件信息表数据库访问层 + */ +public interface FileInfoMapper extends BaseMapper { + List queryBySelective(FileInfoListReq fileInfoReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java b/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java new file mode 100644 index 0000000..1e34ad2 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.PersonnelEntity; +import com.dite.znpt.domain.vo.PersonnelListReq; +import com.dite.znpt.domain.vo.PersonnelResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 人员信息表数据库访问层 + */ +public interface PersonnelMapper extends BaseMapper { + List queryBySelective(PersonnelListReq personnelReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java b/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java new file mode 100644 index 0000000..ff5c8e7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectCompanyEntity; +import com.dite.znpt.domain.vo.ProjectCompanyListReq; +import com.dite.znpt.domain.vo.ProjectCompanyResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目-公司关联信息表数据库访问层 + */ +public interface ProjectCompanyMapper extends BaseMapper { + List queryBySelective(ProjectCompanyListReq projectCompanyReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java b/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java new file mode 100644 index 0000000..6344ba7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目信息表数据库访问层 + */ +public interface ProjectMapper extends BaseMapper { + List queryBySelective(ProjectListReq projectReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java new file mode 100644 index 0000000..8e45f04 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TCompanyEntity; +import com.dite.znpt.domain.vo.TCompanyListReq; +import com.dite.znpt.domain.vo.TCompanyResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 公司信息表数据库访问层 + */ +public interface TCompanyMapper extends BaseMapper { + List queryBySelective(TCompanyListReq tCompanyReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java new file mode 100644 index 0000000..9f8680b --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TConstructionEntity; +import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 施工信息表数据库访问层 + */ +public interface TConstructionMapper extends BaseMapper { + List queryBySelective(TConstructionListReq tConstructionReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java new file mode 100644 index 0000000..1e70fb8 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.vo.TurbineListReq; +import com.dite.znpt.domain.vo.TurbineResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 机组-项目关联表数据库访问层 + */ +public interface TurbineMapper extends BaseMapper { + List queryBySelective(TurbineListReq turbineReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java b/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java new file mode 100644 index 0000000..0d7e279 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.WeatherTypeEntity; +import com.dite.znpt.domain.vo.WeatherTypeListReq; +import com.dite.znpt.domain.vo.WeatherTypeResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 天气类型表数据库访问层 + */ +public interface WeatherTypeMapper extends BaseMapper { + List queryBySelective(WeatherTypeListReq weatherTypeReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java b/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java new file mode 100644 index 0000000..88db860 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.CombinedDictEntity; +import com.dite.znpt.domain.vo.CombinedDictListReq; +import com.dite.znpt.domain.vo.CombinedDictResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 字典表服务接口 + */ +public interface CombinedDictService extends IService { + + /** + * 功能描述:查询字典列表 + * + * @param combinedDictReq 字典 + * @return {@link List }<{@link CombinedDictEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(CombinedDictListReq combinedDictReq); + + /** + * 功能描述:查询单条字典 + * + * @param dictId 字典Id + * @return {@link CombinedDictResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + CombinedDictResp selectById(String dictId); + + /** + * 功能描述:新增字典 + * + * @param combinedDict 字典 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(CombinedDictEntity combinedDict); + + /** + * 功能描述:更新字典 + * + * @param combinedDict 字典 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(CombinedDictEntity combinedDict); + + /** + * 功能描述:删除字典 + * + * @param dictId 字典Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String dictId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/DefectService.java b/demo/src/main/java/com/dite/znpt/service/DefectService.java new file mode 100644 index 0000000..8b7593e --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/DefectService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 缺陷记录表服务接口 + */ +public interface DefectService extends IService { + + /** + * 功能描述:查询缺陷记录列表 + * + * @param defectReq 缺陷记录 + * @return {@link List }<{@link DefectEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(DefectListReq defectReq); + + /** + * 功能描述:查询单条缺陷记录 + * + * @param defectId 缺陷记录Id + * @return {@link DefectResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + DefectResp selectById(String defectId); + + /** + * 功能描述:新增缺陷记录 + * + * @param defect 缺陷记录 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(DefectEntity defect); + + /** + * 功能描述:更新缺陷记录 + * + * @param defect 缺陷记录 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(DefectEntity defect); + + /** + * 功能描述:删除缺陷记录 + * + * @param defectId 缺陷记录Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String defectId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/FileInfoService.java b/demo/src/main/java/com/dite/znpt/service/FileInfoService.java new file mode 100644 index 0000000..ad8bbfe --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/FileInfoService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.FileInfoEntity; +import com.dite.znpt.domain.vo.FileInfoListReq; +import com.dite.znpt.domain.vo.FileInfoResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 文件信息表服务接口 + */ +public interface FileInfoService extends IService { + + /** + * 功能描述:查询文件信息列表 + * + * @param fileInfoReq 文件信息 + * @return {@link List }<{@link FileInfoEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(FileInfoListReq fileInfoReq); + + /** + * 功能描述:查询单条文件信息 + * + * @param fileId 文件信息Id + * @return {@link FileInfoResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + FileInfoResp selectById(Long fileId); + + /** + * 功能描述:新增文件信息 + * + * @param fileInfo 文件信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(FileInfoEntity fileInfo); + + /** + * 功能描述:更新文件信息 + * + * @param fileInfo 文件信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(FileInfoEntity fileInfo); + + /** + * 功能描述:删除文件信息 + * + * @param fileId 文件信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(Long fileId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/PersonnelService.java b/demo/src/main/java/com/dite/znpt/service/PersonnelService.java new file mode 100644 index 0000000..641637f --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/PersonnelService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.PersonnelEntity; +import com.dite.znpt.domain.vo.PersonnelListReq; +import com.dite.znpt.domain.vo.PersonnelResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 人员信息表服务接口 + */ +public interface PersonnelService extends IService { + + /** + * 功能描述:查询人员信息列表 + * + * @param personnelReq 人员信息 + * @return {@link List }<{@link PersonnelEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(PersonnelListReq personnelReq); + + /** + * 功能描述:查询单条人员信息 + * + * @param personId 人员信息Id + * @return {@link PersonnelResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PersonnelResp selectById(String personId); + + /** + * 功能描述:新增人员信息 + * + * @param personnel 人员信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(PersonnelEntity personnel); + + /** + * 功能描述:更新人员信息 + * + * @param personnel 人员信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(PersonnelEntity personnel); + + /** + * 功能描述:删除人员信息 + * + * @param personId 人员信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String personId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java b/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java new file mode 100644 index 0000000..3cf64e0 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectCompanyEntity; +import com.dite.znpt.domain.vo.ProjectCompanyListReq; +import com.dite.znpt.domain.vo.ProjectCompanyResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目-公司关联信息表服务接口 + */ +public interface ProjectCompanyService extends IService { + + /** + * 功能描述:查询项目-公司关联信息列表 + * + * @param projectCompanyReq 项目-公司关联信息 + * @return {@link List }<{@link ProjectCompanyEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(ProjectCompanyListReq projectCompanyReq); + + /** + * 功能描述:查询单条项目-公司关联信息 + * + * @param projectId 项目-公司关联信息Id + * @return {@link ProjectCompanyResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + ProjectCompanyResp selectById(String projectId); + + /** + * 功能描述:新增项目-公司关联信息 + * + * @param projectCompany 项目-公司关联信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(ProjectCompanyEntity projectCompany); + + /** + * 功能描述:更新项目-公司关联信息 + * + * @param projectCompany 项目-公司关联信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(ProjectCompanyEntity projectCompany); + + /** + * 功能描述:删除项目-公司关联信息 + * + * @param projectId 项目-公司关联信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String projectId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectService.java b/demo/src/main/java/com/dite/znpt/service/ProjectService.java new file mode 100644 index 0000000..b45b3e5 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/ProjectService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目信息表服务接口 + */ +public interface ProjectService extends IService { + + /** + * 功能描述:查询项目信息列表 + * + * @param projectReq 项目信息 + * @return {@link List }<{@link ProjectEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(ProjectListReq projectReq); + + /** + * 功能描述:查询单条项目信息 + * + * @param projectId 项目信息Id + * @return {@link ProjectResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + ProjectResp selectById(String projectId); + + /** + * 功能描述:新增项目信息 + * + * @param project 项目信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(ProjectEntity project); + + /** + * 功能描述:更新项目信息 + * + * @param project 项目信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(ProjectEntity project); + + /** + * 功能描述:删除项目信息 + * + * @param projectId 项目信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String projectId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/TCompanyService.java b/demo/src/main/java/com/dite/znpt/service/TCompanyService.java new file mode 100644 index 0000000..de983a4 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/TCompanyService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TCompanyEntity; +import com.dite.znpt.domain.vo.TCompanyListReq; +import com.dite.znpt.domain.vo.TCompanyResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 公司信息表服务接口 + */ +public interface TCompanyService extends IService { + + /** + * 功能描述:查询公司信息列表 + * + * @param tCompanyReq 公司信息 + * @return {@link List }<{@link TCompanyEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(TCompanyListReq tCompanyReq); + + /** + * 功能描述:查询单条公司信息 + * + * @param companyId 公司信息Id + * @return {@link TCompanyResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + TCompanyResp selectById(String companyId); + + /** + * 功能描述:新增公司信息 + * + * @param tCompany 公司信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(TCompanyEntity tCompany); + + /** + * 功能描述:更新公司信息 + * + * @param tCompany 公司信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(TCompanyEntity tCompany); + + /** + * 功能描述:删除公司信息 + * + * @param companyId 公司信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String companyId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/TConstructionService.java b/demo/src/main/java/com/dite/znpt/service/TConstructionService.java new file mode 100644 index 0000000..ee32972 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/TConstructionService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TConstructionEntity; +import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 施工信息表服务接口 + */ +public interface TConstructionService extends IService { + + /** + * 功能描述:查询施工信息列表 + * + * @param tConstructionReq 施工信息 + * @return {@link List }<{@link TConstructionEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(TConstructionListReq tConstructionReq); + + /** + * 功能描述:查询单条施工信息 + * + * @param constructionId 施工信息Id + * @return {@link TConstructionResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + TConstructionResp selectById(String constructionId); + + /** + * 功能描述:新增施工信息 + * + * @param tConstruction 施工信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(TConstructionEntity tConstruction); + + /** + * 功能描述:更新施工信息 + * + * @param tConstruction 施工信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(TConstructionEntity tConstruction); + + /** + * 功能描述:删除施工信息 + * + * @param constructionId 施工信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String constructionId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/TurbineService.java b/demo/src/main/java/com/dite/znpt/service/TurbineService.java new file mode 100644 index 0000000..788ccb4 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/TurbineService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.vo.TurbineListReq; +import com.dite.znpt.domain.vo.TurbineResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 机组-项目关联表服务接口 + */ +public interface TurbineService extends IService { + + /** + * 功能描述:查询机组-项目关联列表 + * + * @param turbineReq 机组-项目关联 + * @return {@link List }<{@link TurbineEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(TurbineListReq turbineReq); + + /** + * 功能描述:查询单条机组-项目关联 + * + * @param turbineCode 机组-项目关联Id + * @return {@link TurbineResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + TurbineResp selectById(String turbineCode); + + /** + * 功能描述:新增机组-项目关联 + * + * @param turbine 机组-项目关联 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(TurbineEntity turbine); + + /** + * 功能描述:更新机组-项目关联 + * + * @param turbine 机组-项目关联 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(TurbineEntity turbine); + + /** + * 功能描述:删除机组-项目关联 + * + * @param turbineCode 机组-项目关联Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String turbineCode); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java b/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java new file mode 100644 index 0000000..b075f7d --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.WeatherTypeEntity; +import com.dite.znpt.domain.vo.WeatherTypeListReq; +import com.dite.znpt.domain.vo.WeatherTypeResp; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 天气类型表服务接口 + */ +public interface WeatherTypeService extends IService { + + /** + * 功能描述:查询天气类型列表 + * + * @param weatherTypeReq 天气类型 + * @return {@link List }<{@link WeatherTypeEntity }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + PageInfo selectList(WeatherTypeListReq weatherTypeReq); + + /** + * 功能描述:查询单条天气类型 + * + * @param weatherCode 天气类型Id + * @return {@link WeatherTypeResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + WeatherTypeResp selectById(String weatherCode); + + /** + * 功能描述:新增天气类型 + * + * @param weatherType 天气类型 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void saveData(WeatherTypeEntity weatherType); + + /** + * 功能描述:更新天气类型 + * + * @param weatherType 天气类型 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void updateData(WeatherTypeEntity weatherType); + + /** + * 功能描述:删除天气类型 + * + * @param weatherCode 天气类型Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + void deleteById(String weatherCode); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java new file mode 100644 index 0000000..3b9cd88 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.CombinedDictEntity; +import com.dite.znpt.domain.vo.CombinedDictListReq; +import com.dite.znpt.domain.vo.CombinedDictResp; +import com.dite.znpt.service.CombinedDictService; +import com.dite.znpt.mapper.CombinedDictMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 字典表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class CombinedDictServiceImpl extends ServiceImpl implements CombinedDictService { + + /** + * 功能描述:查询字典列表 + * + * @param combinedDictReq 字典信息 + * @return {@link PageInfo }<{@link CombinedDictResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(CombinedDictListReq combinedDictReq) { + PageUtil.startPage(); + List combinedDictList= this.baseMapper.queryBySelective(combinedDictReq); + combinedDictList.forEach(resp -> { + + }); + return new PageInfo<>(combinedDictList); + } + + /** + * 功能描述:查询单条字典 + * + * @param dictId 字典Id + * @return {@link CombinedDictResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public CombinedDictResp selectById(String dictId) { + CombinedDictListReq combinedDictReq = new CombinedDictListReq(); + combinedDictReq.setDictId(dictId); + + PageInfo page = selectList(combinedDictReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new CombinedDictResp(); + } + + /** + * 功能描述:新增字典 + * + * @param combinedDict 字典 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(CombinedDictEntity combinedDict) { +// todo 校验 + save(combinedDict); + } + + /** + * 功能描述:更新字典 + * + * @param combinedDict 字典 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(CombinedDictEntity combinedDict) { +// todo 校验 + updateById(combinedDict); + } + + /** + * 功能描述:删除字典 + * + * @param dictId 字典Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String dictId) { +// todo 校验 + removeById(dictId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java new file mode 100644 index 0000000..e5a1421 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.service.DefectService; +import com.dite.znpt.mapper.DefectMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 缺陷记录表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class DefectServiceImpl extends ServiceImpl implements DefectService { + + /** + * 功能描述:查询缺陷记录列表 + * + * @param defectReq 缺陷记录信息 + * @return {@link PageInfo }<{@link DefectResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(DefectListReq defectReq) { + PageUtil.startPage(); + List defectList= this.baseMapper.queryBySelective(defectReq); + defectList.forEach(resp -> { + + }); + return new PageInfo<>(defectList); + } + + /** + * 功能描述:查询单条缺陷记录 + * + * @param defectId 缺陷记录Id + * @return {@link DefectResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public DefectResp selectById(String defectId) { + DefectListReq defectReq = new DefectListReq(); + defectReq.setDefectId(defectId); + + PageInfo page = selectList(defectReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new DefectResp(); + } + + /** + * 功能描述:新增缺陷记录 + * + * @param defect 缺陷记录 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(DefectEntity defect) { +// todo 校验 + save(defect); + } + + /** + * 功能描述:更新缺陷记录 + * + * @param defect 缺陷记录 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(DefectEntity defect) { +// todo 校验 + updateById(defect); + } + + /** + * 功能描述:删除缺陷记录 + * + * @param defectId 缺陷记录Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String defectId) { +// todo 校验 + removeById(defectId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java new file mode 100644 index 0000000..fbc992e --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.FileInfoEntity; +import com.dite.znpt.domain.vo.FileInfoListReq; +import com.dite.znpt.domain.vo.FileInfoResp; +import com.dite.znpt.service.FileInfoService; +import com.dite.znpt.mapper.FileInfoMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 文件信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class FileInfoServiceImpl extends ServiceImpl implements FileInfoService { + + /** + * 功能描述:查询文件信息列表 + * + * @param fileInfoReq 文件信息信息 + * @return {@link PageInfo }<{@link FileInfoResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(FileInfoListReq fileInfoReq) { + PageUtil.startPage(); + List fileInfoList= this.baseMapper.queryBySelective(fileInfoReq); + fileInfoList.forEach(resp -> { + + }); + return new PageInfo<>(fileInfoList); + } + + /** + * 功能描述:查询单条文件信息 + * + * @param fileId 文件信息Id + * @return {@link FileInfoResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public FileInfoResp selectById(Long fileId) { + FileInfoListReq fileInfoReq = new FileInfoListReq(); + fileInfoReq.setFileId(fileId); + + PageInfo page = selectList(fileInfoReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new FileInfoResp(); + } + + /** + * 功能描述:新增文件信息 + * + * @param fileInfo 文件信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(FileInfoEntity fileInfo) { +// todo 校验 + save(fileInfo); + } + + /** + * 功能描述:更新文件信息 + * + * @param fileInfo 文件信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(FileInfoEntity fileInfo) { +// todo 校验 + updateById(fileInfo); + } + + /** + * 功能描述:删除文件信息 + * + * @param fileId 文件信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(Long fileId) { +// todo 校验 + removeById(fileId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java new file mode 100644 index 0000000..1a10d93 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.PersonnelEntity; +import com.dite.znpt.domain.vo.PersonnelListReq; +import com.dite.znpt.domain.vo.PersonnelResp; +import com.dite.znpt.service.PersonnelService; +import com.dite.znpt.mapper.PersonnelMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 人员信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class PersonnelServiceImpl extends ServiceImpl implements PersonnelService { + + /** + * 功能描述:查询人员信息列表 + * + * @param personnelReq 人员信息信息 + * @return {@link PageInfo }<{@link PersonnelResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(PersonnelListReq personnelReq) { + PageUtil.startPage(); + List personnelList= this.baseMapper.queryBySelective(personnelReq); + personnelList.forEach(resp -> { + + }); + return new PageInfo<>(personnelList); + } + + /** + * 功能描述:查询单条人员信息 + * + * @param personId 人员信息Id + * @return {@link PersonnelResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PersonnelResp selectById(String personId) { + PersonnelListReq personnelReq = new PersonnelListReq(); + personnelReq.setPersonId(personId); + + PageInfo page = selectList(personnelReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new PersonnelResp(); + } + + /** + * 功能描述:新增人员信息 + * + * @param personnel 人员信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(PersonnelEntity personnel) { +// todo 校验 + save(personnel); + } + + /** + * 功能描述:更新人员信息 + * + * @param personnel 人员信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(PersonnelEntity personnel) { +// todo 校验 + updateById(personnel); + } + + /** + * 功能描述:删除人员信息 + * + * @param personId 人员信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String personId) { +// todo 校验 + removeById(personId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java new file mode 100644 index 0000000..36c5f27 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ProjectCompanyEntity; +import com.dite.znpt.domain.vo.ProjectCompanyListReq; +import com.dite.znpt.domain.vo.ProjectCompanyResp; +import com.dite.znpt.service.ProjectCompanyService; +import com.dite.znpt.mapper.ProjectCompanyMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目-公司关联信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectCompanyServiceImpl extends ServiceImpl implements ProjectCompanyService { + + /** + * 功能描述:查询项目-公司关联信息列表 + * + * @param projectCompanyReq 项目-公司关联信息信息 + * @return {@link PageInfo }<{@link ProjectCompanyResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(ProjectCompanyListReq projectCompanyReq) { + PageUtil.startPage(); + List projectCompanyList= this.baseMapper.queryBySelective(projectCompanyReq); + projectCompanyList.forEach(resp -> { + + }); + return new PageInfo<>(projectCompanyList); + } + + /** + * 功能描述:查询单条项目-公司关联信息 + * + * @param projectId 项目-公司关联信息Id + * @return {@link ProjectCompanyResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public ProjectCompanyResp selectById(String projectId) { + ProjectCompanyListReq projectCompanyReq = new ProjectCompanyListReq(); + projectCompanyReq.setProjectId(projectId); + + PageInfo page = selectList(projectCompanyReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new ProjectCompanyResp(); + } + + /** + * 功能描述:新增项目-公司关联信息 + * + * @param projectCompany 项目-公司关联信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(ProjectCompanyEntity projectCompany) { +// todo 校验 + save(projectCompany); + } + + /** + * 功能描述:更新项目-公司关联信息 + * + * @param projectCompany 项目-公司关联信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(ProjectCompanyEntity projectCompany) { +// todo 校验 + updateById(projectCompany); + } + + /** + * 功能描述:删除项目-公司关联信息 + * + * @param projectId 项目-公司关联信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String projectId) { +// todo 校验 + removeById(projectId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java new file mode 100644 index 0000000..ae32645 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectResp; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.mapper.ProjectMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 项目信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectServiceImpl extends ServiceImpl implements ProjectService { + + /** + * 功能描述:查询项目信息列表 + * + * @param projectReq 项目信息信息 + * @return {@link PageInfo }<{@link ProjectResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(ProjectListReq projectReq) { + PageUtil.startPage(); + List projectList= this.baseMapper.queryBySelective(projectReq); + projectList.forEach(resp -> { + + }); + return new PageInfo<>(projectList); + } + + /** + * 功能描述:查询单条项目信息 + * + * @param projectId 项目信息Id + * @return {@link ProjectResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public ProjectResp selectById(String projectId) { + ProjectListReq projectReq = new ProjectListReq(); + projectReq.setProjectId(projectId); + + PageInfo page = selectList(projectReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new ProjectResp(); + } + + /** + * 功能描述:新增项目信息 + * + * @param project 项目信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(ProjectEntity project) { +// todo 校验 + save(project); + } + + /** + * 功能描述:更新项目信息 + * + * @param project 项目信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(ProjectEntity project) { +// todo 校验 + updateById(project); + } + + /** + * 功能描述:删除项目信息 + * + * @param projectId 项目信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String projectId) { +// todo 校验 + removeById(projectId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java new file mode 100644 index 0000000..249cab5 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TCompanyEntity; +import com.dite.znpt.domain.vo.TCompanyListReq; +import com.dite.znpt.domain.vo.TCompanyResp; +import com.dite.znpt.service.TCompanyService; +import com.dite.znpt.mapper.TCompanyMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 公司信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class TCompanyServiceImpl extends ServiceImpl implements TCompanyService { + + /** + * 功能描述:查询公司信息列表 + * + * @param tCompanyReq 公司信息信息 + * @return {@link PageInfo }<{@link TCompanyResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(TCompanyListReq tCompanyReq) { + PageUtil.startPage(); + List tCompanyList= this.baseMapper.queryBySelective(tCompanyReq); + tCompanyList.forEach(resp -> { + + }); + return new PageInfo<>(tCompanyList); + } + + /** + * 功能描述:查询单条公司信息 + * + * @param companyId 公司信息Id + * @return {@link TCompanyResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public TCompanyResp selectById(String companyId) { + TCompanyListReq tCompanyReq = new TCompanyListReq(); + tCompanyReq.setCompanyId(companyId); + + PageInfo page = selectList(tCompanyReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TCompanyResp(); + } + + /** + * 功能描述:新增公司信息 + * + * @param tCompany 公司信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(TCompanyEntity tCompany) { +// todo 校验 + save(tCompany); + } + + /** + * 功能描述:更新公司信息 + * + * @param tCompany 公司信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(TCompanyEntity tCompany) { +// todo 校验 + updateById(tCompany); + } + + /** + * 功能描述:删除公司信息 + * + * @param companyId 公司信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String companyId) { +// todo 校验 + removeById(companyId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java new file mode 100644 index 0000000..11ac870 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TConstructionEntity; +import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionResp; +import com.dite.znpt.service.TConstructionService; +import com.dite.znpt.mapper.TConstructionMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 施工信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class TConstructionServiceImpl extends ServiceImpl implements TConstructionService { + + /** + * 功能描述:查询施工信息列表 + * + * @param tConstructionReq 施工信息信息 + * @return {@link PageInfo }<{@link TConstructionResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(TConstructionListReq tConstructionReq) { + PageUtil.startPage(); + List tConstructionList= this.baseMapper.queryBySelective(tConstructionReq); + tConstructionList.forEach(resp -> { + + }); + return new PageInfo<>(tConstructionList); + } + + /** + * 功能描述:查询单条施工信息 + * + * @param constructionId 施工信息Id + * @return {@link TConstructionResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public TConstructionResp selectById(String constructionId) { + TConstructionListReq tConstructionReq = new TConstructionListReq(); + tConstructionReq.setConstructionId(constructionId); + + PageInfo page = selectList(tConstructionReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TConstructionResp(); + } + + /** + * 功能描述:新增施工信息 + * + * @param tConstruction 施工信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(TConstructionEntity tConstruction) { +// todo 校验 + save(tConstruction); + } + + /** + * 功能描述:更新施工信息 + * + * @param tConstruction 施工信息 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(TConstructionEntity tConstruction) { +// todo 校验 + updateById(tConstruction); + } + + /** + * 功能描述:删除施工信息 + * + * @param constructionId 施工信息Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String constructionId) { +// todo 校验 + removeById(constructionId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java new file mode 100644 index 0000000..5c4e1db --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.vo.TurbineListReq; +import com.dite.znpt.domain.vo.TurbineResp; +import com.dite.znpt.service.TurbineService; +import com.dite.znpt.mapper.TurbineMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 机组-项目关联表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class TurbineServiceImpl extends ServiceImpl implements TurbineService { + + /** + * 功能描述:查询机组-项目关联列表 + * + * @param turbineReq 机组-项目关联信息 + * @return {@link PageInfo }<{@link TurbineResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(TurbineListReq turbineReq) { + PageUtil.startPage(); + List turbineList= this.baseMapper.queryBySelective(turbineReq); + turbineList.forEach(resp -> { + + }); + return new PageInfo<>(turbineList); + } + + /** + * 功能描述:查询单条机组-项目关联 + * + * @param turbineCode 机组-项目关联Id + * @return {@link TurbineResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public TurbineResp selectById(String turbineCode) { + TurbineListReq turbineReq = new TurbineListReq(); + turbineReq.setTurbineCode(turbineCode); + + PageInfo page = selectList(turbineReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TurbineResp(); + } + + /** + * 功能描述:新增机组-项目关联 + * + * @param turbine 机组-项目关联 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(TurbineEntity turbine) { +// todo 校验 + save(turbine); + } + + /** + * 功能描述:更新机组-项目关联 + * + * @param turbine 机组-项目关联 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(TurbineEntity turbine) { +// todo 校验 + updateById(turbine); + } + + /** + * 功能描述:删除机组-项目关联 + * + * @param turbineCode 机组-项目关联Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String turbineCode) { +// todo 校验 + removeById(turbineCode); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java new file mode 100644 index 0000000..eeb3c81 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java @@ -0,0 +1,100 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.WeatherTypeEntity; +import com.dite.znpt.domain.vo.WeatherTypeListReq; +import com.dite.znpt.domain.vo.WeatherTypeResp; +import com.dite.znpt.service.WeatherTypeService; +import com.dite.znpt.mapper.WeatherTypeMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/09 11:48 + * @Description: 天气类型表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class WeatherTypeServiceImpl extends ServiceImpl implements WeatherTypeService { + + /** + * 功能描述:查询天气类型列表 + * + * @param weatherTypeReq 天气类型信息 + * @return {@link PageInfo }<{@link WeatherTypeResp }> + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public PageInfo selectList(WeatherTypeListReq weatherTypeReq) { + PageUtil.startPage(); + List weatherTypeList= this.baseMapper.queryBySelective(weatherTypeReq); + weatherTypeList.forEach(resp -> { + + }); + return new PageInfo<>(weatherTypeList); + } + + /** + * 功能描述:查询单条天气类型 + * + * @param weatherCode 天气类型Id + * @return {@link WeatherTypeResp } + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public WeatherTypeResp selectById(String weatherCode) { + WeatherTypeListReq weatherTypeReq = new WeatherTypeListReq(); + weatherTypeReq.setWeatherCode(weatherCode); + + PageInfo page = selectList(weatherTypeReq); + return page.hasContent() ? CollUtil.getFirst(page.getList()) : new WeatherTypeResp(); + } + + /** + * 功能描述:新增天气类型 + * + * @param weatherType 天气类型 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void saveData(WeatherTypeEntity weatherType) { +// todo 校验 + save(weatherType); + } + + /** + * 功能描述:更新天气类型 + * + * @param weatherType 天气类型 + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void updateData(WeatherTypeEntity weatherType) { +// todo 校验 + updateById(weatherType); + } + + /** + * 功能描述:删除天气类型 + * + * @param weatherCode 天气类型Id + * @author huise23 + * @date 2025/04/09 11:48 + **/ + @Override + public void deleteById(String weatherCode) { +// todo 校验 + removeById(weatherCode); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/util/PageUtil.java b/demo/src/main/java/com/dite/znpt/util/PageUtil.java new file mode 100644 index 0000000..5654106 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/util/PageUtil.java @@ -0,0 +1,25 @@ +package com.dite.znpt.util; + +import com.dite.znpt.domain.page.PageDomain; +import com.dite.znpt.domain.page.TableSupport; +import com.github.pagehelper.PageHelper; + +/** + * @author cuizhibin + */ +public class PageUtil extends PageHelper { + + public static void startPage() { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + public static void clearPage() { + PageHelper.clearPage(); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/util/PasswordUtil.java b/demo/src/main/java/com/dite/znpt/util/PasswordUtil.java new file mode 100644 index 0000000..85d9dfe --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/util/PasswordUtil.java @@ -0,0 +1,16 @@ +package com.dite.znpt.util; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +public class PasswordUtil { + private static final PasswordEncoder encoder = new BCryptPasswordEncoder(); + + public static String encrypt(String rawPassword) { + return encoder.encode(rawPassword); + } + + public static boolean matches(String rawPassword, String encodedPassword) { + return encoder.matches(rawPassword, encodedPassword); + } +} diff --git a/demo/src/main/java/com/dite/znpt/util/SqlUtil.java b/demo/src/main/java/com/dite/znpt/util/SqlUtil.java new file mode 100644 index 0000000..52f4c4f --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/util/SqlUtil.java @@ -0,0 +1,36 @@ +package com.dite.znpt.util; + +import cn.hutool.core.exceptions.UtilException; +import org.apache.commons.lang3.StringUtils; + +public class SqlUtil { + public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; + public static String SQL_PATTERN = "[a-zA-Z0-9_ ,.]+"; + + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { + throw new UtilException("参数不符合规范,不能进行查询"); + } else { + return value; + } + } + + public static boolean isValidOrderBySql(String value) { + return value.matches(SQL_PATTERN); + } + + public static void filterKeyword(String value) { + if (!StringUtils.isEmpty(value)) { + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + int var3 = sqlKeywords.length; + + for(int var4 = 0; var4 < var3; ++var4) { + String sqlKeyword = sqlKeywords[var4]; + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { + throw new UtilException("参数存在SQL注入风险"); + } + } + + } + } +} diff --git a/demo/src/main/resources/application-dev.yml b/demo/src/main/resources/application-dev.yml new file mode 100644 index 0000000..260c407 --- /dev/null +++ b/demo/src/main/resources/application-dev.yml @@ -0,0 +1,89 @@ +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: h67&E98HS8^6 + druid: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 50 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: iotplatform + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # redis 配置 +# redis: +# # 地址 +# host: 10.20.32.11 +# # 端口,默认为6379 +# port: 1179 +# # 数据库索引 +# database: 3 +# # 密码 +# password: 123456 +# # 连接超时时间 +# timeout: 10s +# lettuce: +# pool: +# # 连接池中的最小空闲连接 +# min-idle: 0 +# # 连接池中的最大空闲连接 +# max-idle: 8 +# # 连接池的最大数据库连接数 +# max-active: 8 +# # #连接池最大阻塞等待时间(使用负值表示没有限制) +# max-wait: -1ms +# +## MINIO配置 +#minio: +# url: http://10.20.32.11:9000 +# accessKey: minio +# secretKey: minio@321 +# private: +# bucket: pri +# domain: +# prefix: /minio-pri/ +# public: +# bucket: pub +# domain: +# prefix: /minio/ diff --git a/demo/src/main/resources/application.yml b/demo/src/main/resources/application.yml new file mode 100644 index 0000000..a3a9199 --- /dev/null +++ b/demo/src/main/resources/application.yml @@ -0,0 +1,20 @@ +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: dev + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 100MB + # 设置总上传的文件大小 + max-request-size: 200MB + application: + name: znpt + mvc: + pathmatch: + matching-strategy: ant_path_matcher diff --git a/demo/src/main/resources/mapper/CombinedDictMapper.xml b/demo/src/main/resources/mapper/CombinedDictMapper.xml new file mode 100644 index 0000000..81f5ab9 --- /dev/null +++ b/demo/src/main/resources/mapper/CombinedDictMapper.xml @@ -0,0 +1,39 @@ + + + + + + a.dict_id, a.dict_type, a.dict_name, a.parent_id, + a.sort_order, a.final_state + + + + + diff --git a/demo/src/main/resources/mapper/DefectMapper.xml b/demo/src/main/resources/mapper/DefectMapper.xml new file mode 100644 index 0000000..bf76c96 --- /dev/null +++ b/demo/src/main/resources/mapper/DefectMapper.xml @@ -0,0 +1,52 @@ + + + + + + a.defect_id, a.turbine_code, a.blade_code, a.surface_type, + a.defect_type, a.defect_level, a.axial_length, a.chord_length, + a.image_path, a.image_hash + + + + + diff --git a/demo/src/main/resources/mapper/FileInfoMapper.xml b/demo/src/main/resources/mapper/FileInfoMapper.xml new file mode 100644 index 0000000..78f16bd --- /dev/null +++ b/demo/src/main/resources/mapper/FileInfoMapper.xml @@ -0,0 +1,29 @@ + + + + + + a.file_id, a.business_id, a.minio_path + + + + + diff --git a/demo/src/main/resources/mapper/PersonnelMapper.xml b/demo/src/main/resources/mapper/PersonnelMapper.xml new file mode 100644 index 0000000..a74e8f8 --- /dev/null +++ b/demo/src/main/resources/mapper/PersonnelMapper.xml @@ -0,0 +1,36 @@ + + + + + + a.person_id, a.name, a.role_type, a.company_id, + a.password + + + + + diff --git a/demo/src/main/resources/mapper/ProjectCompanyMapper.xml b/demo/src/main/resources/mapper/ProjectCompanyMapper.xml new file mode 100644 index 0000000..c1b6531 --- /dev/null +++ b/demo/src/main/resources/mapper/ProjectCompanyMapper.xml @@ -0,0 +1,29 @@ + + + + + + a.project_id, a.company_id, a.relation_type + + + + + diff --git a/demo/src/main/resources/mapper/ProjectMapper.xml b/demo/src/main/resources/mapper/ProjectMapper.xml new file mode 100644 index 0000000..7b91da0 --- /dev/null +++ b/demo/src/main/resources/mapper/ProjectMapper.xml @@ -0,0 +1,45 @@ + + + + + + a.project_id, a.project_name, a.farm_name, a.farm_address, + a.client_id, a.method_id, a.scale, a.turbine_model + + + + + diff --git a/demo/src/main/resources/mapper/TCompanyMapper.xml b/demo/src/main/resources/mapper/TCompanyMapper.xml new file mode 100644 index 0000000..30c6c76 --- /dev/null +++ b/demo/src/main/resources/mapper/TCompanyMapper.xml @@ -0,0 +1,29 @@ + + + + + + a.company_id, a.company_name, a.address + + + + + diff --git a/demo/src/main/resources/mapper/TConstructionMapper.xml b/demo/src/main/resources/mapper/TConstructionMapper.xml new file mode 100644 index 0000000..423b98d --- /dev/null +++ b/demo/src/main/resources/mapper/TConstructionMapper.xml @@ -0,0 +1,55 @@ + + + + + + a.construction_id, a.project_id, a.turbine_code, a.start_time, + a.end_time, a.temperature, a.wind_speed, a.image_count, + a.weather_code, a.status_id, a.created_at + + + + + diff --git a/demo/src/main/resources/mapper/TurbineMapper.xml b/demo/src/main/resources/mapper/TurbineMapper.xml new file mode 100644 index 0000000..eee13f2 --- /dev/null +++ b/demo/src/main/resources/mapper/TurbineMapper.xml @@ -0,0 +1,26 @@ + + + + + + a.turbine_code, a.project_id + + + + + diff --git a/demo/src/main/resources/mapper/WeatherTypeMapper.xml b/demo/src/main/resources/mapper/WeatherTypeMapper.xml new file mode 100644 index 0000000..5524109 --- /dev/null +++ b/demo/src/main/resources/mapper/WeatherTypeMapper.xml @@ -0,0 +1,29 @@ + + + + + + a.weather_code, a.chinese_name, a.impact_factor + + + + + diff --git a/demo/src/test/java/com/example/demo/DiteApplicationTests.java b/demo/src/test/java/com/example/demo/DiteApplicationTests.java new file mode 100644 index 0000000..5ef0a95 --- /dev/null +++ b/demo/src/test/java/com/example/demo/DiteApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DiteApplicationTests { + + @Test + void contextLoads() { + } + +} From 423b6ee5d477e4ec5bd45e25f2bbef8186c86600 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 11 Apr 2025 15:49:17 +0800 Subject: [PATCH 002/143] =?UTF-8?q?1.=E6=9C=BA=E7=BB=84=E3=80=81=E9=83=A8?= =?UTF-8?q?=E4=BB=B6=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/DefectEntity.java | 2 +- .../znpt/domain/entity/FileInfoEntity.java | 4 ++++ .../znpt/domain/entity/PersonnelEntity.java | 4 ++++ .../znpt/domain/entity/ProjectEntity.java | 9 ++++----- .../znpt/domain/entity/TCompanyEntity.java | 8 ++++++++ .../znpt/domain/entity/TurbineEntity.java | 20 +++++++++++++++++-- 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index f3ad703..f9c4448 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -55,7 +55,7 @@ public class DefectEntity extends AuditableEntity implements Serializable { @TableField("chord_length") private BigDecimal chordLength; - @ApiModelProperty("处理建议") + @ApiModelProperty("图片路径") @TableField("image_path") private String imagePath; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java index de8f9c5..10870dd 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java @@ -33,5 +33,9 @@ public class FileInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("minio相对路径") @TableField("minio_path") private String minioPath; + + @ApiModelProperty("业务类型,字典file_business_type") + @TableField("business_type") + private String businessType; } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java index d1da33f..3559dc8 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java @@ -41,5 +41,9 @@ public class PersonnelEntity extends AuditableEntity implements Serializable { @ApiModelProperty("密码") @TableField("password") private String password; + + @ApiModelProperty("1正常0禁用") + @TableField("status") + private Integer status; } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 2821ca2..c529bf3 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -38,10 +38,6 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("farm_address") private String farmAddress; - @ApiModelProperty("委托单位") - @TableField("client_id") - private String clientId; - @ApiModelProperty("检查方式,字典method_id") @TableField("method_id") private String methodId; @@ -53,6 +49,9 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty("风机型号") @TableField("turbine_model") private String turbineModel; + + @ApiModelProperty("项目状态,字典project_status") + @TableField("status") + private String status; } - diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java index 26c82fd..9cdcada 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java @@ -33,5 +33,13 @@ public class TCompanyEntity extends AuditableEntity implements Serializable { @ApiModelProperty("公司地址") @TableField("address") private String address; + + @ApiModelProperty("联系人") + @TableField("contact") + private String contact; + + @ApiModelProperty("电话") + @TableField("phone") + private String phone; } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index 94efacf..c97cf0b 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -23,11 +23,27 @@ public class TurbineEntity extends AuditableEntity implements Serializable { private static final long serialVersionUID = -38088185643803512L; @ApiModelProperty("机组号") - @TableId(value = "turbine_code", type = IdType.ASSIGN_ID) - private String turbineCode; + @TableId(value = "turbine_id", type = IdType.ASSIGN_ID) + private String turbineId; @ApiModelProperty("项目id") @TableField("project_id") private String projectId; + + @ApiModelProperty("机组名称") + @TableField("turbine_name") + private String turbineName; + + @ApiModelProperty("机组描述") + @TableField("turbine_desc") + private String turbineDesc; + + @ApiModelProperty("机组厂商") + @TableField("manufacturer") + private String manufacturer; + + @ApiModelProperty("机组型号") + @TableField("model") + private String model; } From 720622197dbba1816f3313b480a7a297f4403fb4 Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Fri, 11 Apr 2025 23:17:53 +0800 Subject: [PATCH 003/143] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/.mvn/wrapper/maven-wrapper.properties | 19 ---- demo/pom.xml | 6 +- .../controller/CombinedDictController.java | 33 +++++-- .../dite/znpt/controller/CrewController.java | 84 ++++++++++++++++ .../znpt/controller/DefectController.java | 33 +++++-- .../znpt/controller/FileInfoController.java | 33 +++++-- .../dite/znpt/controller/PartController.java | 84 ++++++++++++++++ .../znpt/controller/PersonnelController.java | 33 +++++-- .../controller/ProjectCompanyController.java | 33 +++++-- .../znpt/controller/ProjectController.java | 33 +++++-- .../znpt/controller/TCompanyController.java | 33 +++++-- .../controller/TConstructionController.java | 33 +++++-- .../znpt/controller/TurbineController.java | 33 +++++-- .../controller/WeatherTypeController.java | 33 +++++-- .../com/dite/znpt/domain/AuditableEntity.java | 4 + .../java/com/dite/znpt/domain/PageResult.java | 58 +++++++++++ .../java/com/dite/znpt/domain/Result.java | 2 +- .../domain/entity/CombinedDictEntity.java | 13 ++- .../dite/znpt/domain/entity/CrewEntity.java | 56 +++++++++++ .../dite/znpt/domain/entity/DefectEntity.java | 20 +++- .../znpt/domain/entity/FileInfoEntity.java | 9 +- .../dite/znpt/domain/entity/PartEntity.java | 71 +++++++++++++ .../znpt/domain/entity/PersonnelEntity.java | 11 ++- .../domain/entity/ProjectCompanyEntity.java | 13 ++- .../znpt/domain/entity/ProjectEntity.java | 15 ++- .../znpt/domain/entity/TCompanyEntity.java | 10 +- .../znpt/domain/entity/TurbineEntity.java | 27 ++--- .../znpt/domain/entity/WeatherTypeEntity.java | 11 ++- .../znpt/domain/vo/CombinedDictListReq.java | 6 +- .../dite/znpt/domain/vo/CombinedDictResp.java | 2 +- .../com/dite/znpt/domain/vo/CrewListReq.java | 42 ++++++++ .../com/dite/znpt/domain/vo/CrewResp.java | 18 ++++ .../dite/znpt/domain/vo/DefectListReq.java | 11 +-- .../com/dite/znpt/domain/vo/DefectResp.java | 3 +- .../dite/znpt/domain/vo/FileInfoListReq.java | 7 +- .../com/dite/znpt/domain/vo/FileInfoResp.java | 2 +- .../com/dite/znpt/domain/vo/PartListReq.java | 51 ++++++++++ .../com/dite/znpt/domain/vo/PartResp.java | 18 ++++ .../dite/znpt/domain/vo/PersonnelListReq.java | 7 +- .../dite/znpt/domain/vo/PersonnelResp.java | 2 +- .../znpt/domain/vo/ProjectCompanyListReq.java | 6 +- .../znpt/domain/vo/ProjectCompanyResp.java | 2 +- .../dite/znpt/domain/vo/ProjectListReq.java | 12 +-- .../com/dite/znpt/domain/vo/ProjectResp.java | 2 +- .../dite/znpt/domain/vo/TCompanyListReq.java | 10 +- .../com/dite/znpt/domain/vo/TCompanyResp.java | 2 +- .../znpt/domain/vo/TConstructionListReq.java | 21 ++-- .../znpt/domain/vo/TConstructionResp.java | 5 +- .../dite/znpt/domain/vo/TurbineListReq.java | 4 +- .../com/dite/znpt/domain/vo/TurbineResp.java | 2 +- .../znpt/domain/vo/WeatherTypeListReq.java | 7 +- .../dite/znpt/domain/vo/WeatherTypeResp.java | 3 +- .../RestResponseEntityExceptionHandler.java | 6 +- .../dite/znpt/mapper/CombinedDictMapper.java | 2 +- .../java/com/dite/znpt/mapper/CrewMapper.java | 19 ++++ .../com/dite/znpt/mapper/DefectMapper.java | 2 +- .../com/dite/znpt/mapper/FileInfoMapper.java | 2 +- .../java/com/dite/znpt/mapper/PartMapper.java | 19 ++++ .../com/dite/znpt/mapper/PersonnelMapper.java | 2 +- .../znpt/mapper/ProjectCompanyMapper.java | 2 +- .../com/dite/znpt/mapper/ProjectMapper.java | 2 +- .../com/dite/znpt/mapper/TCompanyMapper.java | 2 +- .../dite/znpt/mapper/TConstructionMapper.java | 2 +- .../com/dite/znpt/mapper/TurbineMapper.java | 2 +- .../dite/znpt/mapper/WeatherTypeMapper.java | 2 +- .../znpt/service/CombinedDictService.java | 15 ++- .../com/dite/znpt/service/CrewService.java | 64 ++++++++++++ .../com/dite/znpt/service/DefectService.java | 15 ++- .../dite/znpt/service/FileInfoService.java | 15 ++- .../com/dite/znpt/service/PartService.java | 64 ++++++++++++ .../dite/znpt/service/PersonnelService.java | 15 ++- .../znpt/service/ProjectCompanyService.java | 15 ++- .../com/dite/znpt/service/ProjectService.java | 15 ++- .../dite/znpt/service/TCompanyService.java | 15 ++- .../znpt/service/TConstructionService.java | 15 ++- .../com/dite/znpt/service/TurbineService.java | 15 ++- .../dite/znpt/service/WeatherTypeService.java | 15 ++- .../service/impl/CombinedDictServiceImpl.java | 23 +++-- .../znpt/service/impl/CrewServiceImpl.java | 99 +++++++++++++++++++ .../znpt/service/impl/DefectServiceImpl.java | 23 +++-- .../service/impl/FileInfoServiceImpl.java | 23 +++-- .../znpt/service/impl/PartServiceImpl.java | 99 +++++++++++++++++++ .../service/impl/PersonnelServiceImpl.java | 23 +++-- .../impl/ProjectCompanyServiceImpl.java | 23 +++-- .../znpt/service/impl/ProjectServiceImpl.java | 23 +++-- .../service/impl/TCompanyServiceImpl.java | 23 +++-- .../impl/TConstructionServiceImpl.java | 23 +++-- .../znpt/service/impl/TurbineServiceImpl.java | 23 +++-- .../service/impl/WeatherTypeServiceImpl.java | 23 +++-- demo/src/main/resources/mapper/CrewMapper.xml | 39 ++++++++ .../main/resources/mapper/FileInfoMapper.xml | 5 +- demo/src/main/resources/mapper/PartMapper.xml | 49 +++++++++ .../main/resources/mapper/PersonnelMapper.xml | 5 +- .../main/resources/mapper/ProjectMapper.xml | 8 +- .../main/resources/mapper/TCompanyMapper.xml | 9 +- 95 files changed, 1577 insertions(+), 396 deletions(-) delete mode 100644 demo/.mvn/wrapper/maven-wrapper.properties create mode 100644 demo/src/main/java/com/dite/znpt/controller/CrewController.java create mode 100644 demo/src/main/java/com/dite/znpt/controller/PartController.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/PageResult.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java create mode 100644 demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/mapper/PartMapper.java create mode 100644 demo/src/main/java/com/dite/znpt/service/CrewService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/PartService.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java create mode 100644 demo/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java create mode 100644 demo/src/main/resources/mapper/CrewMapper.xml create mode 100644 demo/src/main/resources/mapper/PartMapper.xml diff --git a/demo/.mvn/wrapper/maven-wrapper.properties b/demo/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index d58dfb7..0000000 --- a/demo/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,19 +0,0 @@ -# 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 diff --git a/demo/pom.xml b/demo/pom.xml index 7202b1a..8c775c5 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -119,7 +119,11 @@ pagehelper-spring-boot-starter 1.4.7 - + + com.pig4cloud.excel + excel-spring-boot-starter + 1.2.7 + diff --git a/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java b/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java index 65cbab0..a6d62ec 100644 --- a/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java +++ b/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.CombinedDictListReq; import com.dite.znpt.domain.vo.CombinedDictResp; import com.dite.znpt.domain.entity.CombinedDictEntity; import com.dite.znpt.service.CombinedDictService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "字典") @RestController @@ -27,9 +32,8 @@ public class CombinedDictController { @ApiOperation(value = "获取字典列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(CombinedDictListReq combinedDictReq) { - PageInfo page = combinedDictService.selectList(combinedDictReq); - return Result.ok(page); + public PageResult list(CombinedDictListReq combinedDictReq) { + return PageResult.ok(combinedDictService.selectList(combinedDictReq)); } @ApiOperation(value = "根据字典Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class CombinedDictController { combinedDictService.deleteById(dictId); return Result.ok(); } - + + @ApiOperation(value = "导出字典", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "字典") + public List export(CombinedDictListReq combinedDictReq) { + return combinedDictService.selectList(combinedDictReq); + } + + @ApiOperation(value = "导入字典", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/CrewController.java b/demo/src/main/java/com/dite/znpt/controller/CrewController.java new file mode 100644 index 0000000..c680255 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/CrewController.java @@ -0,0 +1,84 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.Constants; +import com.dite.znpt.domain.vo.CrewListReq; +import com.dite.znpt.domain.vo.CrewResp; +import com.dite.znpt.domain.entity.CrewEntity; +import com.dite.znpt.service.CrewService; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + */ +@Api(tags = "机组信息") +@RestController +@RequestMapping("/crew") +public class CrewController { + @Resource + private CrewService crewService; + + @ApiOperation(value = "获取机组信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(CrewListReq crewReq) { + return PageResult.ok(crewService.selectList(crewReq)); + } + + @ApiOperation(value = "根据机组信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{crewId}") + public Result getInfo(@PathVariable String crewId) { + return Result.ok(crewService.selectById(crewId)); + } + + @ApiOperation(value = "新增机组信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody CrewEntity crew) { + crewService.saveData(crew); + return Result.ok(); + } + + @ApiOperation(value = "修改机组信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody CrewEntity crew) { + crewService.updateData(crew); + return Result.ok(); + } + + @ApiOperation(value = "删除机组信息", httpMethod = "DELETE") + @DeleteMapping("/{crewId}") + public Result remove(@PathVariable String crewId) { + crewService.deleteById(crewId); + return Result.ok(); + } + + @ApiOperation(value = "导出机组信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "机组信息") + public List export(CrewListReq crewReq) { + return crewService.selectList(crewReq); + } + + @ApiOperation(value = "导入机组信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/DefectController.java b/demo/src/main/java/com/dite/znpt/controller/DefectController.java index a07d624..0084607 100644 --- a/demo/src/main/java/com/dite/znpt/controller/DefectController.java +++ b/demo/src/main/java/com/dite/znpt/controller/DefectController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.DefectListReq; import com.dite.znpt.domain.vo.DefectResp; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.service.DefectService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "缺陷记录") @RestController @@ -27,9 +32,8 @@ public class DefectController { @ApiOperation(value = "获取缺陷记录列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(DefectListReq defectReq) { - PageInfo page = defectService.selectList(defectReq); - return Result.ok(page); + public PageResult list(DefectListReq defectReq) { + return PageResult.ok(defectService.selectList(defectReq)); } @ApiOperation(value = "根据缺陷记录Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class DefectController { defectService.deleteById(defectId); return Result.ok(); } - + + @ApiOperation(value = "导出缺陷记录", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "缺陷记录") + public List export(DefectListReq defectReq) { + return defectService.selectList(defectReq); + } + + @ApiOperation(value = "导入缺陷记录", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java b/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java index 9ae3a51..e4e4895 100644 --- a/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java +++ b/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.FileInfoListReq; import com.dite.znpt.domain.vo.FileInfoResp; import com.dite.znpt.domain.entity.FileInfoEntity; import com.dite.znpt.service.FileInfoService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "文件信息") @RestController @@ -27,9 +32,8 @@ public class FileInfoController { @ApiOperation(value = "获取文件信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(FileInfoListReq fileInfoReq) { - PageInfo page = fileInfoService.selectList(fileInfoReq); - return Result.ok(page); + public PageResult list(FileInfoListReq fileInfoReq) { + return PageResult.ok(fileInfoService.selectList(fileInfoReq)); } @ApiOperation(value = "根据文件信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class FileInfoController { fileInfoService.deleteById(fileId); return Result.ok(); } - + + @ApiOperation(value = "导出文件信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "文件信息") + public List export(FileInfoListReq fileInfoReq) { + return fileInfoService.selectList(fileInfoReq); + } + + @ApiOperation(value = "导入文件信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/PartController.java b/demo/src/main/java/com/dite/znpt/controller/PartController.java new file mode 100644 index 0000000..a184d3a --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/controller/PartController.java @@ -0,0 +1,84 @@ +package com.dite.znpt.controller; + + +import com.dite.znpt.domain.Constants; +import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartResp; +import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.service.PartService; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + */ +@Api(tags = "") +@RestController +@RequestMapping("/part") +public class PartController { + @Resource + private PartService partService; + + @ApiOperation(value = "获取列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(PartListReq partReq) { + return PageResult.ok(partService.selectList(partReq)); + } + + @ApiOperation(value = "根据Id获取详细信息", httpMethod = "GET") + @GetMapping("/{partId}") + public Result getInfo(@PathVariable String partId) { + return Result.ok(partService.selectById(partId)); + } + + @ApiOperation(value = "新增", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody PartEntity part) { + partService.saveData(part); + return Result.ok(); + } + + @ApiOperation(value = "修改", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody PartEntity part) { + partService.updateData(part); + return Result.ok(); + } + + @ApiOperation(value = "删除", httpMethod = "DELETE") + @DeleteMapping("/{partId}") + public Result remove(@PathVariable String partId) { + partService.deleteById(partId); + return Result.ok(); + } + + @ApiOperation(value = "导出", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "") + public List export(PartListReq partReq) { + return partService.selectList(partReq); + } + + @ApiOperation(value = "导入", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } +} + diff --git a/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java b/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java index eb1793b..08d8e6d 100644 --- a/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java +++ b/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.PersonnelListReq; import com.dite.znpt.domain.vo.PersonnelResp; import com.dite.znpt.domain.entity.PersonnelEntity; import com.dite.znpt.service.PersonnelService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "人员信息") @RestController @@ -27,9 +32,8 @@ public class PersonnelController { @ApiOperation(value = "获取人员信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(PersonnelListReq personnelReq) { - PageInfo page = personnelService.selectList(personnelReq); - return Result.ok(page); + public PageResult list(PersonnelListReq personnelReq) { + return PageResult.ok(personnelService.selectList(personnelReq)); } @ApiOperation(value = "根据人员信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class PersonnelController { personnelService.deleteById(personId); return Result.ok(); } - + + @ApiOperation(value = "导出人员信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "人员信息") + public List export(PersonnelListReq personnelReq) { + return personnelService.selectList(personnelReq); + } + + @ApiOperation(value = "导入人员信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java b/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java index d1291c6..0e87f7d 100644 --- a/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java +++ b/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.ProjectCompanyListReq; import com.dite.znpt.domain.vo.ProjectCompanyResp; import com.dite.znpt.domain.entity.ProjectCompanyEntity; import com.dite.znpt.service.ProjectCompanyService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "项目-公司关联信息") @RestController @@ -27,9 +32,8 @@ public class ProjectCompanyController { @ApiOperation(value = "获取项目-公司关联信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(ProjectCompanyListReq projectCompanyReq) { - PageInfo page = projectCompanyService.selectList(projectCompanyReq); - return Result.ok(page); + public PageResult list(ProjectCompanyListReq projectCompanyReq) { + return PageResult.ok(projectCompanyService.selectList(projectCompanyReq)); } @ApiOperation(value = "根据项目-公司关联信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class ProjectCompanyController { projectCompanyService.deleteById(projectId); return Result.ok(); } - + + @ApiOperation(value = "导出项目-公司关联信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "项目-公司关联信息") + public List export(ProjectCompanyListReq projectCompanyReq) { + return projectCompanyService.selectList(projectCompanyReq); + } + + @ApiOperation(value = "导入项目-公司关联信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectController.java b/demo/src/main/java/com/dite/znpt/controller/ProjectController.java index 0ed400d..732fb54 100644 --- a/demo/src/main/java/com/dite/znpt/controller/ProjectController.java +++ b/demo/src/main/java/com/dite/znpt/controller/ProjectController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectResp; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.service.ProjectService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "项目信息") @RestController @@ -27,9 +32,8 @@ public class ProjectController { @ApiOperation(value = "获取项目信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(ProjectListReq projectReq) { - PageInfo page = projectService.selectList(projectReq); - return Result.ok(page); + public PageResult list(ProjectListReq projectReq) { + return PageResult.ok(projectService.selectList(projectReq)); } @ApiOperation(value = "根据项目信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class ProjectController { projectService.deleteById(projectId); return Result.ok(); } - + + @ApiOperation(value = "导出项目信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "项目信息") + public List export(ProjectListReq projectReq) { + return projectService.selectList(projectReq); + } + + @ApiOperation(value = "导入项目信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java b/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java index 3530904..93cebab 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java +++ b/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.TCompanyListReq; import com.dite.znpt.domain.vo.TCompanyResp; import com.dite.znpt.domain.entity.TCompanyEntity; import com.dite.znpt.service.TCompanyService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "公司信息") @RestController @@ -27,9 +32,8 @@ public class TCompanyController { @ApiOperation(value = "获取公司信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(TCompanyListReq tCompanyReq) { - PageInfo page = tCompanyService.selectList(tCompanyReq); - return Result.ok(page); + public PageResult list(TCompanyListReq tCompanyReq) { + return PageResult.ok(tCompanyService.selectList(tCompanyReq)); } @ApiOperation(value = "根据公司信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class TCompanyController { tCompanyService.deleteById(companyId); return Result.ok(); } - + + @ApiOperation(value = "导出公司信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "公司信息") + public List export(TCompanyListReq tCompanyReq) { + return tCompanyService.selectList(tCompanyReq); + } + + @ApiOperation(value = "导入公司信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java b/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java index 4742d4c..6c34d6e 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java +++ b/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.TConstructionListReq; import com.dite.znpt.domain.vo.TConstructionResp; import com.dite.znpt.domain.entity.TConstructionEntity; import com.dite.znpt.service.TConstructionService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "施工信息") @RestController @@ -27,9 +32,8 @@ public class TConstructionController { @ApiOperation(value = "获取施工信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(TConstructionListReq tConstructionReq) { - PageInfo page = tConstructionService.selectList(tConstructionReq); - return Result.ok(page); + public PageResult list(TConstructionListReq tConstructionReq) { + return PageResult.ok(tConstructionService.selectList(tConstructionReq)); } @ApiOperation(value = "根据施工信息Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class TConstructionController { tConstructionService.deleteById(constructionId); return Result.ok(); } - + + @ApiOperation(value = "导出施工信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "施工信息") + public List export(TConstructionListReq tConstructionReq) { + return tConstructionService.selectList(tConstructionReq); + } + + @ApiOperation(value = "导入施工信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/TurbineController.java b/demo/src/main/java/com/dite/znpt/controller/TurbineController.java index 8769745..11365b0 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TurbineController.java +++ b/demo/src/main/java/com/dite/znpt/controller/TurbineController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.TurbineListReq; import com.dite.znpt.domain.vo.TurbineResp; import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.service.TurbineService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "机组-项目关联") @RestController @@ -27,9 +32,8 @@ public class TurbineController { @ApiOperation(value = "获取机组-项目关联列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(TurbineListReq turbineReq) { - PageInfo page = turbineService.selectList(turbineReq); - return Result.ok(page); + public PageResult list(TurbineListReq turbineReq) { + return PageResult.ok(turbineService.selectList(turbineReq)); } @ApiOperation(value = "根据机组-项目关联Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class TurbineController { turbineService.deleteById(turbineCode); return Result.ok(); } - + + @ApiOperation(value = "导出机组-项目关联", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "机组-项目关联") + public List export(TurbineListReq turbineReq) { + return turbineService.selectList(turbineReq); + } + + @ApiOperation(value = "导入机组-项目关联", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java b/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java index f96fdc7..21e8b41 100644 --- a/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java +++ b/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java @@ -1,22 +1,27 @@ package com.dite.znpt.controller; +import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.WeatherTypeListReq; import com.dite.znpt.domain.vo.WeatherTypeResp; import com.dite.znpt.domain.entity.WeatherTypeEntity; import com.dite.znpt.service.WeatherTypeService; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import com.github.pagehelper.PageInfo; import javax.annotation.Resource; import java.util.List; /** * @author huise23 - * @date 2025/04/09 14:37 + * @date 2025/04/11 23:17 */ @Api(tags = "天气类型") @RestController @@ -27,9 +32,8 @@ public class WeatherTypeController { @ApiOperation(value = "获取天气类型列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(WeatherTypeListReq weatherTypeReq) { - PageInfo page = weatherTypeService.selectList(weatherTypeReq); - return Result.ok(page); + public PageResult list(WeatherTypeListReq weatherTypeReq) { + return PageResult.ok(weatherTypeService.selectList(weatherTypeReq)); } @ApiOperation(value = "根据天气类型Id获取详细信息", httpMethod = "GET") @@ -58,6 +62,23 @@ public class WeatherTypeController { weatherTypeService.deleteById(weatherCode); return Result.ok(); } - + + @ApiOperation(value = "导出天气类型", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "天气类型") + public List export(WeatherTypeListReq weatherTypeReq) { + return weatherTypeService.selectList(weatherTypeReq); + } + + @ApiOperation(value = "导入天气类型", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } } diff --git a/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java index b4da55a..ffff2eb 100644 --- a/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain; +import com.alibaba.excel.annotation.ExcelIgnore; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; @@ -32,12 +33,15 @@ public class AuditableEntity implements Serializable { // @ApiModelProperty(hidden = true) // private Date updateTime; + @ExcelIgnore @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") private List idList; + @ExcelIgnore @ApiModelProperty(value = "当前页", example = "1", notes = "0") int page = 1; + @ExcelIgnore @ApiModelProperty(value = "页大小", example = "10", notes = "10") int pageSize = 10; } diff --git a/demo/src/main/java/com/dite/znpt/domain/PageResult.java b/demo/src/main/java/com/dite/znpt/domain/PageResult.java new file mode 100644 index 0000000..a7aa736 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/PageResult.java @@ -0,0 +1,58 @@ +package com.dite.znpt.domain; + +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页查询结果 + */ +@Data +public class PageResult { + private static final long serialVersionUID = 1L; + @ApiModelProperty("状态码") + private Integer code; + @ApiModelProperty("返回内容") + private String msg; + @ApiModelProperty("对象列表") + private List rows; + @ApiModelProperty("数据对象") + private Long total; + + public PageResult(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public PageResult(int code, String msg, List rows, Long total) { + this.code = code; + this.msg = msg; + this.rows = rows; + this.total = total; + } + + public static PageResult ok(List rows) { + return ok(rows, (new PageInfo(rows)).getTotal()); + } + + public static PageResult ok(List rows, Long total) { + return new PageResult(200, "操作成功", rows, total); + } + + public static PageResult ok(List rows, Integer total) { + return new PageResult(200, "操作成功", rows, (long)total); + } + + public static PageResult error() { + return error("操作失败"); + } + + public static PageResult error(String msg) { + return new PageResult(500, msg); + } + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/Result.java b/demo/src/main/java/com/dite/znpt/domain/Result.java index 817b728..876f660 100644 --- a/demo/src/main/java/com/dite/znpt/domain/Result.java +++ b/demo/src/main/java/com/dite/znpt/domain/Result.java @@ -60,7 +60,7 @@ public class Result implements Serializable { return new Result(HttpStatus.OK, Boolean.FALSE, SUCCESS_CODE, StringUtils.EMPTY); } - public static Result warn(String code, String msg) { + public static Result error(String code, String msg) { return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(code), msg); } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java index d982ea4..2b1eb6f 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 字典表实体类 */ @Data @@ -20,30 +21,36 @@ import lombok.EqualsAndHashCode; @ApiModel(value="CombinedDictEntity对象", description="字典表") public class CombinedDictEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -40324154726527318L; + private static final long serialVersionUID = -11768336612800273L; + @ExcelProperty("字典id") @ApiModelProperty("字典id") @TableId(value = "dict_id", type = IdType.ASSIGN_ID) private String dictId; + @ExcelProperty("字典类型") @ApiModelProperty("字典类型") @TableField("dict_type") private String dictType; + @ExcelProperty("字典名称") @ApiModelProperty("字典名称") @TableField("dict_name") private String dictName; + @ExcelProperty("父级id") @ApiModelProperty("父级id") @TableField("parent_id") private Long parentId; + @ExcelProperty("字典排序") @ApiModelProperty("字典排序") @TableField("sort_order") private Integer sortOrder; + @ExcelProperty("是否字典终值") @ApiModelProperty("是否字典终值") @TableField("final_state") - private Integer finalState; + private Boolean finalState; } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java new file mode 100644 index 0000000..e39e575 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java @@ -0,0 +1,56 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("crew") +@ApiModel(value="CrewEntity对象", description="机组信息表") +public class CrewEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -18989296759149249L; + + @ExcelProperty("机组id") + @ApiModelProperty("机组id") + @TableId(value = "crew_id", type = IdType.ASSIGN_ID) + private String crewId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("机组名称") + @ApiModelProperty("机组名称") + @TableField("crew_name") + private String crewName; + + @ExcelProperty("机组描述") + @ApiModelProperty("机组描述") + @TableField("crew_desc") + private String crewDesc; + + @ExcelProperty("机组厂商") + @ApiModelProperty("机组厂商") + @TableField("manufacturer") + private String manufacturer; + + @ExcelProperty("机组型号") + @ApiModelProperty("机组型号") + @TableField("model") + private String model; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index f9c4448..7d4ab2c 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -1,6 +1,5 @@ package com.dite.znpt.domain.entity; -import java.math.BigDecimal; import java.io.Serializable; import com.baomidou.mybatisplus.annotation.*; @@ -9,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 缺陷记录表实体类 */ @Data @@ -21,44 +21,54 @@ import lombok.EqualsAndHashCode; @ApiModel(value="DefectEntity对象", description="缺陷记录表") public class DefectEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -74938532938992308L; + private static final long serialVersionUID = 272430541345740192L; + @ExcelProperty("缺陷id") @ApiModelProperty("缺陷id") @TableId(value = "defect_id", type = IdType.ASSIGN_ID) private String defectId; + @ExcelProperty("机组id") @ApiModelProperty("机组id") @TableField("turbine_code") private String turbineCode; + @ExcelProperty("叶片号") @ApiModelProperty("叶片号") @TableField("blade_code") private String bladeCode; + @ExcelProperty("损伤面,字典surface_type") @ApiModelProperty("损伤面,字典surface_type") @TableField("surface_type") private String surfaceType; + @ExcelProperty("缺陷类型,字典defect_type") @ApiModelProperty("缺陷类型,字典defect_type") @TableField("defect_type") private String defectType; + @ExcelProperty("危重等级,字典defect_level") @ApiModelProperty("危重等级,字典defect_level") @TableField("defect_level") private String defectLevel; + @ExcelProperty("轴向长度(mm)") @ApiModelProperty("轴向长度(mm)") @TableField("axial_length") - private BigDecimal axialLength; + private Object axialLength; + @ExcelProperty("弦向长度(mm)") @ApiModelProperty("弦向长度(mm)") @TableField("chord_length") - private BigDecimal chordLength; + private Object chordLength; + @ExcelProperty("图片路径") @ApiModelProperty("图片路径") @TableField("image_path") private String imagePath; + @ExcelProperty("图片详情") @ApiModelProperty("图片详情") @TableField("image_hash") private String imageHash; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java index 10870dd..651f4f5 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 文件信息表实体类 */ @Data @@ -20,20 +21,24 @@ import lombok.EqualsAndHashCode; @ApiModel(value="FileInfoEntity对象", description="文件信息表") public class FileInfoEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 102386713213268589L; + private static final long serialVersionUID = -14287111699285655L; + @ExcelProperty("文件id") @ApiModelProperty("文件id") @TableId(value = "file_id", type = IdType.ASSIGN_ID) private Long fileId; + @ExcelProperty("业务id") @ApiModelProperty("业务id") @TableField("business_id") private String businessId; + @ExcelProperty("minio相对路径") @ApiModelProperty("minio相对路径") @TableField("minio_path") private String minioPath; + @ExcelProperty("业务类型,字典file_business_type") @ApiModelProperty("业务类型,字典file_business_type") @TableField("business_type") private String businessType; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java new file mode 100644 index 0000000..553d1ae --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java @@ -0,0 +1,71 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("part") +@ApiModel(value="PartEntity对象", description="表") +public class PartEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -53853862365306266L; + + @ExcelProperty("部件id") + @ApiModelProperty("部件id") + @TableId(value = "part_id", type = IdType.ASSIGN_ID) + private String partId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("机组id") + @ApiModelProperty("机组id") + @TableField("crew_id") + private String crewId; + + @ExcelProperty("名称") + @ApiModelProperty("名称") + @TableField("part_name") + private String partName; + + @ExcelProperty("编号") + @ApiModelProperty("编号") + @TableField("part_code") + private String partCode; + + @ExcelProperty("类型,字典part_type") + @ApiModelProperty("类型,字典part_type") + @TableField("part_type") + private String partType; + + @ExcelProperty("描述") + @ApiModelProperty("描述") + @TableField("part_desc") + private String partDesc; + + @ExcelProperty("厂商") + @ApiModelProperty("厂商") + @TableField("manufacturer") + private String manufacturer; + + @ExcelProperty("型号") + @ApiModelProperty("型号") + @TableField("model") + private String model; +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java index 3559dc8..f6f202d 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 人员信息表实体类 */ @Data @@ -20,28 +21,34 @@ import lombok.EqualsAndHashCode; @ApiModel(value="PersonnelEntity对象", description="人员信息表") public class PersonnelEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 351217700568175283L; + private static final long serialVersionUID = -62273861742734411L; + @ExcelProperty("用户名") @ApiModelProperty("用户名") @TableId(value = "person_id", type = IdType.ASSIGN_ID) private String personId; + @ExcelProperty("姓名") @ApiModelProperty("姓名") @TableField("name") private String name; + @ExcelProperty("角色类型,字典role_type") @ApiModelProperty("角色类型,字典role_type") @TableField("role_type") private String roleType; + @ExcelProperty("公司id") @ApiModelProperty("公司id") @TableField("company_id") private String companyId; + @ExcelProperty("密码") @ApiModelProperty("密码") @TableField("password") private String password; + @ExcelProperty("1正常0禁用") @ApiModelProperty("1正常0禁用") @TableField("status") private Integer status; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java index 2f73946..4bf806b 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** - * @author sakura - * @date 2025/04/10 13:42 + * @author huise23 + * @date 2025/04/11 23:17 * @Description: 项目-公司关联信息表实体类 */ @Data @@ -20,17 +21,21 @@ import lombok.EqualsAndHashCode; @ApiModel(value="ProjectCompanyEntity对象", description="项目-公司关联信息表") public class ProjectCompanyEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 128834719624205451L; + private static final long serialVersionUID = -98876147355655939L; + @ExcelProperty("项目id") @ApiModelProperty("项目id") @TableId(value = "project_id", type = IdType.ASSIGN_ID) private String projectId; + @ExcelProperty("公司id") @ApiModelProperty("公司id") @TableField("company_id") private String companyId; + @ExcelProperty("单位类型(检查/委托)") @ApiModelProperty("单位类型(检查/委托)") @TableField("relation_type") private String relationType; -} \ No newline at end of file +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index c529bf3..64c42ca 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** - * @author sakura - * @date 2025/04/10 13:31 + * @author huise23 + * @date 2025/04/11 23:17 * @Description: 项目信息表实体类 */ @Data @@ -20,36 +21,44 @@ import lombok.EqualsAndHashCode; @ApiModel(value="ProjectEntity对象", description="项目信息表") public class ProjectEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 676511262353737882L; + private static final long serialVersionUID = -38332266915294799L; + @ExcelProperty("项目id") @ApiModelProperty("项目id") @TableId(value = "project_id", type = IdType.ASSIGN_ID) private String projectId; + @ExcelProperty("项目名称") @ApiModelProperty("项目名称") @TableField("project_name") private String projectName; + @ExcelProperty("风场名称") @ApiModelProperty("风场名称") @TableField("farm_name") private String farmName; + @ExcelProperty("风场地址") @ApiModelProperty("风场地址") @TableField("farm_address") private String farmAddress; + @ExcelProperty("检查方式,字典method_id") @ApiModelProperty("检查方式,字典method_id") @TableField("method_id") private String methodId; + @ExcelProperty("项目规模") @ApiModelProperty("项目规模") @TableField("scale") private String scale; + @ExcelProperty("风机型号") @ApiModelProperty("风机型号") @TableField("turbine_model") private String turbineModel; + @ExcelProperty("项目状态,字典project_status") @ApiModelProperty("项目状态,字典project_status") @TableField("status") private String status; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java index 9cdcada..5c24565 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 公司信息表实体类 */ @Data @@ -20,24 +21,29 @@ import lombok.EqualsAndHashCode; @ApiModel(value="TCompanyEntity对象", description="公司信息表") public class TCompanyEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -72804777209522073L; + private static final long serialVersionUID = 348031306551320799L; + @ExcelProperty("公司id") @ApiModelProperty("公司id") @TableId(value = "company_id", type = IdType.ASSIGN_ID) private String companyId; + @ExcelProperty("公司名称") @ApiModelProperty("公司名称") @TableField("company_name") private String companyName; + @ExcelProperty("公司地址") @ApiModelProperty("公司地址") @TableField("address") private String address; + @ExcelProperty("联系人") @ApiModelProperty("联系人") @TableField("contact") private String contact; + @ExcelProperty("电话") @ApiModelProperty("电话") @TableField("phone") private String phone; diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index c97cf0b..6454a58 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -8,10 +8,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 机组-项目关联表实体类 */ @Data @@ -20,30 +21,16 @@ import lombok.EqualsAndHashCode; @ApiModel(value="TurbineEntity对象", description="机组-项目关联表") public class TurbineEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -38088185643803512L; + private static final long serialVersionUID = -46471985197840891L; + @ExcelProperty("机组号") @ApiModelProperty("机组号") - @TableId(value = "turbine_id", type = IdType.ASSIGN_ID) - private String turbineId; + @TableId(value = "turbine_code", type = IdType.ASSIGN_ID) + private String turbineCode; + @ExcelProperty("项目id") @ApiModelProperty("项目id") @TableField("project_id") private String projectId; - - @ApiModelProperty("机组名称") - @TableField("turbine_name") - private String turbineName; - - @ApiModelProperty("机组描述") - @TableField("turbine_desc") - private String turbineDesc; - - @ApiModelProperty("机组厂商") - @TableField("manufacturer") - private String manufacturer; - - @ApiModelProperty("机组型号") - @TableField("model") - private String model; } diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java b/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java index 08cf9e7..28df2c7 100644 --- a/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java +++ b/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.entity; +import java.math.BigDecimal; import java.io.Serializable; import com.baomidou.mybatisplus.annotation.*; @@ -8,10 +9,11 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 天气类型表实体类 */ @Data @@ -20,18 +22,21 @@ import lombok.EqualsAndHashCode; @ApiModel(value="WeatherTypeEntity对象", description="天气类型表") public class WeatherTypeEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 736371527640486906L; + private static final long serialVersionUID = -74787545166894805L; + @ExcelProperty("天气类型id") @ApiModelProperty("天气类型id") @TableId(value = "weather_code", type = IdType.ASSIGN_ID) private String weatherCode; + @ExcelProperty("天气类型中文描述") @ApiModelProperty("天气类型中文描述") @TableField("chinese_name") private String chineseName; + @ExcelProperty("对施工进度的影响系数") @ApiModelProperty("对施工进度的影响系数") @TableField("impact_factor") - private Double impactFactor; + private BigDecimal impactFactor; } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java index 147cce4..69d7add 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 字典请求实体 */ @Data @ApiModel("字典列表请求实体") public class CombinedDictListReq implements Serializable { - private static final long serialVersionUID = 194796910937180049L; + private static final long serialVersionUID = -71621812451720363L; @ApiModelProperty("查询关键字") private String keyword; @@ -36,7 +36,7 @@ public class CombinedDictListReq implements Serializable { private Integer sortOrder; @ApiModelProperty("是否字典终值") - private Integer finalState; + private Boolean finalState; } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java index 45eb1db..4ab3d92 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.CombinedDictEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 字典响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java new file mode 100644 index 0000000..3e99c72 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java @@ -0,0 +1,42 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组信息请求实体 + */ +@Data +@ApiModel("机组信息列表请求实体") +public class CrewListReq implements Serializable { + + private static final long serialVersionUID = 322835125942914057L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("机组信息Id") + private String crewId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组名称") + private String crewName; + + @ApiModelProperty("机组描述") + private String crewDesc; + + @ApiModelProperty("机组厂商") + private String manufacturer; + + @ApiModelProperty("机组型号") + private String model; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java new file mode 100644 index 0000000..acd9a26 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.CrewEntity; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("机组信息响应实体") +public class CrewResp extends CrewEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 38a1802..d8196bf 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -1,6 +1,5 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; import java.io.Serializable; import io.swagger.annotations.ApiModel; @@ -9,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 缺陷记录请求实体 */ @Data @ApiModel("缺陷记录列表请求实体") public class DefectListReq implements Serializable { - private static final long serialVersionUID = 692832532969251285L; + private static final long serialVersionUID = 585419070823466048L; @ApiModelProperty("查询关键字") private String keyword; @@ -40,12 +39,12 @@ public class DefectListReq implements Serializable { private String defectLevel; @ApiModelProperty("轴向长度(mm)") - private BigDecimal axialLength; + private Object axialLength; @ApiModelProperty("弦向长度(mm)") - private BigDecimal chordLength; + private Object chordLength; - @ApiModelProperty("处理建议") + @ApiModelProperty("图片路径") private String imagePath; @ApiModelProperty("图片详情") diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java index 238214d..0a4ffac 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java @@ -1,6 +1,5 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; @@ -8,7 +7,7 @@ import com.dite.znpt.domain.entity.DefectEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 缺陷记录响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java index 3fa10ac..eef330e 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 文件信息请求实体 */ @Data @ApiModel("文件信息列表请求实体") public class FileInfoListReq implements Serializable { - private static final long serialVersionUID = -78389740283645796L; + private static final long serialVersionUID = 574018420246881535L; @ApiModelProperty("查询关键字") private String keyword; @@ -29,5 +29,8 @@ public class FileInfoListReq implements Serializable { @ApiModelProperty("minio相对路径") private String minioPath; + @ApiModelProperty("业务类型,字典file_business_type") + private String businessType; + } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java index 7586540..b01b426 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.FileInfoEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 文件信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java new file mode 100644 index 0000000..ac11584 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java @@ -0,0 +1,51 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 请求实体 + */ +@Data +@ApiModel("列表请求实体") +public class PartListReq implements Serializable { + + private static final long serialVersionUID = 118135700439578757L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("Id") + private String partId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组id") + private String crewId; + + @ApiModelProperty("名称") + private String partName; + + @ApiModelProperty("编号") + private String partCode; + + @ApiModelProperty("类型,字典part_type") + private String partType; + + @ApiModelProperty("描述") + private String partDesc; + + @ApiModelProperty("厂商") + private String manufacturer; + + @ApiModelProperty("型号") + private String model; + +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java new file mode 100644 index 0000000..92a5f7b --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.PartEntity; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("响应实体") +public class PartResp extends PartEntity { +} + diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java index 35c0f7b..5ab3c92 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 人员信息请求实体 */ @Data @ApiModel("人员信息列表请求实体") public class PersonnelListReq implements Serializable { - private static final long serialVersionUID = -82418737525015596L; + private static final long serialVersionUID = -10363935468256543L; @ApiModelProperty("查询关键字") private String keyword; @@ -35,5 +35,8 @@ public class PersonnelListReq implements Serializable { @ApiModelProperty("密码") private String password; + @ApiModelProperty("1正常0禁用") + private Integer status; + } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java index 77c50e4..c66e1fa 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.PersonnelEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 人员信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java index 14c37ef..315760e 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 项目-公司关联信息请求实体 */ @Data @ApiModel("项目-公司关联信息列表请求实体") public class ProjectCompanyListReq implements Serializable { - private static final long serialVersionUID = -62483123283940291L; + private static final long serialVersionUID = 598388421634125600L; @ApiModelProperty("查询关键字") private String keyword; @@ -26,7 +26,7 @@ public class ProjectCompanyListReq implements Serializable { @ApiModelProperty("公司id") private String companyId; - @ApiModelProperty("关联类型") + @ApiModelProperty("单位类型(检查/委托)") private String relationType; } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java index d13ba5e..5acb104 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.ProjectCompanyEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 项目-公司关联信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java index 4cbf2b8..1802c44 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 项目信息请求实体 */ @Data @ApiModel("项目信息列表请求实体") public class ProjectListReq implements Serializable { - private static final long serialVersionUID = -18175772339033037L; + private static final long serialVersionUID = -74121355744234753L; @ApiModelProperty("查询关键字") private String keyword; @@ -32,10 +32,7 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("风场地址") private String farmAddress; - @ApiModelProperty("${column.comment}") - private String clientId; - - @ApiModelProperty("xx,字典xx") + @ApiModelProperty("检查方式,字典method_id") private String methodId; @ApiModelProperty("项目规模") @@ -44,5 +41,8 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("风机型号") private String turbineModel; + @ApiModelProperty("项目状态,字典project_status") + private String status; + } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java index ad8880a..e09d322 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.ProjectEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 项目信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java index b42ab31..d8fbd73 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 公司信息请求实体 */ @Data @ApiModel("公司信息列表请求实体") public class TCompanyListReq implements Serializable { - private static final long serialVersionUID = 948606394919949641L; + private static final long serialVersionUID = 710069618133737043L; @ApiModelProperty("查询关键字") private String keyword; @@ -29,5 +29,11 @@ public class TCompanyListReq implements Serializable { @ApiModelProperty("公司地址") private String address; + @ApiModelProperty("联系人") + private String contact; + + @ApiModelProperty("电话") + private String phone; + } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java index 05eb171..77735d0 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.TCompanyEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 公司信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java index b39bc7f..da90917 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.util.Date; import java.io.Serializable; import io.swagger.annotations.ApiModel; @@ -9,14 +10,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 施工信息请求实体 */ @Data @ApiModel("施工信息列表请求实体") public class TConstructionListReq implements Serializable { - private static final long serialVersionUID = -21906313443453398L; + private static final long serialVersionUID = -20191616975838303L; @ApiModelProperty("查询关键字") private String keyword; @@ -31,16 +32,16 @@ public class TConstructionListReq implements Serializable { private String turbineCode; @ApiModelProperty("作业开始时间") - private LocalDateTime startTime; + private Date startTime; @ApiModelProperty("作业结束时间") - private LocalDateTime endTime; + private Date endTime; @ApiModelProperty("温度(℃)") - private Double temperature; + private BigDecimal temperature; @ApiModelProperty("风速(m/s)") - private Double windSpeed; + private BigDecimal windSpeed; @ApiModelProperty("采集图片数量") private Integer imageCount; @@ -48,11 +49,11 @@ public class TConstructionListReq implements Serializable { @ApiModelProperty("天气id") private String weatherCode; - @ApiModelProperty("${column.comment}") + @ApiModelProperty("施工状态") private String statusId; - @ApiModelProperty("${column.comment}") - private LocalDateTime createdAt; + @ApiModelProperty("当前时间") + private Date createdAt; } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java index 41fe047..c1b245a 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.util.Date; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; @@ -8,7 +9,7 @@ import com.dite.znpt.domain.entity.TConstructionEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 施工信息响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java index fa23a69..cbb3ec3 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java @@ -8,14 +8,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 机组-项目关联请求实体 */ @Data @ApiModel("机组-项目关联列表请求实体") public class TurbineListReq implements Serializable { - private static final long serialVersionUID = -35973498612681953L; + private static final long serialVersionUID = 141552424945497346L; @ApiModelProperty("查询关键字") private String keyword; diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java index f7d687e..2d9e8d4 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java @@ -7,7 +7,7 @@ import com.dite.znpt.domain.entity.TurbineEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 机组-项目关联响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java index a3f49c7..1b52f12 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import java.math.BigDecimal; import java.io.Serializable; import io.swagger.annotations.ApiModel; @@ -8,14 +9,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 天气类型请求实体 */ @Data @ApiModel("天气类型列表请求实体") public class WeatherTypeListReq implements Serializable { - private static final long serialVersionUID = 959320839630572326L; + private static final long serialVersionUID = 902447691868906681L; @ApiModelProperty("查询关键字") private String keyword; @@ -27,7 +28,7 @@ public class WeatherTypeListReq implements Serializable { private String chineseName; @ApiModelProperty("对施工进度的影响系数") - private Double impactFactor; + private BigDecimal impactFactor; } diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java index 7da231c..d17c5bc 100644 --- a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java +++ b/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import java.math.BigDecimal; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; @@ -7,7 +8,7 @@ import com.dite.znpt.domain.entity.WeatherTypeEntity; /** * @author huise23 - * @date 2025/04/09 14:39 + * @date 2025/04/11 23:17 * @Description: 天气类型响应实体 */ @Data diff --git a/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java b/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java index ed392ef..c67a97c 100644 --- a/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java +++ b/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java @@ -21,13 +21,13 @@ public class RestResponseEntityExceptionHandler { @ExceptionHandler(Exception.class) public final Result handler(Exception e) { logger.error("出现系统异常:{},异常类型:{},详细堆栈:", e.getMessage(), e.getClass(), e); - return Result.warn(Constants.SYSTEM_EXCEPTION, Constants.SERVICE_EXCEPTION_MESSAGE); + return Result.error(Constants.SYSTEM_EXCEPTION, Constants.SERVICE_EXCEPTION_MESSAGE); } @ExceptionHandler(ServiceException.class) public final Result handler(ServiceException e) { logger.error("出现服务异常:{},异常类型:{},详细堆栈:", e.getMessage(), e.getClass(), e); - return Result.warn(Constants.SERVICE_EXCEPTION, e.getMessage()); + return Result.error(Constants.SERVICE_EXCEPTION, e.getMessage()); } /** @@ -46,6 +46,6 @@ public class RestResponseEntityExceptionHandler { sb.append(fieldError.getField()).append(fieldError.getDefaultMessage()).append(";"); }); - return Result.warn(Constants.PARAMETER_EXCEPTION, sb.toString()); + return Result.error(Constants.PARAMETER_EXCEPTION, sb.toString()); } } diff --git a/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java b/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java index fc675b7..050189a 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 字典表数据库访问层 */ public interface CombinedDictMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java b/demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java new file mode 100644 index 0000000..c53cf2a --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.CrewEntity; +import com.dite.znpt.domain.vo.CrewListReq; +import com.dite.znpt.domain.vo.CrewResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组信息表数据库访问层 + */ +public interface CrewMapper extends BaseMapper { + List queryBySelective(CrewListReq crewReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java b/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java index 0e9ca4c..bce5487 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 缺陷记录表数据库访问层 */ public interface DefectMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java b/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java index f99bd74..a286ad5 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 文件信息表数据库访问层 */ public interface FileInfoMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/PartMapper.java b/demo/src/main/java/com/dite/znpt/mapper/PartMapper.java new file mode 100644 index 0000000..5027739 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/mapper/PartMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 表数据库访问层 + */ +public interface PartMapper extends BaseMapper { + List queryBySelective(PartListReq partReq); +} + diff --git a/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java b/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java index 1e34ad2..dbe7318 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 人员信息表数据库访问层 */ public interface PersonnelMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java b/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java index ff5c8e7..bbbab25 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 项目-公司关联信息表数据库访问层 */ public interface ProjectCompanyMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java b/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java index 6344ba7..5616a49 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 项目信息表数据库访问层 */ public interface ProjectMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java index 8e45f04..a1fd45f 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 公司信息表数据库访问层 */ public interface TCompanyMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java index 9f8680b..4a15ec0 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 施工信息表数据库访问层 */ public interface TConstructionMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java b/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java index 1e70fb8..c4cb3be 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 机组-项目关联表数据库访问层 */ public interface TurbineMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java b/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java index 0d7e279..c9c3045 100644 --- a/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java +++ b/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 天气类型表数据库访问层 */ public interface WeatherTypeMapper extends BaseMapper { diff --git a/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java b/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java index 88db860..41fbcf0 100644 --- a/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java +++ b/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.CombinedDictEntity; import com.dite.znpt.domain.vo.CombinedDictListReq; import com.dite.znpt.domain.vo.CombinedDictResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 字典表服务接口 */ public interface CombinedDictService extends IService { @@ -21,9 +20,9 @@ public interface CombinedDictService extends IService { * @param combinedDictReq 字典 * @return {@link List }<{@link CombinedDictEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(CombinedDictListReq combinedDictReq); + List selectList(CombinedDictListReq combinedDictReq); /** * 功能描述:查询单条字典 @@ -31,7 +30,7 @@ public interface CombinedDictService extends IService { * @param dictId 字典Id * @return {@link CombinedDictResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ CombinedDictResp selectById(String dictId); @@ -40,7 +39,7 @@ public interface CombinedDictService extends IService { * * @param combinedDict 字典 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(CombinedDictEntity combinedDict); @@ -49,7 +48,7 @@ public interface CombinedDictService extends IService { * * @param combinedDict 字典 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(CombinedDictEntity combinedDict); @@ -58,7 +57,7 @@ public interface CombinedDictService extends IService { * * @param dictId 字典Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String dictId); } diff --git a/demo/src/main/java/com/dite/znpt/service/CrewService.java b/demo/src/main/java/com/dite/znpt/service/CrewService.java new file mode 100644 index 0000000..4b270f7 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/CrewService.java @@ -0,0 +1,64 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.CrewEntity; +import com.dite.znpt.domain.vo.CrewListReq; +import com.dite.znpt.domain.vo.CrewResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组信息表服务接口 + */ +public interface CrewService extends IService { + + /** + * 功能描述:查询机组信息列表 + * + * @param crewReq 机组信息 + * @return {@link List }<{@link CrewEntity }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List selectList(CrewListReq crewReq); + + /** + * 功能描述:查询单条机组信息 + * + * @param crewId 机组信息Id + * @return {@link CrewResp } + * @author huise23 + * @date 2025/04/11 23:17 + **/ + CrewResp selectById(String crewId); + + /** + * 功能描述:新增机组信息 + * + * @param crew 机组信息 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void saveData(CrewEntity crew); + + /** + * 功能描述:更新机组信息 + * + * @param crew 机组信息 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void updateData(CrewEntity crew); + + /** + * 功能描述:删除机组信息 + * + * @param crewId 机组信息Id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteById(String crewId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/DefectService.java b/demo/src/main/java/com/dite/znpt/service/DefectService.java index 8b7593e..e850720 100644 --- a/demo/src/main/java/com/dite/znpt/service/DefectService.java +++ b/demo/src/main/java/com/dite/znpt/service/DefectService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; import com.dite.znpt.domain.vo.DefectResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 缺陷记录表服务接口 */ public interface DefectService extends IService { @@ -21,9 +20,9 @@ public interface DefectService extends IService { * @param defectReq 缺陷记录 * @return {@link List }<{@link DefectEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(DefectListReq defectReq); + List selectList(DefectListReq defectReq); /** * 功能描述:查询单条缺陷记录 @@ -31,7 +30,7 @@ public interface DefectService extends IService { * @param defectId 缺陷记录Id * @return {@link DefectResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ DefectResp selectById(String defectId); @@ -40,7 +39,7 @@ public interface DefectService extends IService { * * @param defect 缺陷记录 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(DefectEntity defect); @@ -49,7 +48,7 @@ public interface DefectService extends IService { * * @param defect 缺陷记录 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(DefectEntity defect); @@ -58,7 +57,7 @@ public interface DefectService extends IService { * * @param defectId 缺陷记录Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String defectId); } diff --git a/demo/src/main/java/com/dite/znpt/service/FileInfoService.java b/demo/src/main/java/com/dite/znpt/service/FileInfoService.java index ad8bbfe..469bc27 100644 --- a/demo/src/main/java/com/dite/znpt/service/FileInfoService.java +++ b/demo/src/main/java/com/dite/znpt/service/FileInfoService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.FileInfoEntity; import com.dite.znpt.domain.vo.FileInfoListReq; import com.dite.znpt.domain.vo.FileInfoResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 文件信息表服务接口 */ public interface FileInfoService extends IService { @@ -21,9 +20,9 @@ public interface FileInfoService extends IService { * @param fileInfoReq 文件信息 * @return {@link List }<{@link FileInfoEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(FileInfoListReq fileInfoReq); + List selectList(FileInfoListReq fileInfoReq); /** * 功能描述:查询单条文件信息 @@ -31,7 +30,7 @@ public interface FileInfoService extends IService { * @param fileId 文件信息Id * @return {@link FileInfoResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ FileInfoResp selectById(Long fileId); @@ -40,7 +39,7 @@ public interface FileInfoService extends IService { * * @param fileInfo 文件信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(FileInfoEntity fileInfo); @@ -49,7 +48,7 @@ public interface FileInfoService extends IService { * * @param fileInfo 文件信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(FileInfoEntity fileInfo); @@ -58,7 +57,7 @@ public interface FileInfoService extends IService { * * @param fileId 文件信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(Long fileId); } diff --git a/demo/src/main/java/com/dite/znpt/service/PartService.java b/demo/src/main/java/com/dite/znpt/service/PartService.java new file mode 100644 index 0000000..9bbe22f --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/PartService.java @@ -0,0 +1,64 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 表服务接口 + */ +public interface PartService extends IService { + + /** + * 功能描述:查询列表 + * + * @param partReq + * @return {@link List }<{@link PartEntity }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List selectList(PartListReq partReq); + + /** + * 功能描述:查询单条 + * + * @param partId Id + * @return {@link PartResp } + * @author huise23 + * @date 2025/04/11 23:17 + **/ + PartResp selectById(String partId); + + /** + * 功能描述:新增 + * + * @param part + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void saveData(PartEntity part); + + /** + * 功能描述:更新 + * + * @param part + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void updateData(PartEntity part); + + /** + * 功能描述:删除 + * + * @param partId Id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteById(String partId); +} + diff --git a/demo/src/main/java/com/dite/znpt/service/PersonnelService.java b/demo/src/main/java/com/dite/znpt/service/PersonnelService.java index 641637f..2717734 100644 --- a/demo/src/main/java/com/dite/znpt/service/PersonnelService.java +++ b/demo/src/main/java/com/dite/znpt/service/PersonnelService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.PersonnelEntity; import com.dite.znpt.domain.vo.PersonnelListReq; import com.dite.znpt.domain.vo.PersonnelResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 人员信息表服务接口 */ public interface PersonnelService extends IService { @@ -21,9 +20,9 @@ public interface PersonnelService extends IService { * @param personnelReq 人员信息 * @return {@link List }<{@link PersonnelEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(PersonnelListReq personnelReq); + List selectList(PersonnelListReq personnelReq); /** * 功能描述:查询单条人员信息 @@ -31,7 +30,7 @@ public interface PersonnelService extends IService { * @param personId 人员信息Id * @return {@link PersonnelResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ PersonnelResp selectById(String personId); @@ -40,7 +39,7 @@ public interface PersonnelService extends IService { * * @param personnel 人员信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(PersonnelEntity personnel); @@ -49,7 +48,7 @@ public interface PersonnelService extends IService { * * @param personnel 人员信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(PersonnelEntity personnel); @@ -58,7 +57,7 @@ public interface PersonnelService extends IService { * * @param personId 人员信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String personId); } diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java b/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java index 3cf64e0..f6b0754 100644 --- a/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java +++ b/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ProjectCompanyEntity; import com.dite.znpt.domain.vo.ProjectCompanyListReq; import com.dite.znpt.domain.vo.ProjectCompanyResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 项目-公司关联信息表服务接口 */ public interface ProjectCompanyService extends IService { @@ -21,9 +20,9 @@ public interface ProjectCompanyService extends IService { * @param projectCompanyReq 项目-公司关联信息 * @return {@link List }<{@link ProjectCompanyEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(ProjectCompanyListReq projectCompanyReq); + List selectList(ProjectCompanyListReq projectCompanyReq); /** * 功能描述:查询单条项目-公司关联信息 @@ -31,7 +30,7 @@ public interface ProjectCompanyService extends IService { * @param projectId 项目-公司关联信息Id * @return {@link ProjectCompanyResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ ProjectCompanyResp selectById(String projectId); @@ -40,7 +39,7 @@ public interface ProjectCompanyService extends IService { * * @param projectCompany 项目-公司关联信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(ProjectCompanyEntity projectCompany); @@ -49,7 +48,7 @@ public interface ProjectCompanyService extends IService { * * @param projectCompany 项目-公司关联信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(ProjectCompanyEntity projectCompany); @@ -58,7 +57,7 @@ public interface ProjectCompanyService extends IService { * * @param projectId 项目-公司关联信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String projectId); } diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectService.java b/demo/src/main/java/com/dite/znpt/service/ProjectService.java index b45b3e5..ef5e305 100644 --- a/demo/src/main/java/com/dite/znpt/service/ProjectService.java +++ b/demo/src/main/java/com/dite/znpt/service/ProjectService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 项目信息表服务接口 */ public interface ProjectService extends IService { @@ -21,9 +20,9 @@ public interface ProjectService extends IService { * @param projectReq 项目信息 * @return {@link List }<{@link ProjectEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(ProjectListReq projectReq); + List selectList(ProjectListReq projectReq); /** * 功能描述:查询单条项目信息 @@ -31,7 +30,7 @@ public interface ProjectService extends IService { * @param projectId 项目信息Id * @return {@link ProjectResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ ProjectResp selectById(String projectId); @@ -40,7 +39,7 @@ public interface ProjectService extends IService { * * @param project 项目信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(ProjectEntity project); @@ -49,7 +48,7 @@ public interface ProjectService extends IService { * * @param project 项目信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(ProjectEntity project); @@ -58,7 +57,7 @@ public interface ProjectService extends IService { * * @param projectId 项目信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String projectId); } diff --git a/demo/src/main/java/com/dite/znpt/service/TCompanyService.java b/demo/src/main/java/com/dite/znpt/service/TCompanyService.java index de983a4..99bba5c 100644 --- a/demo/src/main/java/com/dite/znpt/service/TCompanyService.java +++ b/demo/src/main/java/com/dite/znpt/service/TCompanyService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TCompanyEntity; import com.dite.znpt.domain.vo.TCompanyListReq; import com.dite.znpt.domain.vo.TCompanyResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 公司信息表服务接口 */ public interface TCompanyService extends IService { @@ -21,9 +20,9 @@ public interface TCompanyService extends IService { * @param tCompanyReq 公司信息 * @return {@link List }<{@link TCompanyEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(TCompanyListReq tCompanyReq); + List selectList(TCompanyListReq tCompanyReq); /** * 功能描述:查询单条公司信息 @@ -31,7 +30,7 @@ public interface TCompanyService extends IService { * @param companyId 公司信息Id * @return {@link TCompanyResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ TCompanyResp selectById(String companyId); @@ -40,7 +39,7 @@ public interface TCompanyService extends IService { * * @param tCompany 公司信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(TCompanyEntity tCompany); @@ -49,7 +48,7 @@ public interface TCompanyService extends IService { * * @param tCompany 公司信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(TCompanyEntity tCompany); @@ -58,7 +57,7 @@ public interface TCompanyService extends IService { * * @param companyId 公司信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String companyId); } diff --git a/demo/src/main/java/com/dite/znpt/service/TConstructionService.java b/demo/src/main/java/com/dite/znpt/service/TConstructionService.java index ee32972..0506feb 100644 --- a/demo/src/main/java/com/dite/znpt/service/TConstructionService.java +++ b/demo/src/main/java/com/dite/znpt/service/TConstructionService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TConstructionEntity; import com.dite.znpt.domain.vo.TConstructionListReq; import com.dite.znpt.domain.vo.TConstructionResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 施工信息表服务接口 */ public interface TConstructionService extends IService { @@ -21,9 +20,9 @@ public interface TConstructionService extends IService { * @param tConstructionReq 施工信息 * @return {@link List }<{@link TConstructionEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(TConstructionListReq tConstructionReq); + List selectList(TConstructionListReq tConstructionReq); /** * 功能描述:查询单条施工信息 @@ -31,7 +30,7 @@ public interface TConstructionService extends IService { * @param constructionId 施工信息Id * @return {@link TConstructionResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ TConstructionResp selectById(String constructionId); @@ -40,7 +39,7 @@ public interface TConstructionService extends IService { * * @param tConstruction 施工信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(TConstructionEntity tConstruction); @@ -49,7 +48,7 @@ public interface TConstructionService extends IService { * * @param tConstruction 施工信息 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(TConstructionEntity tConstruction); @@ -58,7 +57,7 @@ public interface TConstructionService extends IService { * * @param constructionId 施工信息Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String constructionId); } diff --git a/demo/src/main/java/com/dite/znpt/service/TurbineService.java b/demo/src/main/java/com/dite/znpt/service/TurbineService.java index 788ccb4..2424d0d 100644 --- a/demo/src/main/java/com/dite/znpt/service/TurbineService.java +++ b/demo/src/main/java/com/dite/znpt/service/TurbineService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.domain.vo.TurbineListReq; import com.dite.znpt.domain.vo.TurbineResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 机组-项目关联表服务接口 */ public interface TurbineService extends IService { @@ -21,9 +20,9 @@ public interface TurbineService extends IService { * @param turbineReq 机组-项目关联 * @return {@link List }<{@link TurbineEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(TurbineListReq turbineReq); + List selectList(TurbineListReq turbineReq); /** * 功能描述:查询单条机组-项目关联 @@ -31,7 +30,7 @@ public interface TurbineService extends IService { * @param turbineCode 机组-项目关联Id * @return {@link TurbineResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ TurbineResp selectById(String turbineCode); @@ -40,7 +39,7 @@ public interface TurbineService extends IService { * * @param turbine 机组-项目关联 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(TurbineEntity turbine); @@ -49,7 +48,7 @@ public interface TurbineService extends IService { * * @param turbine 机组-项目关联 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(TurbineEntity turbine); @@ -58,7 +57,7 @@ public interface TurbineService extends IService { * * @param turbineCode 机组-项目关联Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String turbineCode); } diff --git a/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java b/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java index b075f7d..eedc420 100644 --- a/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java +++ b/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.WeatherTypeEntity; import com.dite.znpt.domain.vo.WeatherTypeListReq; import com.dite.znpt.domain.vo.WeatherTypeResp; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 天气类型表服务接口 */ public interface WeatherTypeService extends IService { @@ -21,9 +20,9 @@ public interface WeatherTypeService extends IService { * @param weatherTypeReq 天气类型 * @return {@link List }<{@link WeatherTypeEntity }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ - PageInfo selectList(WeatherTypeListReq weatherTypeReq); + List selectList(WeatherTypeListReq weatherTypeReq); /** * 功能描述:查询单条天气类型 @@ -31,7 +30,7 @@ public interface WeatherTypeService extends IService { * @param weatherCode 天气类型Id * @return {@link WeatherTypeResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ WeatherTypeResp selectById(String weatherCode); @@ -40,7 +39,7 @@ public interface WeatherTypeService extends IService { * * @param weatherType 天气类型 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void saveData(WeatherTypeEntity weatherType); @@ -49,7 +48,7 @@ public interface WeatherTypeService extends IService { * * @param weatherType 天气类型 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void updateData(WeatherTypeEntity weatherType); @@ -58,7 +57,7 @@ public interface WeatherTypeService extends IService { * * @param weatherCode 天气类型Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ void deleteById(String weatherCode); } diff --git a/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java index 3b9cd88..a22e5ae 100644 --- a/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java +++ b/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java @@ -10,13 +10,12 @@ import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 字典表服务实现类 */ @Service @@ -27,18 +26,18 @@ public class CombinedDictServiceImpl extends ServiceImpl + * @return {@link List }<{@link CombinedDictResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(CombinedDictListReq combinedDictReq) { + public List selectList(CombinedDictListReq combinedDictReq) { PageUtil.startPage(); List combinedDictList= this.baseMapper.queryBySelective(combinedDictReq); combinedDictList.forEach(resp -> { }); - return new PageInfo<>(combinedDictList); + return combinedDictList; } /** @@ -47,15 +46,15 @@ public class CombinedDictServiceImpl extends ServiceImpl page = selectList(combinedDictReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new CombinedDictResp(); + List list = selectList(combinedDictReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new CombinedDictResp(); } /** @@ -63,7 +62,7 @@ public class CombinedDictServiceImpl extends ServiceImpl implements CrewService { + + /** + * 功能描述:查询机组信息列表 + * + * @param crewReq 机组信息信息 + * @return {@link List }<{@link CrewResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List selectList(CrewListReq crewReq) { + PageUtil.startPage(); + List crewList= this.baseMapper.queryBySelective(crewReq); + crewList.forEach(resp -> { + + }); + return crewList; + } + + /** + * 功能描述:查询单条机组信息 + * + * @param crewId 机组信息Id + * @return {@link CrewResp } + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public CrewResp selectById(String crewId) { + CrewListReq crewReq = new CrewListReq(); + crewReq.setCrewId(crewId); + + List list = selectList(crewReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new CrewResp(); + } + + /** + * 功能描述:新增机组信息 + * + * @param crew 机组信息 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void saveData(CrewEntity crew) { +// todo 校验 + save(crew); + } + + /** + * 功能描述:更新机组信息 + * + * @param crew 机组信息 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void updateData(CrewEntity crew) { +// todo 校验 + updateById(crew); + } + + /** + * 功能描述:删除机组信息 + * + * @param crewId 机组信息Id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void deleteById(String crewId) { +// todo 校验 + removeById(crewId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index e5a1421..0764847 100644 --- a/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -10,13 +10,12 @@ import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 缺陷记录表服务实现类 */ @Service @@ -27,18 +26,18 @@ public class DefectServiceImpl extends ServiceImpl i * 功能描述:查询缺陷记录列表 * * @param defectReq 缺陷记录信息 - * @return {@link PageInfo }<{@link DefectResp }> + * @return {@link List }<{@link DefectResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(DefectListReq defectReq) { + public List selectList(DefectListReq defectReq) { PageUtil.startPage(); List defectList= this.baseMapper.queryBySelective(defectReq); defectList.forEach(resp -> { }); - return new PageInfo<>(defectList); + return defectList; } /** @@ -47,15 +46,15 @@ public class DefectServiceImpl extends ServiceImpl i * @param defectId 缺陷记录Id * @return {@link DefectResp } * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override public DefectResp selectById(String defectId) { DefectListReq defectReq = new DefectListReq(); defectReq.setDefectId(defectId); - PageInfo page = selectList(defectReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new DefectResp(); + List list = selectList(defectReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new DefectResp(); } /** @@ -63,7 +62,7 @@ public class DefectServiceImpl extends ServiceImpl i * * @param defect 缺陷记录 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override public void saveData(DefectEntity defect) { @@ -76,7 +75,7 @@ public class DefectServiceImpl extends ServiceImpl i * * @param defect 缺陷记录 * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override public void updateData(DefectEntity defect) { @@ -89,7 +88,7 @@ public class DefectServiceImpl extends ServiceImpl i * * @param defectId 缺陷记录Id * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override public void deleteById(String defectId) { diff --git a/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java index fbc992e..383dae9 100644 --- a/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java +++ b/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java @@ -10,13 +10,12 @@ import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 文件信息表服务实现类 */ @Service @@ -27,18 +26,18 @@ public class FileInfoServiceImpl extends ServiceImpl + * @return {@link List }<{@link FileInfoResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(FileInfoListReq fileInfoReq) { + public List selectList(FileInfoListReq fileInfoReq) { PageUtil.startPage(); List fileInfoList= this.baseMapper.queryBySelective(fileInfoReq); fileInfoList.forEach(resp -> { }); - return new PageInfo<>(fileInfoList); + return fileInfoList; } /** @@ -47,15 +46,15 @@ public class FileInfoServiceImpl extends ServiceImpl page = selectList(fileInfoReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new FileInfoResp(); + List list = selectList(fileInfoReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new FileInfoResp(); } /** @@ -63,7 +62,7 @@ public class FileInfoServiceImpl extends ServiceImpl implements PartService { + + /** + * 功能描述:查询列表 + * + * @param partReq 信息 + * @return {@link List }<{@link PartResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List selectList(PartListReq partReq) { + PageUtil.startPage(); + List partList= this.baseMapper.queryBySelective(partReq); + partList.forEach(resp -> { + + }); + return partList; + } + + /** + * 功能描述:查询单条 + * + * @param partId Id + * @return {@link PartResp } + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public PartResp selectById(String partId) { + PartListReq partReq = new PartListReq(); + partReq.setPartId(partId); + + List list = selectList(partReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new PartResp(); + } + + /** + * 功能描述:新增 + * + * @param part + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void saveData(PartEntity part) { +// todo 校验 + save(part); + } + + /** + * 功能描述:更新 + * + * @param part + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void updateData(PartEntity part) { +// todo 校验 + updateById(part); + } + + /** + * 功能描述:删除 + * + * @param partId Id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void deleteById(String partId) { +// todo 校验 + removeById(partId); + } + +} diff --git a/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java b/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java index 1a10d93..f352d90 100644 --- a/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java +++ b/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java @@ -10,13 +10,12 @@ import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; import java.util.List; /** * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 * @Description: 人员信息表服务实现类 */ @Service @@ -27,18 +26,18 @@ public class PersonnelServiceImpl extends ServiceImpl + * @return {@link List }<{@link PersonnelResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(PersonnelListReq personnelReq) { + public List selectList(PersonnelListReq personnelReq) { PageUtil.startPage(); List personnelList= this.baseMapper.queryBySelective(personnelReq); personnelList.forEach(resp -> { }); - return new PageInfo<>(personnelList); + return personnelList; } /** @@ -47,15 +46,15 @@ public class PersonnelServiceImpl extends ServiceImpl page = selectList(personnelReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new PersonnelResp(); + List list = selectList(personnelReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new PersonnelResp(); } /** @@ -63,7 +62,7 @@ public class PersonnelServiceImpl extends ServiceImpl + * @return {@link List }<{@link ProjectCompanyResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(ProjectCompanyListReq projectCompanyReq) { + public List selectList(ProjectCompanyListReq projectCompanyReq) { PageUtil.startPage(); List projectCompanyList= this.baseMapper.queryBySelective(projectCompanyReq); projectCompanyList.forEach(resp -> { }); - return new PageInfo<>(projectCompanyList); + return projectCompanyList; } /** @@ -47,15 +46,15 @@ public class ProjectCompanyServiceImpl extends ServiceImpl page = selectList(projectCompanyReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new ProjectCompanyResp(); + List list = selectList(projectCompanyReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectCompanyResp(); } /** @@ -63,7 +62,7 @@ public class ProjectCompanyServiceImpl extends ServiceImpl + * @return {@link List }<{@link ProjectResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(ProjectListReq projectReq) { + public List selectList(ProjectListReq projectReq) { PageUtil.startPage(); List projectList= this.baseMapper.queryBySelective(projectReq); projectList.forEach(resp -> { }); - return new PageInfo<>(projectList); + return projectList; } /** @@ -47,15 +46,15 @@ public class ProjectServiceImpl extends ServiceImpl page = selectList(projectReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new ProjectResp(); + List list = selectList(projectReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectResp(); } /** @@ -63,7 +62,7 @@ public class ProjectServiceImpl extends ServiceImpl + * @return {@link List }<{@link TCompanyResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(TCompanyListReq tCompanyReq) { + public List selectList(TCompanyListReq tCompanyReq) { PageUtil.startPage(); List tCompanyList= this.baseMapper.queryBySelective(tCompanyReq); tCompanyList.forEach(resp -> { }); - return new PageInfo<>(tCompanyList); + return tCompanyList; } /** @@ -47,15 +46,15 @@ public class TCompanyServiceImpl extends ServiceImpl page = selectList(tCompanyReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TCompanyResp(); + List list = selectList(tCompanyReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new TCompanyResp(); } /** @@ -63,7 +62,7 @@ public class TCompanyServiceImpl extends ServiceImpl + * @return {@link List }<{@link TConstructionResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(TConstructionListReq tConstructionReq) { + public List selectList(TConstructionListReq tConstructionReq) { PageUtil.startPage(); List tConstructionList= this.baseMapper.queryBySelective(tConstructionReq); tConstructionList.forEach(resp -> { }); - return new PageInfo<>(tConstructionList); + return tConstructionList; } /** @@ -47,15 +46,15 @@ public class TConstructionServiceImpl extends ServiceImpl page = selectList(tConstructionReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TConstructionResp(); + List list = selectList(tConstructionReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new TConstructionResp(); } /** @@ -63,7 +62,7 @@ public class TConstructionServiceImpl extends ServiceImpl + * @return {@link List }<{@link TurbineResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(TurbineListReq turbineReq) { + public List selectList(TurbineListReq turbineReq) { PageUtil.startPage(); List turbineList= this.baseMapper.queryBySelective(turbineReq); turbineList.forEach(resp -> { }); - return new PageInfo<>(turbineList); + return turbineList; } /** @@ -47,15 +46,15 @@ public class TurbineServiceImpl extends ServiceImpl page = selectList(turbineReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new TurbineResp(); + List list = selectList(turbineReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new TurbineResp(); } /** @@ -63,7 +62,7 @@ public class TurbineServiceImpl extends ServiceImpl + * @return {@link List }<{@link WeatherTypeResp }> * @author huise23 - * @date 2025/04/09 11:48 + * @date 2025/04/11 23:17 **/ @Override - public PageInfo selectList(WeatherTypeListReq weatherTypeReq) { + public List selectList(WeatherTypeListReq weatherTypeReq) { PageUtil.startPage(); List weatherTypeList= this.baseMapper.queryBySelective(weatherTypeReq); weatherTypeList.forEach(resp -> { }); - return new PageInfo<>(weatherTypeList); + return weatherTypeList; } /** @@ -47,15 +46,15 @@ public class WeatherTypeServiceImpl extends ServiceImpl page = selectList(weatherTypeReq); - return page.hasContent() ? CollUtil.getFirst(page.getList()) : new WeatherTypeResp(); + List list = selectList(weatherTypeReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new WeatherTypeResp(); } /** @@ -63,7 +62,7 @@ public class WeatherTypeServiceImpl extends ServiceImpl + + + + + a.crew_id, a.project_id, a.crew_name, a.crew_desc, + a.manufacturer, a.model + + + + + diff --git a/demo/src/main/resources/mapper/FileInfoMapper.xml b/demo/src/main/resources/mapper/FileInfoMapper.xml index 78f16bd..64585d3 100644 --- a/demo/src/main/resources/mapper/FileInfoMapper.xml +++ b/demo/src/main/resources/mapper/FileInfoMapper.xml @@ -3,7 +3,7 @@ - a.file_id, a.business_id, a.minio_path + a.file_id, a.business_id, a.minio_path, a.business_type diff --git a/demo/src/main/resources/mapper/PartMapper.xml b/demo/src/main/resources/mapper/PartMapper.xml new file mode 100644 index 0000000..d82ce6f --- /dev/null +++ b/demo/src/main/resources/mapper/PartMapper.xml @@ -0,0 +1,49 @@ + + + + + + a.part_id, a.project_id, a.crew_id, a.part_name, + a.part_code, a.part_type, a.part_desc, a.manufacturer, + a.model + + + + + diff --git a/demo/src/main/resources/mapper/PersonnelMapper.xml b/demo/src/main/resources/mapper/PersonnelMapper.xml index a74e8f8..fd9c553 100644 --- a/demo/src/main/resources/mapper/PersonnelMapper.xml +++ b/demo/src/main/resources/mapper/PersonnelMapper.xml @@ -4,7 +4,7 @@ a.person_id, a.name, a.role_type, a.company_id, - a.password + a.password, a.status diff --git a/demo/src/main/resources/mapper/ProjectMapper.xml b/demo/src/main/resources/mapper/ProjectMapper.xml index 7b91da0..d3b28cc 100644 --- a/demo/src/main/resources/mapper/ProjectMapper.xml +++ b/demo/src/main/resources/mapper/ProjectMapper.xml @@ -4,7 +4,7 @@ a.project_id, a.project_name, a.farm_name, a.farm_address, - a.client_id, a.method_id, a.scale, a.turbine_model + a.method_id, a.scale, a.turbine_model, a.status diff --git a/demo/src/main/resources/mapper/TCompanyMapper.xml b/demo/src/main/resources/mapper/TCompanyMapper.xml index 30c6c76..82f9437 100644 --- a/demo/src/main/resources/mapper/TCompanyMapper.xml +++ b/demo/src/main/resources/mapper/TCompanyMapper.xml @@ -3,7 +3,8 @@ - a.company_id, a.company_name, a.address + a.company_id, a.company_name, a.address, a.contact, + a.phone From 07fd0581ee7f17e27fad281fdcaa88049dbd00a2 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 18 Apr 2025 20:37:01 +0800 Subject: [PATCH 004/143] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0sip=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/.gitattributes => .gitattributes | 0 demo/.gitignore => .gitignore | 2 +- demo/mvnw | 259 ------ demo/mvnw.cmd | 149 --- demo/pom.xml | 31 +- .../java/com/dite/znpt/domain/Constants.java | 4 +- .../java/com/dite/znpt/domain/Result.java | 8 + .../com/dite/znpt/service/RedisService.java | 342 +++++++ pom.xml | 53 ++ sip/pom.xml | 58 ++ .../monitor/config/MediaFormatConfig.java | 30 + .../dite/znpt/monitor/constant/Constants.java | 37 + .../monitor/constant/IotCacheConstants.java | 37 + .../monitor/constant/IotDictConstants.java | 20 + .../znpt/monitor/constant/IotRespMessage.java | 113 +++ .../monitor/constant/dict/CameraType.java | 32 + .../monitor/constant/dict/DeviceStatus.java | 34 + .../constant/dict/SipTransferMode.java | 26 + .../constant/dict/StreamTransferMode.java | 27 + .../monitor/constant/dict/ValueAndLabel.java | 14 + .../znpt/monitor/constant/dict/YesOrNo.java | 32 + .../znpt/monitor/domain/CustomFunction.java | 14 + .../entity/DeviceVideoChannelEntity.java | 124 +++ .../domain/entity/DeviceVideoEntity.java | 97 ++ .../monitor/domain/entity/IpConfigEntity.java | 35 + .../domain/req/MonitorConfigAddReq.java | 14 + .../znpt/monitor/domain/req/VideoInfoReq.java | 23 + .../monitor/domain/resp/DeviceVideoResp.java | 19 + .../monitor/domain/resp/VideoInfoResp.java | 58 ++ .../vo/video/DeviceVideoChannelEditReq.java | 34 + .../vo/video/DeviceVideoChannelListResp.java | 55 ++ .../vo/video/DeviceVideoChannelResp.java | 43 + .../domain/vo/video/DeviceVideoEditReq.java | 29 + .../domain/vo/video/DeviceVideoListResp.java | 74 ++ .../domain/vo/video/DeviceVideoNumResp.java | 24 + .../domain/vo/video/StreamMediaFormat.java | 77 ++ .../domain/vo/video/StreamMediaFormatReq.java | 28 + .../vo/video/StreamMediaFormatResp.java | 31 + .../vo/video/StreamMediaServerConfigReq.java | 59 ++ .../vo/video/StreamMediaServerConfigResp.java | 60 ++ .../monitor/domain/vo/video/VideoPayResp.java | 24 + .../mapper/DeviceVideoChannelMapper.java | 55 ++ .../monitor/mapper/DeviceVideoMapper.java | 24 + .../znpt/monitor/mapper/IpConfigMapper.java | 13 + .../mapper/StreamMediaFormatMapper.java | 12 + .../dite/znpt/monitor/media/zlm/ZlmApi.java | 1 + .../dite/znpt/monitor/media/zlm/ZlmHook.java | 135 +++ .../znpt/monitor/media/zlm/ZlmService.java | 42 + .../media/zlm/cache/MediaServerCache.java | 41 + .../zlm/cache/MediaServerChannelCache.java | 54 ++ .../zlm/config/StreamMediaServerConfig.java | 46 + .../znpt/monitor/media/zlm/dto/MediaItem.java | 129 +++ .../monitor/media/zlm/dto/ServerConfig.java | 852 ++++++++++++++++++ .../monitor/media/zlm/dto/ServerInfo.java | 30 + .../monitor/media/zlm/dto/ServerItem.java | 106 +++ .../media/zlm/dto/event/BaseEventReq.java | 48 + .../media/zlm/dto/event/BaseEventResp.java | 42 + .../media/zlm/dto/event/FlowReportReq.java | 26 + .../media/zlm/dto/event/HttpAccessReq.java | 29 + .../media/zlm/dto/event/HttpAccessResp.java | 34 + .../monitor/media/zlm/dto/event/PlayReq.java | 14 + .../media/zlm/dto/event/PublishReq.java | 14 + .../media/zlm/dto/event/PublishResp.java | 81 ++ .../media/zlm/dto/event/RecordMp4Req.java | 48 + .../media/zlm/dto/event/RtspAuthReq.java | 30 + .../media/zlm/dto/event/RtspAuthResp.java | 30 + .../media/zlm/dto/event/RtspRealmReq.java | 14 + .../zlm/dto/event/ServerKeepaliveReq.java | 16 + .../media/zlm/dto/event/ShellLoginReq.java | 24 + .../media/zlm/dto/event/StreamChangedReq.java | 19 + .../zlm/dto/event/StreamNoneReaderReq.java | 14 + .../zlm/dto/event/StreamNotFoundReq.java | 14 + .../monitor/media/zlm/dto/req/BaseReq.java | 18 + .../media/zlm/dto/req/CloseStreamReq.java | 18 + .../media/zlm/dto/req/FFmpegSourceReq.java | 45 + .../media/zlm/dto/req/GetAllSessionReq.java | 25 + .../zlm/dto/req/GetMp4RecordFileReq.java | 24 + .../znpt/monitor/media/zlm/dto/req/IdReq.java | 20 + .../monitor/media/zlm/dto/req/KeyReq.java | 20 + .../monitor/media/zlm/dto/req/RecordReq.java | 29 + .../media/zlm/dto/req/RtpServerReq.java | 45 + .../monitor/media/zlm/dto/req/SendRtpReq.java | 53 ++ .../monitor/media/zlm/dto/req/SnapReq.java | 29 + .../media/zlm/dto/req/StreamIdReq.java | 22 + .../media/zlm/dto/req/StreamProxyReq.java | 89 ++ .../zlm/dto/req/StreamPusherProxyReq.java | 35 + .../monitor/media/zlm/dto/req/StreamReq.java | 32 + .../monitor/media/zlm/dto/resp/BaseResp.java | 64 ++ .../media/zlm/dto/resp/CloseStreamResp.java | 25 + .../monitor/media/zlm/dto/resp/MediaResp.java | 58 ++ .../media/zlm/dto/resp/Mp4RecordFileResp.java | 23 + .../media/zlm/dto/resp/OriginSock.java | 22 + .../media/zlm/dto/resp/RtpInfoResp.java | 39 + .../media/zlm/dto/resp/RtpServerResp.java | 22 + .../media/zlm/dto/resp/SessionResp.java | 41 + .../media/zlm/dto/resp/StatisticResp.java | 28 + .../media/zlm/dto/resp/ThreadsLoadResp.java | 22 + .../monitor/media/zlm/dto/resp/Track.java | 58 ++ .../media/zlm/enums/MediaFormatType.java | 43 + .../monitor/media/zlm/impl/ZlmApiImpl.java | 225 +++++ .../media/zlm/impl/ZlmHookService.java | 132 +++ .../media/zlm/impl/ZlmServiceImpl.java | 195 ++++ .../service/DeviceVideoChannelService.java | 120 +++ .../monitor/service/DeviceVideoService.java | 104 +++ .../znpt/monitor/service/IpConfigService.java | 27 + .../service/StreamMediaFormatService.java | 12 + .../impl/DeviceVideoChannelServiceImpl.java | 262 ++++++ .../service/impl/DeviceVideoServiceImpl.java | 225 +++++ .../service/impl/IpConfigServiceImpl.java | 80 ++ .../impl/StreamMediaFormatServiceImpl.java | 17 + .../com/dite/znpt/monitor/sip/SipLayer.java | 109 +++ .../znpt/monitor/sip/config/SipConfig.java | 38 + .../sip/session/StreamSessionManager.java | 26 + .../sip/transmit/SipProcessorFactoryI.java | 11 + .../sip/transmit/SipProcessorFactoryImpl.java | 99 ++ .../sip/transmit/cmd/ISipDeviceCommander.java | 50 + .../cmd/SipRequestHeaderProvider.java | 120 +++ .../cmd/impl/SipDeviceCommanderImpl.java | 226 +++++ .../request/ISipRequestProcessor.java | 12 + .../request/ISipRequestProcessorAbstract.java | 259 ++++++ .../request/impl/AckRequestProcessorImpl.java | 53 ++ .../request/impl/ByeRequestProcessorImpl.java | 63 ++ .../impl/MessageRequestProcessorImpl.java | 75 ++ .../impl/RegisterRequestProcessorImpl.java | 158 ++++ .../request/impl/message/IMessageHandler.java | 20 + .../message/query/CatalogHandlerImpl.java | 137 +++ .../message/query/DeviceInfoHandlerImpl.java | 68 ++ .../query/DeviceStatusHandlerImpl.java | 68 ++ .../message/query/KeepaliveHandlerImpl.java | 89 ++ .../response/ISipResponseProcessor.java | 13 + .../ISipResponseProcessorAbstract.java | 12 + .../impl/InviteResponseProcessorImpl.java | 1 + .../transmit/timeout/ITimeoutProcessor.java | 7 + .../timeout/impl/TimeoutProcessorImpl.java | 34 + .../DigestServerAuthenticationHelper.java | 210 +++++ .../dite/znpt/monitor/sip/utils/XmlUtil.java | 95 ++ .../znpt/monitor/sip/vo/DeviceAlarmVo.java | 49 + .../znpt/monitor/sip/vo/DeviceChannelVo.java | 129 +++ .../dite/znpt/monitor/sip/vo/DeviceVo.java | 56 ++ .../com/dite/znpt/monitor/sip/vo/HostVo.java | 12 + .../znpt/monitor/sip/vo/RecordItemVo.java | 31 + .../dite/znpt/monitor/sip/vo/RecordVo.java | 23 + .../dite/znpt/monitor/utils/DictUtils.java | 33 + .../mapper/iot/DeviceVideoChannelMapper.xml | 84 ++ .../mapper/iot/DeviceVideoMapper.xml | 45 + .../resources/mapper/iot/IpConfigMapper.xml | 17 + .../monitor/config/MediaFormatConfig.class | Bin 0 -> 1306 bytes .../znpt/monitor/constant/Constants.class | Bin 0 -> 567 bytes .../monitor/constant/IotCacheConstants.class | Bin 0 -> 1077 bytes .../monitor/constant/IotDictConstants.class | Bin 0 -> 473 bytes .../monitor/constant/IotRespMessage.class | Bin 0 -> 4835 bytes .../monitor/constant/dict/CameraType.class | Bin 0 -> 1682 bytes .../monitor/constant/dict/DeviceStatus.class | Bin 0 -> 1848 bytes .../constant/dict/SipTransferMode.class | Bin 0 -> 1670 bytes .../constant/dict/StreamTransferMode.class | Bin 0 -> 1823 bytes .../monitor/constant/dict/ValueAndLabel.class | Bin 0 -> 204 bytes .../znpt/monitor/constant/dict/YesOrNo.class | Bin 0 -> 1645 bytes .../znpt/monitor/domain/CustomFunction.class | Bin 0 -> 254 bytes .../entity/DeviceVideoChannelEntity.class | Bin 0 -> 17318 bytes .../domain/entity/DeviceVideoEntity.class | Bin 0 -> 13586 bytes .../domain/entity/IpConfigEntity.class | Bin 0 -> 2936 bytes .../domain/req/MonitorConfigAddReq.class | Bin 0 -> 1786 bytes .../monitor/domain/req/VideoInfoReq.class | Bin 0 -> 2347 bytes .../monitor/domain/resp/DeviceVideoResp.class | Bin 0 -> 2682 bytes .../monitor/domain/resp/VideoInfoResp.class | Bin 0 -> 7699 bytes .../vo/video/DeviceVideoChannelEditReq.class | Bin 0 -> 3692 bytes .../vo/video/DeviceVideoChannelListResp.class | Bin 0 -> 7410 bytes .../vo/video/DeviceVideoChannelResp.class | Bin 0 -> 5244 bytes .../domain/vo/video/DeviceVideoEditReq.class | Bin 0 -> 2805 bytes .../domain/vo/video/DeviceVideoListResp.class | Bin 0 -> 10323 bytes .../domain/vo/video/DeviceVideoNumResp.class | Bin 0 -> 2753 bytes .../domain/vo/video/StreamMediaFormat.class | Bin 0 -> 6821 bytes .../vo/video/StreamMediaFormatReq.class | Bin 0 -> 2830 bytes .../vo/video/StreamMediaFormatResp.class | Bin 0 -> 3367 bytes .../vo/video/StreamMediaServerConfigReq.class | Bin 0 -> 8024 bytes .../video/StreamMediaServerConfigResp.class | Bin 0 -> 8488 bytes .../VideoPayResp$VideoPayRespBuilder.class | Bin 0 -> 1805 bytes .../domain/vo/video/VideoPayResp.class | Bin 0 -> 3040 bytes .../mapper/DeviceVideoChannelMapper.class | Bin 0 -> 1312 bytes .../monitor/mapper/DeviceVideoMapper.class | Bin 0 -> 755 bytes .../znpt/monitor/mapper/IpConfigMapper.class | Bin 0 -> 337 bytes .../mapper/StreamMediaFormatMapper.class | Bin 0 -> 360 bytes .../dite/znpt/monitor/media/zlm/ZlmApi.class | Bin 0 -> 4162 bytes .../dite/znpt/monitor/media/zlm/ZlmHook.class | Bin 0 -> 5437 bytes .../znpt/monitor/media/zlm/ZlmService.class | Bin 0 -> 375 bytes .../media/zlm/cache/MediaServerCache.class | Bin 0 -> 1947 bytes .../zlm/cache/MediaServerChannelCache.class | Bin 0 -> 2954 bytes .../zlm/config/StreamMediaServerConfig.class | Bin 0 -> 6860 bytes .../monitor/media/zlm/dto/MediaItem.class | Bin 0 -> 12581 bytes .../monitor/media/zlm/dto/ServerConfig.class | Bin 0 -> 108104 bytes .../monitor/media/zlm/dto/ServerInfo.class | Bin 0 -> 2618 bytes .../monitor/media/zlm/dto/ServerItem.class | Bin 0 -> 9053 bytes .../media/zlm/dto/event/BaseEventReq.class | Bin 0 -> 4945 bytes .../media/zlm/dto/event/BaseEventResp.class | Bin 0 -> 3755 bytes .../media/zlm/dto/event/FlowReportReq.class | Bin 0 -> 2564 bytes .../media/zlm/dto/event/HttpAccessReq.class | Bin 0 -> 2674 bytes .../media/zlm/dto/event/HttpAccessResp.class | Bin 0 -> 3010 bytes .../monitor/media/zlm/dto/event/PlayReq.class | Bin 0 -> 909 bytes .../media/zlm/dto/event/PublishReq.class | Bin 0 -> 921 bytes .../media/zlm/dto/event/PublishResp.class | Bin 0 -> 7678 bytes .../media/zlm/dto/event/RecordMp4Req.class | Bin 0 -> 4467 bytes .../media/zlm/dto/event/RtspAuthReq.class | Bin 0 -> 2689 bytes .../media/zlm/dto/event/RtspAuthResp.class | Bin 0 -> 2548 bytes .../media/zlm/dto/event/RtspRealmReq.class | Bin 0 -> 929 bytes .../zlm/dto/event/ServerKeepaliveReq.class | Bin 0 -> 1754 bytes .../media/zlm/dto/event/ShellLoginReq.class | Bin 0 -> 2081 bytes .../zlm/dto/event/StreamChangedReq.class | Bin 0 -> 1645 bytes .../zlm/dto/event/StreamNoneReaderReq.class | Bin 0 -> 957 bytes .../zlm/dto/event/StreamNotFoundReq.class | Bin 0 -> 949 bytes .../monitor/media/zlm/dto/req/BaseReq.class | Bin 0 -> 1469 bytes .../media/zlm/dto/req/CloseStreamReq.class | Bin 0 -> 1625 bytes .../media/zlm/dto/req/FFmpegSourceReq.class | Bin 0 -> 4123 bytes .../media/zlm/dto/req/GetAllSessionReq.class | Bin 0 -> 2246 bytes .../zlm/dto/req/GetMp4RecordFileReq.class | Bin 0 -> 2144 bytes .../monitor/media/zlm/dto/req/IdReq.class | Bin 0 -> 1572 bytes .../monitor/media/zlm/dto/req/KeyReq.class | Bin 0 -> 1508 bytes .../monitor/media/zlm/dto/req/RecordReq.class | Bin 0 -> 2680 bytes .../media/zlm/dto/req/RtpServerReq.class | Bin 0 -> 3128 bytes .../media/zlm/dto/req/SendRtpReq.class | Bin 0 -> 4840 bytes .../monitor/media/zlm/dto/req/SnapReq.class | Bin 0 -> 2631 bytes .../media/zlm/dto/req/StreamIdReq.class | Bin 0 -> 1673 bytes .../media/zlm/dto/req/StreamProxyReq.class | Bin 0 -> 8769 bytes .../zlm/dto/req/StreamPusherProxyReq.class | Bin 0 -> 3257 bytes .../monitor/media/zlm/dto/req/StreamReq.class | Bin 0 -> 2782 bytes .../monitor/media/zlm/dto/resp/BaseResp.class | Bin 0 -> 5567 bytes .../media/zlm/dto/resp/CloseStreamResp.class | Bin 0 -> 2233 bytes .../media/zlm/dto/resp/MediaResp.class | Bin 0 -> 6433 bytes .../zlm/dto/resp/Mp4RecordFileResp.class | Bin 0 -> 2215 bytes .../media/zlm/dto/resp/OriginSock.class | Bin 0 -> 3501 bytes .../media/zlm/dto/resp/RtpInfoResp.class | Bin 0 -> 3620 bytes .../media/zlm/dto/resp/RtpServerResp.class | Bin 0 -> 2110 bytes .../media/zlm/dto/resp/SessionResp.class | Bin 0 -> 3939 bytes .../media/zlm/dto/resp/StatisticResp.class | Bin 0 -> 8675 bytes .../media/zlm/dto/resp/ThreadsLoadResp.class | Bin 0 -> 1942 bytes .../monitor/media/zlm/dto/resp/Track.class | Bin 0 -> 5811 bytes .../media/zlm/enums/MediaFormatType.class | Bin 0 -> 1895 bytes .../monitor/media/zlm/impl/ZlmApiImpl.class | Bin 0 -> 13644 bytes .../media/zlm/impl/ZlmHookService.class | Bin 0 -> 6124 bytes .../media/zlm/impl/ZlmServiceImpl.class | Bin 0 -> 9355 bytes .../service/DeviceVideoChannelService.class | Bin 0 -> 2000 bytes .../monitor/service/DeviceVideoService.class | Bin 0 -> 1402 bytes .../monitor/service/IpConfigService.class | Bin 0 -> 519 bytes .../service/StreamMediaFormatService.class | Bin 0 -> 371 bytes .../impl/DeviceVideoChannelServiceImpl.class | Bin 0 -> 15903 bytes .../service/impl/DeviceVideoServiceImpl.class | Bin 0 -> 14013 bytes .../service/impl/IpConfigServiceImpl.class | Bin 0 -> 6779 bytes .../impl/StreamMediaFormatServiceImpl.class | Bin 0 -> 820 bytes .../com/dite/znpt/monitor/sip/SipLayer.class | Bin 0 -> 4231 bytes .../znpt/monitor/sip/config/SipConfig.class | Bin 0 -> 5196 bytes .../sip/session/StreamSessionManager.class | Bin 0 -> 1201 bytes .../sip/transmit/SipProcessorFactoryI.class | Bin 0 -> 185 bytes .../transmit/SipProcessorFactoryImpl.class | Bin 0 -> 5027 bytes .../transmit/cmd/ISipDeviceCommander.class | Bin 0 -> 502 bytes .../cmd/SipRequestHeaderProvider.class | Bin 0 -> 7088 bytes .../cmd/impl/SipDeviceCommanderImpl.class | Bin 0 -> 9484 bytes .../request/ISipRequestProcessor.class | Bin 0 -> 212 bytes .../ISipRequestProcessorAbstract.class | Bin 0 -> 9865 bytes .../impl/AckRequestProcessorImpl.class | Bin 0 -> 2919 bytes .../impl/ByeRequestProcessorImpl.class | Bin 0 -> 3412 bytes .../impl/MessageRequestProcessorImpl.class | Bin 0 -> 3852 bytes .../impl/RegisterRequestProcessorImpl.class | Bin 0 -> 7886 bytes .../impl/message/IMessageHandler.class | Bin 0 -> 270 bytes .../message/query/CatalogHandlerImpl.class | Bin 0 -> 9256 bytes .../message/query/DeviceInfoHandlerImpl.class | Bin 0 -> 3097 bytes .../query/DeviceStatusHandlerImpl.class | Bin 0 -> 3125 bytes .../message/query/KeepaliveHandlerImpl.class | Bin 0 -> 4177 bytes .../response/ISipResponseProcessor.class | Bin 0 -> 216 bytes .../ISipResponseProcessorAbstract.class | Bin 0 -> 531 bytes .../impl/InviteResponseProcessorImpl.class | Bin 0 -> 5488 bytes .../transmit/timeout/ITimeoutProcessor.class | Bin 0 -> 206 bytes .../timeout/impl/TimeoutProcessorImpl.class | Bin 0 -> 1612 bytes .../DigestServerAuthenticationHelper.class | Bin 0 -> 5212 bytes .../dite/znpt/monitor/sip/utils/XmlUtil.class | Bin 0 -> 3274 bytes .../znpt/monitor/sip/vo/DeviceAlarmVo.class | Bin 0 -> 4487 bytes .../znpt/monitor/sip/vo/DeviceChannelVo.class | Bin 0 -> 9902 bytes .../dite/znpt/monitor/sip/vo/DeviceVo.class | Bin 0 -> 5346 bytes .../com/dite/znpt/monitor/sip/vo/HostVo.class | Bin 0 -> 2083 bytes .../znpt/monitor/sip/vo/RecordItemVo.class | Bin 0 -> 4753 bytes .../dite/znpt/monitor/sip/vo/RecordVo.class | Bin 0 -> 2996 bytes .../dite/znpt/monitor/utils/DictUtils.class | Bin 0 -> 2438 bytes .../mapper/iot/DeviceVideoChannelMapper.xml | 84 ++ .../classes/mapper/iot/DeviceVideoMapper.xml | 45 + .../classes/mapper/iot/IpConfigMapper.xml | 17 + web/pom.xml | 33 + .../com/dite/znpt/web}/DiteApplication.java | 5 +- .../controller/CombinedDictController.java | 2 +- .../znpt/web}/controller/CrewController.java | 2 +- .../web}/controller/DefectController.java | 2 +- .../web}/controller/FileInfoController.java | 2 +- .../znpt/web}/controller/PartController.java | 2 +- .../web}/controller/PersonnelController.java | 2 +- .../controller/ProjectCompanyController.java | 2 +- .../web}/controller/ProjectController.java | 2 +- .../web}/controller/TCompanyController.java | 2 +- .../controller/TConstructionController.java | 2 +- .../web}/controller/TurbineController.java | 2 +- .../znpt/web/controller/VideoController.java | 189 ++++ .../controller/WeatherTypeController.java | 2 +- .../src/main/resources/application-dev.yml | 68 +- .../src/main/resources/application.yml | 3 + web/src/main/resources/logback.xml | 99 ++ 301 files changed, 9254 insertions(+), 460 deletions(-) rename demo/.gitattributes => .gitattributes (100%) rename demo/.gitignore => .gitignore (96%) delete mode 100644 demo/mvnw delete mode 100644 demo/mvnw.cmd create mode 100644 demo/src/main/java/com/dite/znpt/service/RedisService.java create mode 100644 pom.xml create mode 100644 sip/pom.xml create mode 100644 sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java create mode 100644 sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java create mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml create mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml create mode 100644 sip/src/main/resources/mapper/iot/IpConfigMapper.xml create mode 100644 sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/Constants.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/DeviceStatus.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/IpConfigEntity.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/resp/VideoInfoResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoMapper.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmApi.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerItem.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Track.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/IpConfigService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/SipLayer.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/config/SipConfig.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/HostVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/RecordItemVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/RecordVo.class create mode 100644 sip/target/classes/com/dite/znpt/monitor/utils/DictUtils.class create mode 100644 sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml create mode 100644 sip/target/classes/mapper/iot/DeviceVideoMapper.xml create mode 100644 sip/target/classes/mapper/iot/IpConfigMapper.xml create mode 100644 web/pom.xml rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/DiteApplication.java (81%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/CombinedDictController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/CrewController.java (95%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/DefectController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/FileInfoController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/PartController.java (95%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/PersonnelController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/ProjectCompanyController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/ProjectController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/TCompanyController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/TConstructionController.java (98%) rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/TurbineController.java (98%) create mode 100644 web/src/main/java/com/dite/znpt/web/controller/VideoController.java rename {demo/src/main/java/com/dite/znpt => web/src/main/java/com/dite/znpt/web}/controller/WeatherTypeController.java (98%) rename {demo => web}/src/main/resources/application-dev.yml (68%) rename {demo => web}/src/main/resources/application.yml (82%) create mode 100644 web/src/main/resources/logback.xml diff --git a/demo/.gitattributes b/.gitattributes similarity index 100% rename from demo/.gitattributes rename to .gitattributes diff --git a/demo/.gitignore b/.gitignore similarity index 96% rename from demo/.gitignore rename to .gitignore index 549e00a..38c0237 100644 --- a/demo/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ HELP.md -target/ +demo/target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ diff --git a/demo/mvnw b/demo/mvnw deleted file mode 100644 index 19529dd..0000000 --- a/demo/mvnw +++ /dev/null @@ -1,259 +0,0 @@ -#!/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-,maven-mvnd--}/ -[ -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 "$@" diff --git a/demo/mvnw.cmd b/demo/mvnw.cmd deleted file mode 100644 index 249bdf3..0000000 --- a/demo/mvnw.cmd +++ /dev/null @@ -1,149 +0,0 @@ -<# : 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-,maven-mvnd--}/ -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" diff --git a/demo/pom.xml b/demo/pom.xml index 8c775c5..37d8c80 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -3,19 +3,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 2.7.18 - + com.dite.znpt + parent + 1.0.0-SNAPSHOT - com.dite - znpt - 0.0.1-SNAPSHOT - znpt - Demo project for Spring Boot - - 17 - + core + 1.0.0-SNAPSHOT + org.springframework.boot @@ -112,7 +106,6 @@ cn.hutool hutool-all - 5.8.22 com.github.pagehelper @@ -124,6 +117,18 @@ excel-spring-boot-starter 1.2.7 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.redisson + redisson + 3.16.0 + diff --git a/demo/src/main/java/com/dite/znpt/domain/Constants.java b/demo/src/main/java/com/dite/znpt/domain/Constants.java index c005435..9e505ae 100644 --- a/demo/src/main/java/com/dite/znpt/domain/Constants.java +++ b/demo/src/main/java/com/dite/znpt/domain/Constants.java @@ -13,12 +13,12 @@ public class Constants { /** * 服务异常 */ - public static final String SERVICE_EXCEPTION = "000003"; + public static final String SERVICE_EXCEPTION = "000002"; public static final String SERVICE_EXCEPTION_MESSAGE = "服务开小差,请稍后再试!"; /** * 参数异常 */ - public static final String PARAMETER_EXCEPTION = "000004"; + public static final String PARAMETER_EXCEPTION = "000003"; } diff --git a/demo/src/main/java/com/dite/znpt/domain/Result.java b/demo/src/main/java/com/dite/znpt/domain/Result.java index 876f660..84e188a 100644 --- a/demo/src/main/java/com/dite/znpt/domain/Result.java +++ b/demo/src/main/java/com/dite/znpt/domain/Result.java @@ -60,6 +60,14 @@ public class Result implements Serializable { return new Result(HttpStatus.OK, Boolean.FALSE, SUCCESS_CODE, StringUtils.EMPTY); } + public static Result error() { + return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(Constants.SERVICE_EXCEPTION), Constants.SERVICE_EXCEPTION_MESSAGE); + } + + public static Result error(String msg) { + return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(Constants.SERVICE_EXCEPTION), msg); + } + public static Result error(String code, String msg) { return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(code), msg); } diff --git a/demo/src/main/java/com/dite/znpt/service/RedisService.java b/demo/src/main/java/com/dite/znpt/service/RedisService.java new file mode 100644 index 0000000..35aba12 --- /dev/null +++ b/demo/src/main/java/com/dite/znpt/service/RedisService.java @@ -0,0 +1,342 @@ +package com.dite.znpt.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * spring redis 工具类 + * + * @author kyland + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +@Component +public class RedisService { + + @Autowired + public RedisTemplate redisTemplate; + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key, String hKey) + { + return redisTemplate.opsForHash().hasKey(key, hKey); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public long deleteObject(final Collection collection) { + return redisTemplate.delete(collection); + } + + /** + * 重新缓存List数据 + * 如果已经有key 则先删除该key + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long resetCacheList(final String key, final List dataList) { + redisTemplate.delete(key); + return setCacheList(key, dataList); + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 重新缓存Set + * 如果已经有key 则先删除该key + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations resetCacheSet(final String key, final Set dataSet) { + redisTemplate.delete(key); + return setCacheSet(key, dataSet); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * Set插入值 + * + * @param key 缓存键值 + * @param value 数据 + */ + public Long addCacheSet(String key, Object value) { + return redisTemplate.opsForSet().add(key, value); + } + + /** + * Set移除值 + * + * @param key 关键 + * @param value 价值 + * @return {@link Long} + */ + public Long removeCacheSetValue(String key, Object value) { + return redisTemplate.opsForSet().remove(key, value); + } + + /** + * 判断Set是否包含 sismember + * + * @param key + * @param value + */ + public Boolean containsSetValue(String key, Object value) { + return redisTemplate.opsForSet().isMember(key, value); + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 删除Hash中的数据 + * + * @param key + * @param hKey + */ + public void delCacheMapValue(final String key, final String hKey) { + HashOperations hashOperations = redisTemplate.opsForHash(); + hashOperations.delete(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) { + List list = redisTemplate.opsForHash().multiGet(key, hKeys); + return list.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @return Hash对象集合 + */ + public List getCacheMapValues(final String key) { + return redisTemplate.opsForHash().values(key); + } + + /** + * 获取多个Hash中的数据 + * + * @param keys Redis键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValues(Collection keys) { + List list = new ArrayList<>(); + keys.forEach(key->{ + List values = getCacheMapValues(key); + if (null != values && values.size() > 0) { + list.addAll(values); + } + }); + return list; + } + + /** + * 获得键列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 获取多个数据对象 + * @param keys + * @param + * @return 对象列表 + */ + public List getMultiCacheValue(Collection keys) { + return redisTemplate.opsForValue().multiGet(keys); + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..514a2ed --- /dev/null +++ b/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + 17 + + + demo + sip + web + + pom + + + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + pom + import + + + + cn.hutool + hutool-all + 5.8.22 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 8 + 8 + + + + + + diff --git a/sip/pom.xml b/sip/pom.xml new file mode 100644 index 0000000..55a957b --- /dev/null +++ b/sip/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + sip + 1.0.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + com.dite.znpt + core + 1.0.0-SNAPSHOT + + + + org.projectlombok + lombok + true + + + + + javax.sip + jain-sip-ri + 1.3.0-91 + + + + + org.dom4j + dom4j + 2.1.3 + + + com.alibaba + fastjson + 1.2.83 + + + org.slf4j + log4j-over-slf4j + 1.7.36 + + + + \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java b/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java new file mode 100644 index 0000000..2c0dd0c --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java @@ -0,0 +1,30 @@ +package com.dite.znpt.monitor.config; + +import cn.hutool.core.collection.CollUtil; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * 媒体格式配置 + * + * @author huise23 + * @since 2023-07-31 09:08:05 + */ +@Configuration +public class MediaFormatConfig { + + @Bean + public static List streamMediaFormatList() { + List formatList = CollUtil.newArrayList(); + formatList.add(new StreamMediaFormat("flv",null,"1")); + formatList.add(new StreamMediaFormat("mp4",null,"0")); + formatList.add(new StreamMediaFormat("hls",null,"0")); + formatList.add(new StreamMediaFormat("webrtc",null,"1")); + return formatList; + } + + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java new file mode 100644 index 0000000..d1ee938 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java @@ -0,0 +1,37 @@ +package com.dite.znpt.monitor.constant; + +/** + * @author yunp + * @since 2022/7/14 + */ +public class Constants { + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * 路径拼接符 / + */ + public static final String File_SEPARATOR = "/"; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 默认字符串分隔符 + */ + public static final String DEFAULT_DELIMITER = ","; +} \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java new file mode 100644 index 0000000..743494a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java @@ -0,0 +1,37 @@ +package com.dite.znpt.monitor.constant; + +/** + * @author yunp + * @since 2022/8/4 + * @description 缓存key定义:key全部以iot开头 + */ +public class IotCacheConstants { + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 图标库 cache key + */ + public static final String SYS_ICON_KEY = "sys_icon"; + + private static final String IOT_DEVICE_VIDEO_PREFIX = "vs_device_video:"; + + public static String getIotDeviceVideoKey(String deviceCode){ + return IOT_DEVICE_VIDEO_PREFIX + deviceCode; + } + + private final static String CLIENT_TRANSACTION_CACHE_PREFIX = "IOT_CLIENT_TRANSACTION_CACHE:"; + + public static String getClientTransactionCacheKey(String ssrc){ + return CLIENT_TRANSACTION_CACHE_PREFIX + ssrc; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java new file mode 100644 index 0000000..4e3d10d --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java @@ -0,0 +1,20 @@ +package com.dite.znpt.monitor.constant; + +/** + * @author yunp + * @since 2022/8/4 + * @description 字典类型定义 + */ +public class IotDictConstants { + + /** + * 设备状态-在线 + */ + public static final String IOT_DEVICE_STATUS_ONLINE = "2"; + + /** + * 设备状态-离线 + */ + public static final String IOT_DEVICE_STATUS_OFFLINE = "3"; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java new file mode 100644 index 0000000..7cdf9eb --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java @@ -0,0 +1,113 @@ +package com.dite.znpt.monitor.constant; + +/** + * @author yunp + * @since 2022/8/4 + * @description 响应文案定义 + */ +public class IotRespMessage { + + public static final String UNKNOWN_FAIL = "未知错误"; + + public static final String ID_NOT_FOUND = "数据不存在"; + + public static final String PARAMETER_ERROR = "参数有误"; + + public static final String NO_PERMISSION = "没有访问权限"; + + public static final String PARENT_AREA_NOT_FOUND = "上级分区不存在"; + + public static final String CAR_TYPE_HAS_CARS = "该车型下仍有车辆,无法删除"; + + public static final String CAR_BRAND_HAS_CARS = "该品牌下仍有车辆,无法删除"; + + public static final String CAR_PLATE_NUMBER_EXIST = "该车牌号车辆已存在"; + + public static final String CAR_PLATE_NUMBER_NOT_EXIST = "该车牌号车辆不存在"; + + public static final String CAR_HAS_BIND_TAG_OR_SPEED_MONITOR = "车辆已绑定车载标签或速度检测仪,禁止删除"; + + public static final String CAR_FREIGHT_NOT_EXIST = "货物不存在"; + + public static final String CAR_HAS_BIND_ALARM_TEMPLATE = "该车辆已绑定其他告警模板"; + + public static final String USER_HAS_BIND_ALARM_TEMPLATE = "该人员已绑定其他告警模板"; + + public static final String REPETITION_ALARM_FOR_AREA = "该厂区分区下已有同类型告警,无法重复添加"; + + public static final String REPETITION_ALARM_NOTIFY_CONFIG = "已存在相同部门层级的告警消息推送配置"; + + public static final String DEVICE_TERMINAL_HAS_BEEN_BIND = "该标签卡已被其他人绑定"; + + public static final String DEVICE_TERMINAL_TYPE_ERROR = "标签卡类型有误"; + + public static final String DEVICE_TERMINAL_NOT_FOUND_OR_STATUS_ERROR = "标签卡未找到或状态异常"; + + public static final String DEVICE_CANNOT_EDIT = "设备未启用或已停用才可编辑"; + + public static final String VIDEO_DEVICE_CANNOT_DELETE = "视频设备禁止删除"; + + public static final String DEVICE_CANNOT_DELETE = "未启用的设备才可删除"; + + public static final String DEVICE_HAS_BIND_TO_GROUP = "设备已经绑定至该分组"; + + public static final String DEVICE_VIDEO_CANNOT_DELETE = "禁止删除在线视频设备"; + + public static final String DEVICE_VIDEO_CANNOT_SYNC = "禁止更新离线视频设备"; + + public static final String DEVICE_INACTIVE = "设备未启用"; + + public static final String CODE_HAS_BEEN_USED = "编号已被占用"; + + public static final String NAME_HAS_BEEN_USED = "名称已被占用"; + + public static final String FLAG_HAS_BEEN_USED = "标识已被占用"; + + public static final String GROUP_HAS_CHILD_CANNOT_REMOVE = "分组有下级分组,无法删除"; + + public static final String GROUP_HAS_DEVICE_CANNOT_REMOVE = "分组下有绑定设备,无法删除"; + + public static final String PRODUCT_PUBLISH_CANNOT_DELETE = "该产品已发布,不可删除"; + + public static final String PRODUCT_HAS_DEVICE_CANNOT_REMOVE = "产品下存在设备关联,需删除设备后进行操作"; + + public static final String MSG_PROTOCOL_PUBLISH_CANNOT_DELETE = "消息协议未发布,发布协议后操作"; + + public static final String CATEGORY_CANNOT_DELETE = "该产品分类信息已被产品关联,不可删除"; + + public static final String SCENE_CANNOT_DELETE = "该场景信息已被产品关联,不可删除"; + + public static final String SWITCH_PARAM_HAS_BEEN_USED = "该参数在设备服务中只能定义一个"; + + public static final String CONFIG_CANNOT_DELETE = "该配置已被通知模板关联,不可删除, 请取消关联后重试。"; + + public static final String TEMPLATE_CANNOT_DELETE = "该通知模板已被场景联动关联,不可删除, 请取消关联后操作。"; + + public static final String PROTOCOL_CANNOT_DELETE_BY_PUBLISHED = "当前协议状态为已发布,不可删除."; + + public static final String PROTOCOL_CANNOT_DELETE_WITH_PRODUCT = "该协议已被产品关联,不可删除,请删除关联后操作!"; + + public static final String PROTOCOL_CANNOT_UN_PUBLISH = "协议已被产品发布,不可取消!"; + + public static final String PROTOCOL_TYPE_CANNOT_NULL = "协议类型不能为空"; + + public static final String PROTOCOL_CLASS_NAME_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须指定协议类名."; + + public static final String PROTOCOL_FILE_PATH_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须上传或者指定协议文件路径."; + + public static final String DATA_ILLEGAL = "数据非法"; + + public static final String IMPORT_ERROR = "导入出错"; + + public static final String COMMON_DEVICE_ATTR_DUPLICATE_ERROR = "订阅的通用设备点位全局不唯一"; + + public static final String PROTOCOL_NOT_EXISTS = "协议不存在"; + + public static final String RULE_NOT_EXISTS = "上报规则不存在"; + + public static final String DEVICE_NOT_EXISTS = "设备不存在"; + + public static final String DATA_DATA_TREND_TIME_TYPE_NOT_EXISTS = "设备数据趋势时间类型不存在"; + public static final String DATA_DATA_TREND_DATA_TYPE_NOT_EXISTS = "设备数据趋势数据类型不存在"; + public static final String CRON_ERROR = "cron表达式输入错误:"; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java new file mode 100644 index 0000000..a05e191 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java @@ -0,0 +1,32 @@ +package com.dite.znpt.monitor.constant.dict; + +/** + * 摄像头类型 + * + * @author huise23 + * @since 2023-07-28 15:30:10 + */ +public enum CameraType implements ValueAndLabel { + + UNKNOWN("0","未知"), + BALLHEAD("1","球机"); + + private final String value; + private final String label; + + CameraType(String value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getLabel() { + return label; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java new file mode 100644 index 0000000..2101f2b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java @@ -0,0 +1,34 @@ +package com.dite.znpt.monitor.constant.dict; + +/** + * 设备状态 + * + * @author huise23 + * @since 2023-07-28 15:30:10 + */ +public enum DeviceStatus implements ValueAndLabel { + + INACTIV("1", "未启用"), + ONLINE("2", "在线"), + OFFLINE("3", "离线"), + STOP("4", "停用"); + + private final String value; + private final String label; + + DeviceStatus(String value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getLabel() { + return label; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java new file mode 100644 index 0000000..e621c06 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java @@ -0,0 +1,26 @@ +package com.dite.znpt.monitor.constant.dict; + +public enum SipTransferMode implements ValueAndLabel { + + UDP("UDP","UDP"), + TCP("TCP","TCP"); + + private final String value; + private final String label; + + SipTransferMode(String value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getLabel() { + return label; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java new file mode 100644 index 0000000..fea526a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java @@ -0,0 +1,27 @@ +package com.dite.znpt.monitor.constant.dict; + +public enum StreamTransferMode implements ValueAndLabel { + + UDP("UDP","UDP"), + TCP_ACTIVE("TCP-ACTIVE","TCP主动"), + TCP_PASSIVE("TCP-PASSIVE", "TCP被动"); + + private final String value; + private final String label; + + StreamTransferMode(String value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getLabel() { + return label; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java new file mode 100644 index 0000000..88b5b1b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.constant.dict; + + +/** + * 字典常量接口 + * + * @author huise23 + * @since 2023-07-28 15:28:55 + */ +public interface ValueAndLabel { + String getValue(); + String getLabel(); + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java new file mode 100644 index 0000000..62889fd --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java @@ -0,0 +1,32 @@ +package com.dite.znpt.monitor.constant.dict; + +/** + * YesOrNo + * + * @author huise23 + * @since 2023-07-28 15:30:10 + */ +public enum YesOrNo implements ValueAndLabel { + + YES("Y","是"), + NO("N", "否"); + + private final String value; + private final String label; + + YesOrNo(String value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getLabel() { + return label; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java b/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java new file mode 100644 index 0000000..bf145cc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.domain; + +/** + * @Author: cuizhibin + * @Date: 2023/1/16 14:36:36 + * @Description: + */ +public interface CustomFunction { + /** + * 执行的方法 + * @return + */ + T get(); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java new file mode 100644 index 0000000..4b263aa --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java @@ -0,0 +1,124 @@ +package com.dite.znpt.monitor.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: huise23 + * @Date: 2022/8/11 17:29 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("vs_device_video_channel") +@ApiModel(value="DeviceVideoChannelEntity", description="视频通道表") +public class DeviceVideoChannelEntity implements Serializable { + + private static final long serialVersionUID = -4175177624487756818L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "channel_id", type = IdType.AUTO) + private Long channelId; + + @ApiModelProperty(value = "视频设备id") + private Long videoId; + + @ApiModelProperty(value = "通道国标编号") + private String channelCode; + + @ApiModelProperty(value = "通道名") + private String channelName; + + @ApiModelProperty(value = "生产厂商") + private String manufacture; + + @ApiModelProperty(value = "型号") + private String model; + + @ApiModelProperty(value = "设备归属") + private String owner; + + @ApiModelProperty(value = "行政区域") + private String civilCode; + + @ApiModelProperty(value = "警区") + private String block; + + @ApiModelProperty(value = "安装位置") + private String address; + + @ApiModelProperty(value = "是否有子设备 1有, 0没有") + private int parental; + + @ApiModelProperty(value = "父级id") + private String parentId; + + @ApiModelProperty(value = "信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式") + private int safetyWay; + + @ApiModelProperty(value = "注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式") + private int registerWay; + + @ApiModelProperty("证书序列号") + private String certNum; + + @ApiModelProperty("证书有效标识 缺省为0;证书有效标识:0:无效1: 有效") + private int certifiable; + + @ApiModelProperty("证书无效原因码") + private int errCode; + + @ApiModelProperty( "证书终止有效期") + private String endTime; + + @ApiModelProperty("保密属性 缺省为0; 0:不涉密, 1:涉密") + private String secrecy; + + @ApiModelProperty("IP地址") + private String ipAddress; + + @ApiModelProperty("端口号") + private int port; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("摄像头类型") + private String cameraType; + + @ApiModelProperty("云台控制") + private String ptzControl; + + @ApiModelProperty(value = "状态") + private String status; + + @ApiModelProperty("经度") + private double longitude; + + @ApiModelProperty("纬度") + private double latitude; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("创建人id") + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新人id") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java new file mode 100644 index 0000000..049e324 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java @@ -0,0 +1,97 @@ +package com.dite.znpt.monitor.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: huise23 + * @Date: 2022/8/11 10:24 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("vs_device_video") +@ApiModel(value="DeviceVideoEntity", description="视频设备表") +public class DeviceVideoEntity implements Serializable { + + private static final long serialVersionUID = -182441901641147882L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "video_id", type = IdType.AUTO) + private Long videoId; + + @ApiModelProperty(value = "视频设备国标编码") + private String videoCode; + + @ApiModelProperty(value = "视频设备名称") + private String videoName; + + @ApiModelProperty(value = "生产厂商") + private String manufacturer; + + @ApiModelProperty(value = "型号") + private String model; + + @ApiModelProperty(value = "固件版本") + private String firmware; + + @ApiModelProperty(value = "传输协议(UDP/TCP),默认UDP") + private String transport; + + @ApiModelProperty(value = "数据流传输模式(默认UDP)") + private String streamMode; + + @ApiModelProperty(value = "设备状态") + private String status; + + @ApiModelProperty(value = "注册时间") + private LocalDateTime registerTime; + + @ApiModelProperty(value = "心跳时间") + private LocalDateTime KeepaliveTime; + + @ApiModelProperty("通道个数") + private int channelCount; + + @ApiModelProperty(value = "ip") + private String ip; + + @ApiModelProperty(value = "端口") + private Integer port; + + @ApiModelProperty(value = "地址") + private String hostAddress; + + @ApiModelProperty(value = "注册有效期") + private Integer expires; + + @ApiModelProperty(value = "符集, 支持 UTF-8 与 GB2312") + private String charset; + + @ApiModelProperty(value = "产品id") + private Long productId; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("创建人id") + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新人id") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java new file mode 100644 index 0000000..0259688 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java @@ -0,0 +1,35 @@ +package com.dite.znpt.monitor.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Date: 2023/09/05 16:39 + * @Description: 监控设备IP配置表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("vs_ip_config") +@ApiModel(value="VsIpConfigEntity对象", description="监控设备IP配置表") +public class IpConfigEntity implements Serializable { + + @ApiModelProperty("${column.comment}") + @TableId(type = IdType.AUTO) + private Long configId; + + @ApiModelProperty("ip地址") + private String ip; + + @ApiModelProperty("ip地址前三位") + private String ipTopThree; + + +} + diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java new file mode 100644 index 0000000..be2a92e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.domain.req; + +import lombok.Data; + +import java.util.List; + +/** + * @Date:2023/9/5 16:19 + * @Description: 视频服务配置新增对象 + */ +@Data +public class MonitorConfigAddReq { + private List ipAddresses; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java new file mode 100644 index 0000000..0dc809c --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java @@ -0,0 +1,23 @@ +package com.dite.znpt.monitor.domain.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 查询视频信息参数 + * + * @author huise23 + * @since 2024-12-03 14:03:29 + */ +@Data +public class VideoInfoReq implements Serializable { + + @ApiModelProperty(value = "视频对接方式 1.摄像头直连 2.级联") + private Integer videoConnection; + + @ApiModelProperty(value = "级联分隔符(默认/)") + private String cascadeSeparator = "/"; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java new file mode 100644 index 0000000..f8a76ae --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.monitor.domain.resp; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Date:2023/9/7 10:26 + * @Description: + */ +@Data +public class DeviceVideoResp extends DeviceVideoEntity { + @ApiModelProperty(value = "设备状态label") + private String statusLabel; + @ApiModelProperty(value = "流传输模式label") + private String streamModeLabel; + @ApiModelProperty(value = "传输模式label") + private String transportLabel; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java new file mode 100644 index 0000000..7ba594c --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java @@ -0,0 +1,58 @@ +package com.dite.znpt.monitor.domain.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 查询视频信息返回信息 + * + * @author huise23 + * @since 2024-12-03 14:03:29 + */ +@Data +public class VideoInfoResp implements Serializable { + + @ApiModelProperty(value = "视频设备id") + private Long videoId; + + @ApiModelProperty(value = "视频设备名称") + private String videoName; + + @ApiModelProperty(value = "通道id") + private Long channelId; + + @ApiModelProperty(value = "国标编码") + private String channelCode; + + @ApiModelProperty(value = "通道名称") + private String channelName; + + @ApiModelProperty(value = "生产厂商") + private String manufacture; + + @ApiModelProperty(value = "型号") + private String model; + + @ApiModelProperty(value = "安装位置") + private String address; + + @ApiModelProperty("IP地址") + private String ipAddress; + + @ApiModelProperty("端口号") + private int port; + + @ApiModelProperty(value = "云台控制label") + private String ptzControl; + + @ApiModelProperty("经度") + private double longitude; + + @ApiModelProperty("纬度") + private double latitude; + + @ApiModelProperty(value = "状态 DeviceStatus") + private String status; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java new file mode 100644 index 0000000..1ec735a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java @@ -0,0 +1,34 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:12 + * @Description: + */ +@Data +@ApiModel("视频通道编辑请求") +public class DeviceVideoChannelEditReq implements Serializable { + + private static final long serialVersionUID = 719557164910393807L; + + @ApiModelProperty(value = "通道名称") + private String channelName; + + @ApiModelProperty(value = "安装位置") + private String address; + + @ApiModelProperty(value = "摄像头类型") + private String cameraType; + + @ApiModelProperty(value = "云台控制,Y表示是,N表示否") + private String ptzControl; + + @ApiModelProperty(value = "描述") + private String remark; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java new file mode 100644 index 0000000..31234fb --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java @@ -0,0 +1,55 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:12 + * @Description: + */ +@Data +@ApiModel("视频通道列表响应") +public class DeviceVideoChannelListResp implements Serializable { + + private static final long serialVersionUID = -8053965410352257803L; + + @ApiModelProperty(value = "主键id") + private Long channelId; + + @ApiModelProperty(value = "所属产品id") + private Long productId; + + @ApiModelProperty(value = "通道国标编码") + private String channelCode; + + @ApiModelProperty(value = "通道名称") + private String channelName; + + @ApiModelProperty(value = "安装位置") + private String address; + + @ApiModelProperty(value = "摄像头类型label") + private String cameraType; + + @ApiModelProperty(value = "摄像头类型") + private String cameraTypeLabel; + + @ApiModelProperty(value = "云台控制label") + private String ptzControl; + + @ApiModelProperty(value = "云台控制,Y表示是,N表示否") + private String ptzControlLabel; + + @ApiModelProperty(value = "状态") + private String status; + + @ApiModelProperty(value = "状态label") + private String statusLabel; + + @ApiModelProperty(value = "描述") + private String remark; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java new file mode 100644 index 0000000..1f22085 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java @@ -0,0 +1,43 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:12 + * @Description: + */ +@Data +@ApiModel("视频通道响应") +public class DeviceVideoChannelResp implements Serializable { + + private static final long serialVersionUID = 1140851083577845760L; + + @ApiModelProperty(value = "主键id") + private Long channelId; + + @ApiModelProperty(value = "通道国标编码") + private String channelCode; + + @ApiModelProperty(value = "通道名称") + private String channelName; + + @ApiModelProperty(value = "安装位置") + private String address; + + @ApiModelProperty(value = "摄像头类型") + private String cameraType; + + @ApiModelProperty(value = "云台控制,Y表示是,N表示否") + private String ptzControl; + + @ApiModelProperty(value = "状态") + private String status; + + @ApiModelProperty(value = "描述") + private String remark; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java new file mode 100644 index 0000000..a1f2b8e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:13 + * @Description: + */ +@Data +@ApiModel("视频设备编辑请求参数") +public class DeviceVideoEditReq implements Serializable { + + private static final long serialVersionUID = -3387666090991548317L; + + @ApiModelProperty(value = "设备名称") + private String videoName; + + @ApiModelProperty(value = "所属产品") + private Long productId; + + @ApiModelProperty(value = "说明") + private String remark; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java new file mode 100644 index 0000000..026f873 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java @@ -0,0 +1,74 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:13 + * @Description: + */ +@Data +@ApiModel("视频设备列表响应") +public class DeviceVideoListResp implements Serializable { + + private static final long serialVersionUID = -5568664011265192343L; + + @ApiModelProperty(value = "主键id") + private Long videoId; + + @ApiModelProperty(value = "视频设备国标编码") + private String videoCode; + + @ApiModelProperty(value = "视频设备名称") + private String videoName; + + @ApiModelProperty(value = "传输模式") + private String transport; + + @ApiModelProperty(value = "传输模式label") + private String transportLabel; + + @ApiModelProperty(value = "流传输模式") + private String streamMode; + + @ApiModelProperty(value = "流传输模式label") + private String streamModeLabel; + + @ApiModelProperty(value = "通道数量") + private Integer channelCount; + + @ApiModelProperty(value = "设备状态") + private String status; + + @ApiModelProperty(value = "设备状态label") + private String statusLabel; + + @ApiModelProperty(value = "设备ip") + private String ip; + + @ApiModelProperty(value = "设备端口") + private String port; + + @ApiModelProperty(value = "设备地址(ip+端口)") + private String hostAddress; + + @ApiModelProperty(value = "生产厂商") + private String manufacturer; + + @ApiModelProperty(value = "备注") + private String remark; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "心跳时间") + private LocalDateTime keepAliveTime; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java new file mode 100644 index 0000000..f56b8c1 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java @@ -0,0 +1,24 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/16 9:34 + * @Description: + */ +@Data +@ApiModel("视频设备数量响应") +public class DeviceVideoNumResp { + + @ApiModelProperty(value = "设备总数量") + private Long allDevice; + + @ApiModelProperty(value = "设备在线数量") + private Long onlineDevice; + + @ApiModelProperty(value = "设备离线数量") + private Long offlineDevice; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java new file mode 100644 index 0000000..5c5f457 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java @@ -0,0 +1,77 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; +import com.dite.znpt.monitor.media.zlm.enums.MediaFormatType; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 10:25 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "StreamMediaFormat对象", description = "流媒体格式") +public class StreamMediaFormat implements Serializable { + + private static final long serialVersionUID = -4177962876536716643L; + + @ApiModelProperty(value = "流媒体格式") + private String mediaFormat; + + @ApiModelProperty(value = "端口") + private Integer port; + + @ApiModelProperty(value = "是否开启tls,1表示ture,0表示false") + private String openTls; + + @TableField(exist = false) + @ApiModelProperty(value = "WebSocket播放地址") + private String wsUrl; + + @TableField(exist = false) + @ApiModelProperty(value = "Http播放地址") + private String httpUrl; + + @TableField(exist = false) + @ApiModelProperty(value = "WebSocket播放地址") + private String wssUrl; + + @TableField(exist = false) + @ApiModelProperty(value = "Http播放地址") + private String httpsUrl; + + @TableField(exist = false) + @ApiModelProperty(value = "相对播放地址") + private String relativePath; + + public StreamMediaFormat(String mediaFormat,Integer port,String openTls){ + this.mediaFormat = mediaFormat; + this.port = port; + this.openTls = openTls; + } + + public void generateUrl(String host, String streamId, ServerConfig config, String mediaRouter) { + if("webrtc".equals(this.mediaFormat)){ + this.httpUrl = StrUtil.format("http://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpPort(), streamId); + this.httpsUrl = StrUtil.format("https://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpSslPort(), streamId); + this.relativePath = StrUtil.format("{}/index/api/webrtc?app=rtp&stream={}&type=play", mediaRouter, streamId); + return; + } + String suffix = MediaFormatType.getSuffix(this.mediaFormat); + if (config.getHttpSslPort() != null && config.getHttpSslPort() > 0) { + this.wssUrl = StrUtil.format("wss://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); + this.httpsUrl = StrUtil.format("https://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); + } + this.wsUrl = StrUtil.format("ws://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); + this.httpUrl = StrUtil.format("http://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); + this.relativePath = StrUtil.format("{}/rtp/{}{}", mediaRouter, streamId, suffix); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java new file mode 100644 index 0000000..d3ce278 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java @@ -0,0 +1,28 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:40 + * @Description: + */ +@Data +@ApiModel("流媒体格式请求") +public class StreamMediaFormatReq implements Serializable { + + private static final long serialVersionUID = 6627383994019834279L; + + @ApiModelProperty(value = "流媒体格式") + private String mediaFormat; + + @ApiModelProperty(value = "端口") + private Integer port; + + @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") + private String openTls; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java new file mode 100644 index 0000000..ad9304b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java @@ -0,0 +1,31 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:40 + * @Description: + */ +@Data +@ApiModel("流媒体格式响应") +public class StreamMediaFormatResp implements Serializable { + + private static final long serialVersionUID = -5714327034173930078L; + + @ApiModelProperty(value = "流媒体格式主键") + private Long formatId; + + @ApiModelProperty(value = "流媒体格式") + private String mediaFormat; + + @ApiModelProperty(value = "端口") + private Integer port; + + @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") + private String openTls; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java new file mode 100644 index 0000000..36c15fd --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java @@ -0,0 +1,59 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:16 + * @Description: + */ +@Data +@ApiModel("流媒体服务配置请求") +public class StreamMediaServerConfigReq implements Serializable { + + private static final long serialVersionUID = -1228005085084886474L; + + @NotNull(message = "流媒体名称不能为空") + @ApiModelProperty(value = "流媒体名称") + private String mediaName; + + @ApiModelProperty(value = "流媒体服务") + private String mediaService; + + @ApiModelProperty(value = "公网 HOST") + private String publicHost; + + @ApiModelProperty(value = "API HOST") + private String apiHost; + + @ApiModelProperty(value = "API 端口") + private Integer apiPort; + + @ApiModelProperty(value = "密钥") + private Integer secretKey; + + @ApiModelProperty(value = "流ID前缀") + private String streamPrefix; + + @ApiModelProperty(value = "RTP IP") + private String rtpHost; + + @ApiModelProperty(value = "RTP 端口") + private Integer rtpPort; + + @ApiModelProperty(value = "动态端口起始值") + private Integer dynamicPortStart; + + @ApiModelProperty(value = "动态端口结束值") + private Integer dynamicPortEnd; + + @ApiModelProperty(value = "流媒体格式") + private List streamMediaFormatReqList; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java new file mode 100644 index 0000000..6e3b185 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java @@ -0,0 +1,60 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:16 + * @Description: + */ +@Data +@ApiModel("流媒体服务配置响应") +public class StreamMediaServerConfigResp implements Serializable { + + private static final long serialVersionUID = 3464085768355214710L; + + @ApiModelProperty(value = "'流媒体配置主键'") + private Long configId; + + @ApiModelProperty(value = "'流媒体名称'") + private String mediaName; + + @ApiModelProperty(value = "流媒体服务") + private String mediaService; + + @ApiModelProperty(value = "公网 HOST") + private String publicHost; + + @ApiModelProperty(value = "API HOST") + private String apiHost; + + @ApiModelProperty(value = "API 端口") + private Integer apiPort; + + @ApiModelProperty(value = "密钥") + private String secretKey; + + @ApiModelProperty(value = "流ID前缀") + private String streamPrefix; + + @ApiModelProperty(value = "RTP IP") + private String rtpHost; + + @ApiModelProperty(value = "RTP 端口") + private Integer rtpPort; + + @ApiModelProperty(value = "动态端口起始值") + private Integer dynamicPortStart; + + @ApiModelProperty(value = "动态端口结束值") + private Integer dynamicPortEnd; + + @ApiModelProperty(value = "流媒体格式") + private List streamMediaFormatRespList; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java new file mode 100644 index 0000000..26809bc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java @@ -0,0 +1,24 @@ +package com.dite.znpt.monitor.domain.vo.video; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * 视频播放响应 + * @author huise23 + * @since 2024-11-26 14:03:41 + */ +@Data +@Builder +public class VideoPayResp { + + @ApiModelProperty(value = "播放方式") + private String mediaType; + + @ApiModelProperty(value = "流媒体播放地址") + private List streamMediaFormatList; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java new file mode 100644 index 0000000..2c211e8 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java @@ -0,0 +1,55 @@ +package com.dite.znpt.monitor.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; +import com.dite.znpt.monitor.domain.req.VideoInfoReq; +import com.dite.znpt.monitor.domain.resp.VideoInfoResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:08 + * @Description: + */ +public interface DeviceVideoChannelMapper extends BaseMapper { + + /** + * 查询视频通道列表 + * + * @param videoId 视频id + * @param keyword 插叙条件 + * @return {@link List< DeviceVideoChannelListResp>} + */ + List selectDeviceVideoChannel(@Param("videoId") Long videoId, @Param("keyword") String keyword); + + /** + * 查询所有视频通道列表 + * + * @param keyword 插叙条件 + * @return {@link List< DeviceVideoChannelListResp>} + */ + List selectAllDeviceVideoChannel(@Param("keyword") String keyword); + + /** + * 查询视频通道详情 + * + * @param channelCode 通道code + * @return {@link DeviceVideoChannelResp} + */ + DeviceVideoChannelResp getDeviceVideoChannelDetail(@Param("channelCode") String channelCode); + + /** + * 查询通道及视频信息 + * + * @param videoInfoReq 查询参数 + * @return {@link VideoInfoResp } + * @author huise23 + * @since 2024-12-03 13:54:52 + */ + List selectVideoInfoList(VideoInfoReq videoInfoReq); + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java new file mode 100644 index 0000000..cc14697 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java @@ -0,0 +1,24 @@ +package com.dite.znpt.monitor.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:09 + * @Description: + */ +public interface DeviceVideoMapper extends BaseMapper { + /** + * 条件查询视频设备列表 + * @param status 是否在线 + * @param keyword 设备名称或者编码 + * @return {@link List< DeviceVideoListResp>} + */ + List selectDeviceVideoList(@Param("status") String status, @Param("keyword") String keyword, @Param("hostAddress") String hostAddress); + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java new file mode 100644 index 0000000..1332af0 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java @@ -0,0 +1,13 @@ +package com.dite.znpt.monitor.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.monitor.domain.entity.IpConfigEntity; + +/** + * @Date: 2023/09/05 16:39 + * @Description: 监控设备IP配置表数据库访问层 + */ +public interface IpConfigMapper extends BaseMapper { +} + diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java new file mode 100644 index 0000000..a3ce77a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.monitor.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; + +/** + * @Author: huise23 + * @Date: 2022/8/11 15:00 + * @Description: + */ +public interface StreamMediaFormatMapper extends BaseMapper { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java new file mode 100644 index 0000000..f8604da --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java @@ -0,0 +1 @@ +package com.dite.znpt.monitor.media.zlm; import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; import com.dite.znpt.monitor.media.zlm.dto.req.*; import com.dite.znpt.monitor.media.zlm.dto.resp.*; import java.io.IOException; import java.util.List; /** * @Author: huise23 * @Date: 2022/8/29 10:14 * @Description: Zlm客户端启动类 */ public interface ZlmApi { /** * 获取API列表 * api: /index/api/getApiList * * @return Api列表 */ List getApiList(ServerInfo server); /** * 获取各epoll(或select)线程负载以及延时 * api: /index/api/getThreadsLoad * * @return 各epoll(或select)线程负载以及延时 */ List getThreadsLoad(ServerInfo server); /** * 获取各后台epoll(或select)线程负载以及延时 * api: /index/api/getWorkThreadsLoad * * @return 各后台epoll(或select)线程负载以及延时 */ List getWorkThreadsLoad(ServerInfo server); /** * 获取服务器配置 * api: /index/api/getServerConfig * * @return 服务器配置 */ List getServerConfig(ServerInfo server); /** * 设置服务器配置 * api: /index/api/setServerConfig * * @param config 服务器配置 * @return 操作结果 */ Integer setServerConfig(ServerInfo server, ServerConfig config); /** * 重启服务器,只有Daemon方式才能重启,否则是直接关闭! * api: /index/api/restartServer * * @return 操作结果 */ Boolean restartServer(ServerInfo server); /** * 获取流列表,可选筛选参数 * api: /index/api/getMediaList * * @param req 请求参数 * @return 操作结果 */ List getMediaList(ServerInfo server, StreamReq req); /** * 关闭流(目前所有类型的流都支持关闭) * api: /index/api/close_streams * * @param req 请求参数 * @return 操作结果 */ CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req); /** * 获取所有TcpSession列表(获取所有tcp客户端相关信息) * api: /index/api/getAllSession * * @param req 请求参数 * @return 所有TcpSession列表 */ List getAllSession(ServerInfo server, GetAllSessionReq req); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_session * * @param id 客户端唯一id,可以通过getAllSession接口获取 * @return 操作结果 */ Boolean kickSession(ServerInfo server, Long id); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_sessions * * @param req 请求参数 * @return 操作结果 */ Integer kickSession(ServerInfo server, GetAllSessionReq req); /** * 动态添加rtsp/rtmp/hls拉流代理(只支持H264/H265/aac/G711负载) * api: /index/api/addStreamProxy * * @param req 请求参数 * @return 唯一Key */ String addStreamProxy(ServerInfo server, StreamProxyReq req); /** * 关闭拉流代理 * api: /index/api/delStreamProxy * * @param key addStreamProxy接口返回的key * @return 操作结果 */ Boolean delStreamProxy(ServerInfo server, String key); /** * 通过fork FFmpeg进程的方式拉流代理,支持任意协议 * api: /index/api/addFFmpegSource * * @param req 请求参数 * @return 唯一Key */ String addFfMpegSource(ServerInfo server, FFmpegSourceReq req); /** * 关闭ffmpeg拉流代理 * api: /index/api/delFFmpegSource * * @param key addFFmpegSource接口返回的key * @return 操作结果 */ Boolean delFfMpegSource(ServerInfo server, String key); /** * 获取rtp代理时的某路ssrc rtp信息 * api: /index/api/getRtpInfo * * @param streamId RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) * @return 操作结果 */ RtpInfoResp getRtpInfo(ServerInfo server, String streamId); /** * 搜索文件系统,获取流对应的录像文件列表或日期文件夹列表 * api: /index/api/getMp4RecordFile * * @param req 请求参数 * @return 操作结果 */ Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req); /** * 开始录制hls或MP4 * api: /index/api/startRecord * * @param req 请求参数 * @return 操作结果 */ Boolean startRecord(ServerInfo server, RecordReq req); /** * 停止录制流 * api: /index/api/stopRecord * * @param req 请求参数 * @return 操作结果 */ Boolean stopRecord(ServerInfo server, RecordReq req); /** * 获取流录制状态 * api: /index/api/isRecording * * @param req 请求参数 * @return 操作结果 */ Boolean isRecording(ServerInfo server, RecordReq req); /** * 获取截图或生成实时截图并返回 * api: /index/api/getSnap * * @param req 请求参数 * @return jpeg格式的图片,可以在浏览器直接打开 */ void getSnap(ServerInfo server, SnapReq req) throws IOException; /** * 创建GB28181 RTP接收端口,如果该端口接收数据超时,则会自动被回收(不用调用closeRtpServer接口) * api: /index/api/openRtpServer * * @param req 请求参数 * @return 接收端口,方便获取随机端口号 */ Integer openRtpServer(ServerInfo server, RtpServerReq req); /** * 关闭GB28181 RTP接收端口 * api: /index/api/closeRtpServer * * @param streamId 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) * @return 是否找到记录并关闭 */ Boolean closeRtpServer(ServerInfo server, String streamId); /** * 获取openRtpServer接口创建的所有RTP服务器 * api: /index/api/listRtpServer * * @return 是否找到记录并关闭 */ List listRtpServer(ServerInfo server); /** * 作为GB28181客户端,启动ps-rtp推流,支持rtp/udp方式; * 该接口支持rtsp/rtmp等协议转ps-rtp推流。第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试。 * api: /index/api/startSendRtp * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtp(ServerInfo server, SendRtpReq req); /** * 作为GB28181 Passive TCP服务器; * 该接口支持rtsp/rtmp等协议转ps-rtp被动推流。 * 调用该接口,zlm会启动tcp服务器等待连接请求, * 连接建立后,zlm会关闭tcp服务器,然后源源不断的往客户端推流。 * 第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试(不停地建立tcp监听,超时后再关闭)。 * api: /index/api/startSendRtpPassive * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtpPassive(ServerInfo server, SendRtpReq req); /** * 停止GB28181 ps-rtp推流 * api: /index/api/stopSendRtp * * @param req 请求参数 * @return 操作结果 */ Boolean stopSendRtp(ServerInfo server, SendRtpReq req); /** * 获取主要对象个数统计,主要用于分析内存性能 * api: /index/api/getStatistic * * @return 操作结果 */ StatisticResp getStatistic(ServerInfo server); /** * 添加rtsp/rtmp主动推流(把本服务器的直播流推送到其他服务器去) * api: /index/api/addStreamPusherProxy * * @param req 请求参数 * @return 流的唯一标识 */ String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req); /** * 关闭推流 * api: /index/api/delStreamPusherProxy * * @param key 流的唯一标识 * @return 操作结果 */ Boolean delStreamPusherProxy(ServerInfo server, String key); } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java new file mode 100644 index 0000000..a9c1b11 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java @@ -0,0 +1,135 @@ +package com.dite.znpt.monitor.media.zlm; + +import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.event.*; +import com.dite.znpt.monitor.media.zlm.impl.ZlmHookService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:22 + * @Description: + */ +@Slf4j +@RestController +@RequestMapping("/index/hook") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ZlmHook { + private final ZlmHookService service; + + /** + * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, + * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 + */ + @PostMapping(value = "/on_flow_report") + public BaseEventResp onFlowReport(@RequestBody FlowReportReq req) { + return service.onFlowReport(req); + } + + /** + * 访问http文件服务器上hls之外的文件时触发。 + */ + @PostMapping(value = "/on_http_access") + public HttpAccessResp onHttpAccess(@RequestBody HttpAccessReq req) { + return service.onHttpAccess(req); + } + + /** + * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; + * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 + * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 + */ + @PostMapping(value = "/on_play") + public BaseEventResp onPlay(@RequestBody PlayReq req) { + return service.onPlay(req); + } + + /** + * rtsp/rtmp/rtp推流鉴权事件。 + */ + @PostMapping(value = "/on_publish") + public PublishResp onPublish(@RequestBody PublishReq req) { + return service.onPublish(req); + } + + + /** + * 录制mp4完成后通知事件;此事件对回复不敏感。 + */ + @PostMapping(value = "/on_record_mp4") + public BaseEventResp onRecordMp4(@RequestBody RecordMp4Req req) { + return service.onRecordMp4(req); + } + + /** + * 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 + * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 + */ + @PostMapping(value = "/on_rtsp_realm") + public BaseEventResp onRtspRealm(@RequestBody RtspRealmReq req) { + return service.onRtspRealm(req); + } + + /** + * rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 + */ + @PostMapping(value = "/on_rtsp_auth") + public RtspAuthResp onRtspAuth(@RequestBody RtspAuthReq req) { + return service.onRtspAuth(req); + } + + /** + * shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 + * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 + */ + @PostMapping(value = "/on_shell_login") + public BaseEventResp onShellLogin(@RequestBody ShellLoginReq req) { + return service.onShellLogin(req); + } + + /** + * rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 + */ + @PostMapping(value = "/on_stream_changed") + public BaseEventResp onStreamChanged(@RequestBody StreamChangedReq req) { + return service.onStreamChanged(req); + } + + /** + * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 + */ + @PostMapping(value = "/on_stream_none_reader") + public BaseEventResp onStreamNoneReader(@RequestBody StreamNoneReaderReq req) { + return service.onStreamNoneReader(req); + } + + /** + * 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 + */ + @PostMapping(value = "/on_stream_not_found") + public BaseEventResp onStreamNotFound(@RequestBody StreamNotFoundReq req) { + return service.onStreamNotFound(req); + } + + /** + * 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 + */ + @PostMapping(value = "/on_server_started") + public BaseEventResp onServerStarted(@RequestBody ServerConfig req) { + return service.onServerStarted(req); + } + + /** + * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 + */ + @PostMapping(value = "/on_server_keepalive") + public BaseEventResp onServerKeepalive(@RequestBody ServerKeepaliveReq req) { + return service.onServerKeepalive(req); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java new file mode 100644 index 0000000..b56e1e1 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java @@ -0,0 +1,42 @@ +package com.dite.znpt.monitor.media.zlm; + +import com.dite.znpt.monitor.media.zlm.dto.MediaItem; + +/** + * @Author: huise23 + * @Date: 2022/8/30 10:39 + * @Description: 流媒体服务管理主业务 + */ +public interface ZlmService { + /** + * 点播视频 + * + * @param deviceCode 设备编码 + * @param channelCode 通道编码 + * @return 流信息 + */ + MediaItem play(String deviceCode, String channelCode); + + /** + * 失败的时候释放流媒体资源 + * + * @param deviceCode 设备编码 + * @param channelCode 通道编码 + */ + void release(String deviceCode, String channelCode); + + /** + * 失败的时候释放流媒体资源 + * + * @param media 流媒体信息 + */ + void release(MediaItem media); + + /** + * 停止点播 + * + * @param mediaServerId 流媒体服务器id,通过配置文件设置 + * @param streamId 流ID + */ + void display(String mediaServerId, String streamId); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java new file mode 100644 index 0000000..430a48b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java @@ -0,0 +1,41 @@ +package com.dite.znpt.monitor.media.zlm.cache; + +import com.dite.znpt.monitor.media.zlm.dto.ServerItem; +import com.dite.znpt.service.RedisService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +/** + * @Author: huise23 + * @Date: 2022/8/30 15:46 + * @Description: + */ +@Component +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class MediaServerCache { + private final RedisService redisService; + public final RedisTemplate redisTemplate; + + private final String zlm_key = "zlm_media_server"; + + + public void putLoad(ServerItem serverItem) { + redisService.setCacheObject(zlm_key, serverItem); + } + + /** + * 获取zlm节点 + */ + public ServerItem getLoad() { + return redisService.getCacheObject(zlm_key); + } + + public void releaseSsrc(String ssrc) { + ServerItem item = getLoad(); + item.releaseSsrc(ssrc); + putLoad(item); + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java new file mode 100644 index 0000000..df1bb2b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java @@ -0,0 +1,54 @@ +package com.dite.znpt.monitor.media.zlm.cache; + +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.monitor.media.zlm.dto.MediaItem; +import com.dite.znpt.service.RedisService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @Author: huise23 + * @Date: 2022/8/30 15:46 + * @Description: + */ +@Component +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class MediaServerChannelCache { + private final RedisService redisService; + + private String getKey(String deviceCode, String channelCode) { + return StrUtil.format("zlm_media_server_channel:{}:{}", deviceCode, channelCode); + } + + private String getStreamKey(String mediaServerId, String streamId) { + return StrUtil.format("zlm_media_server_channel_stream_key:{}:{}", mediaServerId, streamId); + } + + public boolean has(String deviceCode, String channelCode) { + return redisService.hasKey(getKey(deviceCode, channelCode)); + } + + public MediaItem get(String deviceCode, String channelCode) { + return redisService.getCacheObject(getKey(deviceCode, channelCode)); + } + + public void put(String deviceCode, String channelCode, MediaItem media) { + String key = getKey(deviceCode, channelCode); + redisService.setCacheObject(key, media); + redisService.setCacheObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId()), key); + } + + public void delete(MediaItem media) { + redisService.deleteObject(getKey(media.getDeviceCode(), media.getChannelCode())); + redisService.deleteObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId())); + } + + public MediaItem getByStream(String mediaServerId, String streamId) { + String key = redisService.getCacheObject(getStreamKey(mediaServerId, streamId)); + if (StrUtil.isNotBlank(key)) { + return redisService.getCacheObject(key); + } + return null; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java new file mode 100644 index 0000000..e2a7d07 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java @@ -0,0 +1,46 @@ +package com.dite.znpt.monitor.media.zlm.config; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "zlm-config") +public class StreamMediaServerConfig { + + @ApiModelProperty(value = "'流媒体名称'") + private String mediaName; + + @ApiModelProperty(value = "流媒体服务商") + private String mediaService; + + @ApiModelProperty(value = "公网ip") + private String publicHost; + + @ApiModelProperty(value = "接口ip") + private String apiHost; + + @ApiModelProperty(value = "接口端口") + private Integer apiPort; + + @ApiModelProperty(value = "密钥") + private String secretKey; + + @ApiModelProperty(value = "流id前缀") + private String streamPrefix; + + @ApiModelProperty(value = "rtp ip") + private String rtpHost; + + @ApiModelProperty(value = "rtp 端口") + private Integer rtpPort; + + @ApiModelProperty(value = "动态端口起始值") + private String dynamicPortStart; + + @ApiModelProperty(value = "动态端口结束值") + private String dynamicPortEnd; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java new file mode 100644 index 0000000..c422090 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java @@ -0,0 +1,129 @@ +package com.dite.znpt.monitor.media.zlm.dto; + +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; +import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/29 15:41 + * @Description: + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class MediaItem implements Serializable { + /** + * 设备编码 + */ + private String deviceCode; + /** + * 通道编码 + */ + private String channelCode; + /** + * 节点信息ID + */ + private String configId; + /** + * 节点信息ID + */ + private ServerInfo server; + /** + * 节点格式信息 + */ + private List formatList; + /** + * 节点配置信息 + */ + private ServerConfig config; + /** + * 流ID + */ + private String streamId; + /** + * 播放流信息 + */ + private RtpInfoResp rtp; + /** + * Rtp服务监听端口 + */ + private Integer rtpPort; + /** + * SSRC源地址 + */ + private String ssrc; + /** + * rtmp播放地址 + */ + private String rtmpUrl; + /** + * rtmpSsl播放地址 + */ + private String rtmpSslUrl; + /** + * rtsp播放地址 + */ + private String rtspUrl; + /** + * rtspSsl播放地址 + */ + private String rtspSslUrl; + + /** + * rtc流地址 + */ + private String rtc; + + /** + * rtcs流地址 + */ + private String rtcs; + + /** + * 是否缓存 + */ + private Boolean isCache; + + public List getFormatList(String mediaRouter) { + if (StrUtil.isNotBlank(streamId)) { + formatList.forEach(item -> item.generateUrl(server.getApiHost(), streamId, config, mediaRouter)); + } + return formatList; + } + + public String getRtmpUrl() { + if (StrUtil.isBlank(streamId)) { + return ""; + } + return StrUtil.format("rtmp://{}:{}/rtp/{}", server.getApiHost(), config.getRtmpPort(), streamId); + } + + public String getRtmpSslUrl() { + if (StrUtil.isBlank(streamId)) { + return ""; + } + return config.getRtspSslPort() > 0 ? StrUtil.format("rtmps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; + } + + + public String getRtspUrl() { + if (StrUtil.isBlank(streamId)) { + return ""; + } + return StrUtil.format("rtsp://{}:{}/rtp/{}", server.getApiHost(), config.getRtspPort(), streamId); + } + + public String getRtspSslUrl() { + if (StrUtil.isBlank(streamId)) { + return ""; + } + return config.getRtspSslPort() > 0 ? StrUtil.format("rtsps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java new file mode 100644 index 0000000..62b51d7 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java @@ -0,0 +1,852 @@ +package com.dite.znpt.monitor.media.zlm.dto; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.annotation.JSONField; +import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.req.BaseReq; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:54 + * @Description: 服务器配置 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class ServerConfig extends BaseReq { + // ----------------------------------------------- api ----------------------------------------------- + /** + * 是否调试http api,启用调试后,会打印每次http请求的内容和回复 + * apiDebug=1 + */ + @JSONField(name = "api.apiDebug") + private Integer apiDebug; + /** + * 一些比较敏感的http api在访问时需要提供secret,否则无权限调用 + * 如果是通过127.0.0.1访问,那么可以不提供secret + * secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc + */ + @JSONField(name = "api.secret") + private String apiSecret; + /** + * 截图保存路径根目录,截图通过http api(/index/api/getSnap)生成和获取 + * snapRoot=./www/snap/ + */ + @JSONField(name = "api.snapRoot") + private String apiSnapRoot; + /** + * 默认截图图片,在启动FFmpeg截图后但是截图还未生成时,可以返回默认的预设图片 + * defaultSnap=./www/logo.png + */ + @JSONField(name = "api.defaultSnap") + private String apiDefaultSnap; + // ----------------------------------------------- ffmpeg ----------------------------------------------- + /** + * FFmpeg可执行程序路径,支持相对路径/绝对路径 + * bin=/usr/bin/ffmpeg + */ + @JSONField(name = "ffmpeg.bin") + private String ffmpegBin; + /** + * FFmpeg拉流再推流的命令模板,通过该模板可以设置再编码的一些参数 + * cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s + */ + @JSONField(name = "ffmpeg.cmd") + private String ffmpegCmd; + /** + * FFmpeg生成截图的命令,可以通过修改该配置改变截图分辨率或质量 + * snap=%s -i %s -y -f mjpeg -t 0.001 %s + */ + @JSONField(name = "ffmpeg.snap") + private String ffmpegSnap; + /** + * FFmpeg日志的路径,如果置空则不生成FFmpeg日志 + * 可以为相对(相对于本可执行程序目录)或绝对路径 + * log=./ffmpeg/ffmpeg.log + */ + @JSONField(name = "ffmpeg.log") + private String ffmpegLog; + /** + * 自动重启的时间(秒), 默认为0, 也就是不自动重启. 主要是为了避免长时间ffmpeg拉流导致的不同步现象 + * restart_sec=0 + */ + @JSONField(name = "ffmpeg.restart_sec") + private String ffmpegRestartSec; + // ----------------------------------------------- general ----------------------------------------------- + /** + * 是否启用虚拟主机 + * enableVhost=0 + */ + @JSONField(name = "general.enableVhost") + private Integer enableVhost; + /** + * 播放器或推流器在断开后会触发hook.on_flow_report事件(使用多少流量事件), + * flowThreshold参数控制触发hook.on_flow_report事件阈值,使用流量超过该阈值后才触发,单位KB + * flowThreshold=1024 + */ + @JSONField(name = "general.flowThreshold") + private Integer generalFlowThreshold; + /** + * 播放最多等待时间,单位毫秒 + * 播放在播放某个流时,如果该流不存在, + * ZLMediaKit会最多让播放器等待maxStreamWaitMS毫秒 + * 如果在这个时间内,该流注册成功,那么会立即返回播放器播放成功 + * 否则返回播放器未找到该流,该机制的目的是可以先播放再推流 + * maxStreamWaitMS=15000 + */ + @JSONField(name = "general.maxStreamWaitMS") + private Integer generalMaxStreamWaitMs; + /** + * 某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒 + * 在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流 + * streamNoneReaderDelayMS=20000 + */ + @JSONField(name = "general.streamNoneReaderDelayMS") + private Integer generalStreamNoneReaderDelayMs; + /** + * 是否全局添加静音aac音频,转协议时有效 + * 有些播放器在打开单视频流时不能秒开,添加静音音频可以加快秒开速度 + * addMuteAudio=1 + */ + @JSONField(name = "general.addMuteAudio") + private Integer generalAddMuteAudio; + /** + * 拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始, + * 如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写) + * resetWhenRePlay=1 + */ + @JSONField(name = "general.resetWhenRePlay") + private Integer generalResetWhenRePlay; + /** + * 是否默认推流时转换成hls,hook接口(on_publish)中可以覆盖该设置 + * publishToHls=1 + */ + @JSONField(name = "general.publishToHls") + private Integer generalPublishToHls; + /** + * 是否默认推流时mp4录像,hook接口(on_publish)中可以覆盖该设置 + * publishToMP4=0 + */ + @JSONField(name = "general.publishToMP4") + private Integer generalPublishToMP4; + /** + * 合并写缓存大小(单位毫秒),合并写指服务器缓存一定的数据后才会一次性写入socket,这样能提高性能,但是会提高延时 + * 开启后会同时关闭TCP_NODELAY并开启MSG_MORE + * mergeWriteMS=0 + */ + @JSONField(name = "general.mergeWriteMS") + private Integer generalMergeWriteMS; + /** + * 全局的时间戳覆盖开关,在转协议时,对frame进行时间戳覆盖 + * 该开关对rtsp/rtmp/rtp推流、rtsp/rtmp/hls拉流代理转协议时生效 + * 会直接影响rtsp/rtmp/hls/mp4/flv等协议的时间戳 + * 同协议情况下不影响(例如rtsp/rtmp推流,那么播放rtsp/rtmp时不会影响时间戳) + * modifyStamp=0 + */ + @JSONField(name = "general.modifyStamp") + private Integer generalModifyStamp; + /** + * 服务器唯一id,用于触发hook时区别是哪台服务器 + * mediaServerId=your_server_id + */ + @JSONField(name = "general.mediaServerId") + private String generalMediaServerId; + /** + * 转协议是否全局开启或关闭音频 + * enable_audio=1 + */ + @JSONField(name = "general.enable_audio") + private Integer generalEnableAudio; + // ###### 以下是按需转协议的开关,在测试ZLMediaKit的接收推流性能时,请把下面开关置1 + // ###### 如果某种协议你用不到,你可以把以下开关置1以便节省资源(但是还是可以播放,只是第一个播放者体验稍微差点), + // ###### 如果某种协议你想获取最好的用户体验,请置0(第一个播放者可以秒开,且不花屏) + /** + * hls协议是否按需生成,如果hls.segNum配置为0(意味着hls录制),那么hls将一直生成(不管此开关) + * hls_demand=0 + */ + @JSONField(name = "general.hls_demand") + private Integer generalHlsDemand; + /** + * rtsp[s]协议是否按需生成 + * rtsp_demand=0 + */ + @JSONField(name = "general.rtsp_demand") + private Integer generalRtspDemand; + /** + * rtmp[s]、http[s]-flv、ws[s]-flv协议是否按需生成 + * rtmp_demand=0 + */ + @JSONField(name = "general.rtmp_demand") + private Integer generalRtmpDemand; + /** + * http[s]-ts协议是否按需生成 + * ts_demand=0 + */ + @JSONField(name = "general.ts_demand") + private Integer generalTsDemand; + /** + * http[s]-fmp4、ws[s]-fmp4协议是否按需生成 + * fmp4_demand=0 + */ + @JSONField(name = "general.fmp4_demand") + private Integer generalFmp4Demand; + /** + * 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track + * wait_track_ready_ms=10000 + */ + @JSONField(name = "general.wait_track_ready_ms") + private Integer generalWaitTrackReadyMs; + /** + * 如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track + * 如果协议元数据有声明特定track数,那么无此等待时间 + * wait_add_track_ms=3000 + */ + @JSONField(name = "general.wait_add_track_ms") + private Integer generalWaitAddTrackMs; + /** + * 如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出 + * unready_frame_cache=100 + */ + @JSONField(name = "general.unready_frame_cache") + private Integer generalUnreadyFrameCache; + /** + * 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。 + * 置0关闭此特性(推流断开会导致立即断开播放器) + * 此参数不应大于播放器超时时间 + * continue_push_ms=15000 + */ + @JSONField(name = "general.continue_push_ms") + private Integer generalContinuePushMs; + // ----------------------------------------------- hls ----------------------------------------------- + /** + * hls写文件的buf大小,调整参数可以提高文件io性能 + * fileBufSize=65536 + */ + @JSONField(name = "hls.fileBufSize") + private Integer hlsFileBufSize; + /** + * hls保存文件路径 + * 可以为相对(相对于本可执行程序目录)或绝对路径 + * filePath=./www + */ + @JSONField(name = "hls.filePath") + private String hlsFilePath; + /** + * hls最大切片时间 + * segDur=2 + */ + @JSONField(name = "hls.segDur") + private Integer hlsSegDur; + /** + * m3u8索引中,hls保留切片个数(实际保留切片个数大2~3个) + * 如果设置为0,则不删除切片,而是保存为点播 + * segNum=3 + */ + @JSONField(name = "hls.segNum") + private Integer hlsSegNum; + /** + * HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数 + * segRetain=5 + */ + @JSONField(name = "hls.segRetain") + private Integer hlsSegRetain; + /** + * 是否广播 ts 切片完成通知 + * broadcastRecordTs=0 + */ + @JSONField(name = "hls.broadcastRecordTs") + private Integer hlsBroadcastRecordTs; + /** + * 直播hls文件删除延时,单位秒,issue: #913 + * deleteDelaySec=0 + */ + @JSONField(name = "hls.deleteDelaySec") + private Integer hlsDeleteDelaySec; + /** + * 是否保留hls文件,此功能部分等效于segNum=0的情况 + * 不同的是这个保留不会在m3u8文件中体现 + * 0为不保留,不起作用 + * 1为保留,则不删除hls文件,如果开启此功能,注意磁盘大小,或者定期手动清理hls文件 + * segKeep=0 + */ + @JSONField(name = "hls.segKeep") + private Integer hlsSegKeep; + // ----------------------------------------------- hook ----------------------------------------------- + /** + * 在推流时,如果url参数匹对admin_params,那么可以不经过hook鉴权直接推流成功,播放时亦然 + * 该配置项的目的是为了开发者自己调试测试,该参数暴露后会有泄露隐私的安全隐患 + * admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc + */ + @JSONField(name = "hook.admin_params") + private String hookAdminParams; + /** + * 是否启用hook事件,启用后,推拉流都将进行鉴权 + * enable=0 + */ + @JSONField(name = "hook.enable") + private Integer hookHookEnable; + /** + * 播放器或推流器使用流量事件,置空则关闭 + * on_flow_report=https://127.0.0.1/index/hook/on_flow_report + */ + @JSONField(name = "hook.on_flow_report") + private String hookOnFlowReport; + /** + * 访问http文件鉴权事件,置空则关闭鉴权 + * on_http_access=https://127.0.0.1/index/hook/on_http_access + */ + @JSONField(name = "hook.on_http_access") + private String hookOnHttpAccess; + /** + * 播放鉴权事件,置空则关闭鉴权 + * on_play=https://127.0.0.1/index/hook/on_play + */ + @JSONField(name = "hook.on_play") + private String hookOnPlay; + /** + * 推流鉴权事件,置空则关闭鉴权 + * on_publish=https://127.0.0.1/index/hook/on_publish + */ + @JSONField(name = "hook.on_publish") + private String hookOnPublish; + /** + * 录制mp4切片完成事件 + * on_record_mp4=https://127.0.0.1/index/hook/on_record_mp4 + */ + @JSONField(name = "hook.on_record_mp4") + private String hookOnRecordMp4; + /** + * 录制 hls ts 切片完成事件 + * on_record_ts=https://127.0.0.1/index/hook/on_record_ts + */ + @JSONField(name = "hook.on_record_ts") + private String hookOnRecordTs; + /** + * rtsp播放鉴权事件,此事件中比对rtsp的用户名密码 + * on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth + */ + @JSONField(name = "hook.on_rtsp_auth") + private String hookOnRtspAuth; + /** + * rtsp播放是否开启专属鉴权事件,置空则关闭rtsp鉴权。rtsp播放鉴权还支持url方式鉴权 + * 建议开发者统一采用url参数方式鉴权,rtsp用户名密码鉴权一般在设备上用的比较多 + * 开启rtsp专属鉴权后,将不再触发on_play鉴权事件 + * on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm + */ + @JSONField(name = "hook.on_rtsp_realm") + private String hookOnRtspRealm; + /** + * 远程telnet调试鉴权事件 + * on_shell_login=https://127.0.0.1/index/hook/on_shell_login + */ + @JSONField(name = "hook.on_shell_login") + private String hookOnShellLogin; + /** + * 直播流注册或注销事件 + * on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed + */ + @JSONField(name = "hook.on_stream_changed") + private String hookOnStreamChanged; + /** + * 服务器启动报告,可以用于服务器的崩溃重启事件监听 + * on_server_started=https://127.0.0.1/index/hook/on_server_started + */ + @JSONField(name = "hook.on_server_started") + private String hookOnServerStarted; + /** + * server保活上报 + * on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive + */ + @JSONField(name = "hook.on_server_keepalive") + private String hookOnServerKeepalive; + /** + * 无人观看流事件,通过该事件,可以选择是否关闭无人观看的流。配合general.streamNoneReaderDelayMS选项一起使用 + * on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader + */ + @JSONField(name = "hook.on_stream_none_reader") + private String hookOnStreamNoneReader; + /** + * 播放时,未找到流事件,通过配合hook.on_stream_none_reader事件可以完成按需拉流 + * on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found + */ + @JSONField(name = "hook.on_stream_not_found") + private String hookOnStreamNotFound; + /** + * 发送rtp(startSendRtp)被动关闭时回调 + * on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped + */ + @JSONField(name = "hook.on_send_rtp_stopped") + private String hookOnSendRtpStopped; + /** + * hook api最大等待回复时间,单位秒 + * timeoutSec=10 + */ + @JSONField(name = "hook.timeoutSec") + private Integer hookTimeoutSec; + /** + * keepalive hook触发间隔,单位秒,float类型 + * alive_interval=10.0 + */ + @JSONField(name = "hook.alive_interval") + private Float hookAliveInterval; + /** + * hook通知失败重试次数,正整数。为0不重试,1时重试一次,以此类推 + * retry=1 + */ + @JSONField(name = "hook.retry") + private Integer hookRetry; + /** + * hook通知失败重试延时,单位秒,float型 + * retry_delay=3.0 + */ + @JSONField(name = "hook.retry_delay") + private Float hookRetryDelay; + // ----------------------------------------------- cluster ----------------------------------------------- + /** + * 设置源站拉流url模板, 格式跟printf类似,第一个%s指定app,第二个%s指定stream_id, + * 开启集群模式后,on_stream_not_found和on_stream_none_reader hook将无效. + * 溯源模式支持以下类型: + * rtmp方式: rtmp://127.0.0.1:1935/%s/%s + * rtsp方式: rtsp://127.0.0.1:554/%s/%s + * hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8 + * http-ts方式: http://127.0.0.1:80/%s/%s.live.ts + * 支持多个源站,不同源站通过分号(;)分隔 + * origin_url= + */ + @JSONField(name = "cluster.origin_url") + private String clusterOriginUrl; + /** + * 溯源总超时时长,单位秒,float型;假如源站有3个,那么单次溯源超时时间为timeout_sec除以3 + * 单次溯源超时时间不要超过general.maxStreamWaitMS配置 + * timeout_sec=15 + */ + @JSONField(name = "cluster.timeout_sec") + private Integer clusterTimeoutSec; + /** + * 溯源失败尝试次数,-1时永久尝试 + * retry_count=3 + */ + @JSONField(name = "cluster.retry_count") + private Integer clusterRetryCount; + // ----------------------------------------------- http ----------------------------------------------- + /** + * http服务器字符编码,windows上默认gb2312 + * charSet=utf-8 + */ + @JSONField(name = "http.charSet") + private String httpCharSet; + /** + * http链接超时时间 + * keepAliveSecond=30 + */ + @JSONField(name = "http.keepAliveSecond") + private Integer httpKeepAliveSecond; + /** + * http请求体最大字节数,如果post的body太大,则不适合缓存body在内存 + * maxReqSize=40960 + */ + @JSONField(name = "http.maxReqSize") + private Integer httpMaxReqSize; + /** + * 404网页内容,用户可以自定义404网页 + * notFound=404 Not Found

您访问的资源不存在!


ZLMediaKit-4.0
+ */ + @JSONField(name = "http.notFound") + private String httpNotFound; + /** + * http服务器监听端口 + * port=80 + */ + @JSONField(name = "http.port") + private Integer httpPort; + /** + * http文件服务器根目录 + * 可以为相对(相对于本可执行程序目录)或绝对路径 + * rootPath=./www + */ + @JSONField(name = "http.rootPath") + private String httpRootPath; + /** + * http文件服务器读文件缓存大小,单位BYTE,调整该参数可以优化文件io性能 + * sendBufSize=65536 + */ + @JSONField(name = "http.sendBufSize") + private Integer httpSendBufSize; + /** + * https服务器监听端口 + * sslport=443 + */ + @JSONField(name = "http.sslport") + private Integer httpSslPort; + /** + * 是否显示文件夹菜单,开启后可以浏览文件夹 + * dirMenu=1 + */ + @JSONField(name = "http.dirMenu") + private Integer httpDirMenu; + /** + * 虚拟目录, 虚拟目录名和文件路径使用","隔开,多个配置路径间用";"隔开 + * 例如赋值为 app_a,/path/to/a;app_b,/path/to/b 那么 + * 访问 http://127.0.0.1/app_a/file_a 对应的文件路径为 /path/to/a/file_a + * 访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b + * 访问其他http路径,对应的文件路径还是在rootPath内 + * virtualPath= + */ + @JSONField(name = "http.virtualPath") + private String httpVirtualPath; + /** + * 禁止后缀的文件使用mmap缓存,使用“,”隔开 + * 例如赋值为 .mp4,.flv + * 那么访问后缀为.mp4与.flv 的文件不缓存 + * forbidCacheSuffix= + */ + @JSONField(name = "http.forbidCacheSuffix") + private String httpForbidCacheSuffix; + /** + * 可以把http代理前真实客户端ip放在http头中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388 + * 切勿暴露此key,否则可能导致伪造客户端ip + * forwarded_ip_header= + */ + @JSONField(name = "http.forwarded_ip_header") + private String httpForwardedIpHeader; + // ----------------------------------------------- multicast ----------------------------------------------- + /** + * rtp组播截止组播ip地址 + * addrMax=239.255.255.255 + */ + @JSONField(name = "multicast.addrMax") + private String multicastAddrMax; + /** + * rtp组播起始组播ip地址 + * addrMin=239.0.0.0 + */ + @JSONField(name = "multicast.addrMin") + private String multicastAddrMin; + /** + * 组播udp ttl + * udpTTL=64 + */ + @JSONField(name = "multicast.udpTTL") + private Integer multicastUdpTtl; + // ----------------------------------------------- record ----------------------------------------------- + /** + * mp4录制或mp4点播的应用名,通过限制应用名,可以防止随意点播 + * 点播的文件必须放置在此文件夹下 + * appName=record + */ + @JSONField(name = "record.appName") + private String recordAppName; + /** + * mp4录制写文件缓存,单位BYTE,调整参数可以提高文件io性能 + * fileBufSize=65536 + */ + @JSONField(name = "record.fileBufSize") + private Integer recordFileBufSize; + /** + * mp4录制保存、mp4点播根路径 + * 可以为相对(相对于本可执行程序目录)或绝对路径 + * filePath=./www + */ + @JSONField(name = "record.filePath") + private String recordFilePath; + /** + * mp4录制切片时间,单位秒 + * fileSecond=3600 + */ + @JSONField(name = "record.fileSecond") + private Integer recordFileSecond; + /** + * mp4点播每次流化数据量,单位毫秒, + * 减少该值可以让点播数据发送量更平滑,增大该值则更节省cpu资源 + * sampleMS=500 + */ + @JSONField(name = "record.sampleMS") + private Integer recordSampleMs; + /** + * mp4录制完成后是否进行二次关键帧索引写入头部 + * fastStart=0 + */ + @JSONField(name = "record.fastStart") + private Integer recordFastStart; + /** + * MP4点播(rtsp/rtmp/http-flv/ws-flv)是否循环播放文件 + * fileRepeat=0 + */ + @JSONField(name = "record.fileRepeat") + private Integer recordFileRepeat; + /** + * MP4录制是否当做播放器参与播放人数统计 + * mp4_as_player=0 + */ + @JSONField(name = "record.mp4_as_player") + private Integer recordMp4AsPlayer; + // ----------------------------------------------- rtmp ----------------------------------------------- + /** + * rtmp必须在此时间内完成握手,否则服务器会断开链接,单位秒 + * handshakeSecond=15 + */ + @JSONField(name = "rtmp.handshakeSecond") + private Integer rtmpHandshakeSecond; + /** + * rtmp超时时间,如果该时间内未收到客户端的数据, + * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 + * keepAliveSecond=15 + */ + @JSONField(name = "rtmp.keepAliveSecond") + private Integer rtmpKeepAliveSecond; + /** + * 在接收rtmp推流时,是否重新生成时间戳(很多推流器的时间戳着实很烂) + * modifyStamp=0 + */ + @JSONField(name = "rtmp.modifyStamp") + private Integer rtmpModifyStamp; + /** + * rtmp服务器监听端口 + * port=1935 + */ + @JSONField(name = "rtmp.port") + private Integer rtmpPort = 0; + /** + * rtmps服务器监听地址 + * sslport=0 + */ + @JSONField(name = "rtmp.sslport") + private Integer rtmpSslPort = 0; + // ----------------------------------------------- rtp ----------------------------------------------- + /** + * 音频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 + * 加大该值会明显增加直播延时 + * audioMtuSize=600 + */ + @JSONField(name = "rtp.audioMtuSize") + private Integer rtpAudioMtuSize; + /** + * 视频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 + * videoMtuSize=1400 + */ + @JSONField(name = "rtp.videoMtuSize") + private Integer rtpVideoMtuSize; + /** + * rtp包最大长度限制,单位KB,主要用于识别TCP上下文破坏时,获取到错误的rtp + * rtpMaxSize=10 + */ + @JSONField(name = "rtp.rtpMaxSize") + private Integer rtpMaxSize; + // ----------------------------------------------- rtp_proxy ----------------------------------------------- + /** + * 导出调试数据(包括rtp/ps/h264)至该目录,置空则关闭数据导出 + * dumpDir= + */ + @JSONField(name = "rtp_proxy.dumpDir") + private String proxyDumpDir; + /** + * udp和tcp代理服务器,支持rtp(必须是ts或ps类型)代理 + * port=10000 + */ + @JSONField(name = "rtp_proxy.port") + private Integer proxyPort; + /** + * rtp超时时间,单位秒 + * timeoutSec=15 + */ + @JSONField(name = "rtp_proxy.timeoutSec") + private Integer proxyTimeoutSec; + /** + * 随机端口范围,最少确保36个端口 + * 该范围同时限制rtsp服务器udp端口范围 + * port_range=30000-35000 + */ + @JSONField(name = "rtp_proxy.port_range") + private String proxyPortRange; + /** + * rtp h264 负载的pt + * h264_pt=98 + */ + @JSONField(name = "rtp_proxy.h264_pt") + private Integer proxyH264Pt; + /** + * rtp h265 负载的pt + * h265_pt=99 + */ + @JSONField(name = "rtp_proxy.h265_pt") + private Integer proxyH265Pt; + /** + * rtp ps 负载的pt + * ps_pt=96 + */ + @JSONField(name = "rtp_proxy.ps_pt") + private Integer proxyPsPt; + /** + * rtp ts 负载的pt + * ts_pt=33 + */ + @JSONField(name = "rtp_proxy.ts_pt") + private Integer proxyTsPt; + /** + * rtp opus 负载的pt + * opus_pt=100 + */ + @JSONField(name = "rtp_proxy.opus_pt") + private Integer proxyOpusPt; + /** + * rtp g711u 负载的pt + * g711u_pt=0 + */ + @JSONField(name = "rtp_proxy.g711u_pt") + private Integer proxyG711UPt; + /** + * rtp g711a 负载的pt + * g711a_pt=8 + */ + @JSONField(name = "rtp_proxy.g711a_pt") + private Integer proxyG711APt; + // ----------------------------------------------- rtc ----------------------------------------------- + /** + * rtc播放推流、播放超时时间 + * timeoutSec=15 + */ + @JSONField(name = "rtc.timeoutSec") + private Integer rtcTimeoutSec; + /** + * 本机对rtc客户端的可见ip,作为服务器时一般为公网ip,可有多个,用','分开,当置空时,会自动获取网卡ip + * 同时支持环境变量,以$开头,如"$EXTERN_IP"; 请参考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786 + * externIP= + */ + @JSONField(name = "rtc.externIP") + private String rtcExternIp; + /** + * rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据, + * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 + * 需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致 + * port=8000 + */ + @JSONField(name = "rtc.port") + private Integer rtcPort; + /** + * 设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质 + * 目前已经实现twcc自动调整码率,关闭remb根据真实网络状况调整码率 + * rembBitRate=0 + */ + @JSONField(name = "rtc.rembBitRate") + private Integer rtcRembBitRate; + /** + * rtc支持的音频codec类型,在前面的优先级更高 + * 以下范例为所有支持的音频codec + * preferredCodecA=PCMU,PCMA,opus,mpeg4-generic + */ + @JSONField(name = "rtc.preferredCodecA") + private String rtcPreferredCodecA; + /** + * rtc支持的视频codec类型,在前面的优先级更高 + * 以下范例为所有支持的视频codec + * preferredCodecV=H264,H265,AV1X,VP9,VP8 + */ + @JSONField(name = "rtc.preferredCodecV") + private String rtcPreferredCodecV; + // ----------------------------------------------- srt ----------------------------------------------- + /** + * srt播放推流、播放超时时间,单位秒 + * timeoutSec=5 + */ + @JSONField(name = "srt.timeoutSec") + private Integer srtTimeoutSec; + /** + * srt udp服务器监听端口号,所有srt客户端将通过该端口传输srt数据, + * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 + * port=9000 + */ + @JSONField(name = "srt.port") + private Integer srtPort; + /** + * srt 协议中延迟缓存的估算参数,在握手阶段估算rtt ,然后latencyMul*rtt 为最大缓存时长,此参数越大,表示等待重传的时长就越大 + * latencyMul=4 + */ + @JSONField(name = "srt.latencyMul") + private Integer srtLatencyMul; + /** + * 包缓存的大小 + * pktBufSize=8192 + */ + @JSONField(name = "srt.pktBufSize") + private Integer srtPktBufSize; + // ----------------------------------------------- rtsp ----------------------------------------------- + /** + * rtsp专有鉴权方式是采用base64还是md5方式 + * authBasic=0 + */ + @JSONField(name = "rtsp.authBasic") + private Integer rtspAuthBasic; + /** + * rtsp拉流、推流代理是否是直接代理模式 + * 直接代理后支持任意编码格式,但是会导致GOP缓存无法定位到I帧,可能会导致开播花屏 + * 并且如果是tcp方式拉流,如果rtp大于mtu会导致无法使用udp方式代理 + * 假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理 + * 如果你是rtsp推拉流,但是webrtc播放,也建议关闭直接代理模式, + * 因为直接代理时,rtp中可能没有sps pps,会导致webrtc无法播放; 另外webrtc也不支持Single NAL Unit Packets类型rtp + * 默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的 + * directProxy=1 + */ + @JSONField(name = "rtsp.directProxy") + private Integer rtspDirectProxy; + /** + * rtsp必须在此时间内完成握手,否则服务器会断开链接,单位秒 + * handshakeSecond=15 + */ + @JSONField(name = "rtsp.handshakeSecond") + private Integer rtspHandshakeSecond; + /** + * rtsp超时时间,如果该时间内未收到客户端的数据, + * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 + * keepAliveSecond=15 + */ + @JSONField(name = "rtsp.keepAliveSecond") + private Integer rtspKeepAliveSecond; + /** + * rtsp服务器监听地址 + * port=554 + */ + @JSONField(name = "rtsp.port") + private Integer rtspPort = 0; + /** + * rtsps服务器监听地址 + * sslport=0 + */ + @JSONField(name = "rtsp.sslport") + private Integer rtspSslPort = 0; + // ----------------------------------------------- shell ----------------------------------------------- + /** + * 调试telnet服务器接受最大bufffer大小 + * maxReqSize=1024 + */ + @JSONField(name = "shell.maxReqSize") + private Integer shellMaxReqSize; + /** + * 调试telnet服务器监听端口 + * port=0 + */ + @JSONField(name = "shell.port") + private Integer shellPort; + + public void refreshHook(String ip, String port, StreamMediaServerConfig server) { + String host = ip + ":" + port; + this.hookOnFlowReport = StrUtil.format("http://{}/index/hook/on_flow_report", host); + this.hookOnHttpAccess = StrUtil.format("http://{}/index/hook/on_http_access", host); + this.hookOnPlay = StrUtil.format("http://{}/index/hook/on_play", host); + this.hookOnPublish = StrUtil.format("http://{}/index/hook/on_publish", host); + this.hookOnRecordMp4 = StrUtil.format("http://{}/index/hook/on_record_mp4", host); + this.hookOnRecordTs = StrUtil.format("http://{}/index/hook/on_record_ts", host); + this.hookOnRtspAuth = StrUtil.format("http://{}/index/hook/on_rtsp_auth", host); + this.hookOnRtspRealm = StrUtil.format("http://{}/index/hook/on_rtsp_realm", host); + this.hookOnShellLogin = StrUtil.format("http://{}/index/hook/on_shell_login", host); + this.hookOnStreamChanged = StrUtil.format("http://{}/index/hook/on_stream_changed", host); + this.hookOnStreamNoneReader = StrUtil.format("http://{}/index/hook/on_stream_none_reader", host); + this.hookOnStreamNotFound = StrUtil.format("http://{}/index/hook/on_stream_not_found", host); + this.hookOnServerStarted = StrUtil.format("http://{}/index/hook/on_server_started", host); + this.hookOnServerKeepalive = StrUtil.format("http://{}/index/hook/on_server_keepalive", host); +// this.hookOnSendRtpStopped = StrUtil.format("http://{}/index/hook/on_send_rtp_stopped", host); + this.hookOnSendRtpStopped = ""; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java new file mode 100644 index 0000000..143b1fc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java @@ -0,0 +1,30 @@ +package com.dite.znpt.monitor.media.zlm.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/30 10:50 + * @Description: 节点基础信息 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ServerInfo implements Serializable { + /** + * 节点地址 + */ + private String apiHost; + /** + * 节点端口 + */ + private Integer apiPort; + /** + * 节点秘钥 + */ + private String secretKey; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java new file mode 100644 index 0000000..96bf6d6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java @@ -0,0 +1,106 @@ +package com.dite.znpt.monitor.media.zlm.dto; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; +import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @Author: huise23 + * @Date: 2022/8/30 10:50 + * @Description: 节点信息 + */ +@Data +@NoArgsConstructor +public class ServerItem implements Serializable { + /** + * 播流最大并发个数 + */ + public static final Integer MAX_PLAY_COUNT = 10000; + /** + * 节点信息ID + */ + private String configId; + /** + * 流ID前缀 + */ + private String streamPrefix; + /** + * 节点信息ID + */ + private ServerInfo server; + /** + * 节点格式信息 + */ + private List formatList; + /** + * 节点配置信息 + */ + private ServerConfig config; + /** + * 当前流信息 + */ + private List media; + /** + * 节点状态是否正常 + */ + private Boolean status; + /** + * 流媒体服务器已用的会话句柄 + */ + private Set usedSn; + + public ServerItem(StreamMediaServerConfig server, List formatList) { + this.streamPrefix = server.getStreamPrefix(); + this.server = new ServerInfo(server.getApiHost(), server.getApiPort(), server.getSecretKey()); + this.formatList = formatList; + this.status = false; + this.usedSn = new HashSet<>(); + } + + public String genPlaySsrc(String channelCode) { + if (this.usedSn.size() >= MAX_PLAY_COUNT) { + throw new ServiceException("ssrc已经用完!"); + } + int sn; + for (sn = 0; sn < MAX_PLAY_COUNT; sn++) { + if (!this.usedSn.contains(sn)) { + this.usedSn.add(sn); + break; + } + } + //return StrUtil.format("0{}{}", StrUtil.blankToDefault(streamPrefix, channelCode.substring(3, 8)), NumberUtil.decimalFormat("0000", sn)); + return channelCode; + } + + public void releaseSsrc(String ssrc) { + try { + Integer sn = NumberUtil.parseInt(ssrc.substring(6)); + usedSn.remove(sn); + } catch (Exception ignored) { + } + } + + public void setMedia(List media) { + this.media = media; + if (CollUtil.isNotEmpty(media)) { + media.forEach(item -> { + try { + Integer sn = NumberUtil.parseInt(StrUtil.isBlank(streamPrefix) ? item.getStream().substring(6) : item.getStream().replace("0" + streamPrefix, "")); + usedSn.add(sn); + } catch (Exception ignored) { + } + }); + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java new file mode 100644 index 0000000..a4125ae --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java @@ -0,0 +1,48 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:24 + * @Description: + */ +@Data +public class BaseEventReq { + /** + * 服务器id,通过配置文件设置 + */ + private String mediaServerId; + /** + * 流应用名 + */ + private String app; + /** + * TCP链接唯一ID + */ + private String id; + /** + * 播放器ip + */ + private String ip; + /** + * 播放url参数 + */ + private String params; + /** + * 播放器端口号 + */ + private Integer port; + /** + * 播放的协议,可能是rtsp、rtmp、http + */ + private String schema; + /** + * 流ID + */ + private String stream; + /** + * 流虚拟主机 + */ + private String vhost; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java new file mode 100644 index 0000000..04b573f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java @@ -0,0 +1,42 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:33 + * @Description: 请求响应基类 + */ +@Data +@Accessors(chain = true) +public class BaseEventResp { + /** + * code == 0时代表完全成功 + */ + private Integer code; + /** + * 失败提示 + */ + private String msg; + /** + * 失败具体原因 + */ + private String err; + /** + * 该rtsp流是否需要rtsp专有鉴权,空字符串代码不需要鉴权 + */ + private String realm; + /** + * 是否关闭推流或拉流 + */ + private Boolean close; + + public BaseEventResp setSuccess(){ + return this.setCode(0).setMsg("success").setErr(""); + } + + public static BaseEventResp success() { + return new BaseEventResp().setSuccess(); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java new file mode 100644 index 0000000..1661a94 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java @@ -0,0 +1,26 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:04 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class FlowReportReq extends BaseEventReq { + /** + * tcp链接维持时间,单位秒 + */ + private Integer duration; + /** + * true为播放器,false为推流器 + */ + private Boolean player; + /** + * 耗费上下行流量总和,单位字节 + */ + private Integer totalBytes; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java new file mode 100644 index 0000000..dfae6d6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import cn.hutool.core.lang.Dict; +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:10 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class HttpAccessReq extends BaseEventReq { + /** + * http客户端请求header + */ + private Dict header; + /** + * 访问路径是文件还是目录 + */ + @JSONField(name = "is_dir") + private Boolean isDir; + /** + * 请求访问的文件或目录 + */ + private String path; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java new file mode 100644 index 0000000..51424d8 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java @@ -0,0 +1,34 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:15 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class HttpAccessResp extends BaseEventResp { + /** + * 该客户端能访问或被禁止的顶端目录,如果为空字符串,则表述为当前目录 + */ + private String path; + /** + * 本次授权结果的有效期,单位秒 + */ + private Integer second; + /** + * 服务器id,通过配置文件设置 + */ + private String mediaServerId; + + public static HttpAccessResp success() { + HttpAccessResp resp = new HttpAccessResp(); + resp.setSuccess(); + return resp.setSecond(600).setPath(""); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java new file mode 100644 index 0000000..2531052 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:19 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PlayReq extends BaseEventReq { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java new file mode 100644 index 0000000..de324dc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:57 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PublishReq extends BaseEventReq{ +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java new file mode 100644 index 0000000..f16d943 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java @@ -0,0 +1,81 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:27 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PublishResp extends BaseEventResp { + /** + * 是否转换成hls协议 + */ + @JSONField(name = "enable_hls") + private Boolean enableHls; + /** + * 是否允许mp4录制 + */ + @JSONField(name = "enable_mp4") + private Boolean enableMp4; + /** + * 是否转rtsp协议 + */ + @JSONField(name = "enable_rtsp") + private Boolean enableRtsp; + /** + * 是否转rtmp/flv协议 + */ + @JSONField(name = "enable_rtmp") + private Boolean enableRtmp; + /** + * 是否转http-ts/ws-ts协议 + */ + @JSONField(name = "enable_ts") + private Boolean enableTs; + /** + * 是否转http-fmp4/ws-fmp4协议 + */ + @JSONField(name = "enable_fmp4") + private Boolean enableFmp4; + /** + * 转协议时是否开启音频 + */ + @JSONField(name = "enable_audio") + private Boolean enableAudio; + /** + * 转协议时,无音频是否添加静音aac音频 + */ + @JSONField(name = "add_mute_audio") + private Boolean addMuteAudio; + /** + * mp4录制文件保存根目录,置空使用默认 + */ + @JSONField(name = "mp4_save_path") + private String mp4SavePath; + /** + * mp4录制切片大小,单位秒 + */ + @JSONField(name = "mp4_max_second") + private Integer mp4MaxSecond; + /** + * hls文件保存保存根目录,置空使用默认 + */ + @JSONField(name = "hls_save_path") + private String hlsSavePath; + /** + * 断连续推延时,单位毫秒,置空使用配置文件默认值 + */ + @JSONField(name = "continue_push_ms") + private Long continuePushMs; + + public static PublishResp success() { + PublishResp resp = new PublishResp(); + resp.setSuccess(); + return resp; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java new file mode 100644 index 0000000..50142ec --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java @@ -0,0 +1,48 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:32 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RecordMp4Req extends BaseEventReq { + /** + * 文件名 + */ + @JSONField(name = "file_name") + private String fileName; + /** + * 文件绝对路径 + */ + @JSONField(name = "file_path") + private String filePath; + /** + * 文件大小,单位字节 + */ + @JSONField(name = "file_size") + private Integer fileSize; + /** + * 文件所在目录路径 + */ + private String folder; + /** + * 开始录制时间戳 + */ + @JSONField(name = "start_time") + private Integer startTime; + /** + * 录制时长,单位秒 + */ + @JSONField(name = "time_len") + private Integer timeLen; + /** + * http/rtsp/rtmp点播相对url路径 + */ + private String url; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java new file mode 100644 index 0000000..bcb51e5 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java @@ -0,0 +1,30 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:35 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RtspAuthReq extends BaseEventReq { + /** + * 请求的密码是否必须为明文(base64鉴权需要明文密码) + */ + @JSONField(name = "must_no_encrypt") + private Boolean mustNoEncrypt; + /** + * rtsp播放鉴权加密realm + */ + private String realm; + /** + * 播放用户名 + */ + @JSONField(name = "user_name") + private String userName; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java new file mode 100644 index 0000000..2021549 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java @@ -0,0 +1,30 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:35 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class RtspAuthResp extends BaseEventResp { + /** + * 用户密码 + */ + private String passwd; + /** + * 用户密码是否已加密 + */ + private Boolean encrypted; + + public static RtspAuthResp success() { + RtspAuthResp resp = new RtspAuthResp(); + resp.setSuccess(); + return resp.setEncrypted(false); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java new file mode 100644 index 0000000..8d6547f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:33 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RtspRealmReq extends BaseEventReq { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java new file mode 100644 index 0000000..d023328 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java @@ -0,0 +1,16 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.dite.znpt.monitor.media.zlm.dto.resp.StatisticResp; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:43 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ServerKeepaliveReq extends BaseEventReq { + private StatisticResp data; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java new file mode 100644 index 0000000..86016eb --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java @@ -0,0 +1,24 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:37 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ShellLoginReq extends BaseEventReq { + /** + * 终端登录用户密码 + */ + private String passwd; + /** + * 终端登录用户名 + */ + @JSONField(name = "user_name") + private String userName; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java new file mode 100644 index 0000000..cd90632 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java @@ -0,0 +1,19 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:38 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StreamChangedReq extends MediaResp { + /** + * 流注册或注销 + */ + private Boolean regist; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java new file mode 100644 index 0000000..65e34bf --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:40 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StreamNoneReaderReq extends BaseEventReq { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java new file mode 100644 index 0000000..0ead9cc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java @@ -0,0 +1,14 @@ +package com.dite.znpt.monitor.media.zlm.dto.event; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/30 9:42 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StreamNotFoundReq extends BaseEventReq { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java new file mode 100644 index 0000000..445aef0 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java @@ -0,0 +1,18 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:33 + * @Description: 请求响应基类 + */ +@Data +public class BaseReq implements Serializable { + /** + * api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数 + */ + private String secret; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java new file mode 100644 index 0000000..2eb3044 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java @@ -0,0 +1,18 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:51 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class CloseStreamReq extends StreamReq { + /** + * 是否强制关闭(有人在观看是否还关闭) + */ + private Integer force; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java new file mode 100644 index 0000000..54de5d0 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 12:26 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class FFmpegSourceReq extends BaseReq { + /** + * FFmpeg拉流地址,支持任意协议或格式(只要FFmpeg支持即可) + */ + @JSONField(name = "src_url") + private String srcUrl; + /** + * FFmpeg rtmp推流地址,一般都是推给自己,例如rtmp://127.0.0.1/live/stream_form_ffmpeg + */ + @JSONField(name = "dst_url") + private String dstUrl; + /** + * FFmpeg推流成功超时时间 + */ + @JSONField(name = "timeout_ms") + private Integer timeoutMs; + /** + * 是否开启hls录制 + */ + @JSONField(name = "enable_hls") + private Integer enableHls; + /** + * 是否开启mp4录制 + */ + @JSONField(name = "enable_mp4") + private Integer enableMp4; + /** + * 配置文件中FFmpeg命令参数模板key(非内容),置空则采用默认模板:ffmpeg.cmd + */ + @JSONField(name = "ffmpeg_cmd_key") + private String ffmpegCmdKey; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java new file mode 100644 index 0000000..dd01aa5 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java @@ -0,0 +1,25 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 17:21 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class GetAllSessionReq extends BaseReq{ + /** + *筛选本机端口,例如筛选rtsp链接:554 + */ + @JSONField(name = "local_port") + private Integer localPort; + /** + *筛选客户端ip + */ + @JSONField(name = "peer_ip") + private String peerIp; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java new file mode 100644 index 0000000..6b05d35 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java @@ -0,0 +1,24 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:04 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class GetMp4RecordFileReq extends StreamReq { + /** + * 流的录像日期,格式为2020-02-01,如果不是完整的日期,那么是搜索录像文件夹列表,否则搜索对应日期下的mp4文件列表 + */ + private String period; + /** + * 自定义搜索路径,与startRecord方法中的customized_path一样,默认为配置文件的路径 + */ + @JSONField(name = "customized_path") + private String customizedPath; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java new file mode 100644 index 0000000..82c454d --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java @@ -0,0 +1,20 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 17:24 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +public class IdReq extends BaseReq { + /** + * 客户端唯一id,可以通过getAllSession接口获取 + */ + private Long id; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java new file mode 100644 index 0000000..91ebcd9 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java @@ -0,0 +1,20 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 17:30 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +public class KeyReq extends BaseReq { + /** + * addStreamProxy接口返回的key + */ + private String key; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java new file mode 100644 index 0000000..4e3dc21 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:11 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RecordReq extends StreamReq { + /** + * 0为hls,1为mp4 + */ + private Integer type; + /** + * 录像保存目录 + */ + @JSONField(name = "customized_path") + private String customizedPath; + /** + * mp4录像切片时间大小,单位秒,置0则采用配置项 + */ + @JSONField(name = "max_second") + private Integer maxSecond; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java new file mode 100644 index 0000000..a7003e7 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:17 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class RtpServerReq extends BaseReq { + /** + * 接收端口,0则为随机端口 + */ + private Integer port; + /** + * 启用UDP监听的同时是否监听TCP端口 + */ + @JSONField(name = "enable_tcp") + private Integer enableTcp; + /** + * 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) + */ + @JSONField(name = "stream_id") + private String streamId; + + public RtpServerReq(Integer port, Integer enableTcp, String streamId) { + this.port = port; + this.enableTcp = enableTcp; + this.streamId = streamId; + } + + public RtpServerReq(Integer enableTcp, String streamId) { + this(0, enableTcp, streamId); + } + + public RtpServerReq(String streamId) { + this(1, streamId); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java new file mode 100644 index 0000000..20807df --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java @@ -0,0 +1,53 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:23 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SendRtpReq extends StreamReq { + /** + * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 + */ + private String ssrc; + /** + * 目标ip或域名 + */ + @JSONField(name = "dst_url") + private String dstUrl; + /** + * 目标端口 + */ + @JSONField(name = "dst_port") + private Integer dstPort; + /** + * 是否为udp模式,否则为tcp模式 + */ + @JSONField(name = "is_udp") + private Integer isUdp; + /** + * 使用的本机端口,为0或不传时默认为随机端口 + */ + @JSONField(name = "src_port") + private Integer srcPort; + /** + * 使用的本机端口,为0或不传时默认为随机端口 + */ + private Integer pt; + /** + * 发送时,rtp的负载类型。为1时,负载为ps;为0时,为es;不传时默认为1 + */ + @JSONField(name = "use_ps") + private Integer usePs; + /** + * 当use_ps 为0时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 + */ + @JSONField(name = "only_audio") + private Integer onlyAudio; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java new file mode 100644 index 0000000..548cfd7 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:14 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SnapReq extends BaseReq { + /** + * 需要截图的url,可以是本机的,也可以是远程主机的 + */ + private String url; + /** + * 截图失败超时时间,防止FFmpeg一直等待截图 + */ + @JSONField(name = "timeout_sec") + private Integer timeoutSec; + /** + * 截图的过期时间,该时间内产生的截图都会作为缓存返回 + */ + @JSONField(name = "expire_sec") + private Integer expireSec; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java new file mode 100644 index 0000000..a53d2dc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java @@ -0,0 +1,22 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 17:30 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +public class StreamIdReq extends BaseReq { + /** + * RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) + */ + @JSONField(name = "stream_id") + private String streamId; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java new file mode 100644 index 0000000..8481f0a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java @@ -0,0 +1,89 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 12:19 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StreamProxyReq extends StreamReq { + /** + * 拉流地址,例如rtmp://live.hkstv.hk.lxdns.com/live/hks2 Y + */ + private String url; + /** + * 拉流重试次数,默认为-1无限重试 + */ + @JSONField(name = "retry_count") + private Integer retryCount; + /** + * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 + */ + @JSONField(name = "rtp_type") + private Integer rtpType; + /** + * 拉流超时时间,单位秒,float类型 + */ + @JSONField(name = "timeout_sec") + private Integer timeoutSec; + /** + * 是否转换成hls协议 + */ + @JSONField(name = "enable_hls") + private Integer enableHls; + /** + * 是否允许mp4录制 + */ + @JSONField(name = "enable_mp4") + private Integer enableMp4; + /** + * 是否转rtsp协议 + */ + @JSONField(name = "enable_rtsp") + private Integer enableRtsp; + /** + * 是否转rtmp/flv协议 + */ + @JSONField(name = "enable_rtmp") + private Integer enableRtmp; + /** + * 是否转http-ts/ws-ts协议 + */ + @JSONField(name = "enable_ts") + private Integer enableTs; + /** + * 是否转http-fmp4/ws-fmp4协议 + */ + @JSONField(name = "enable_fmp4") + private Integer enableFmp4; + /** + * 转协议时是否开启音频 + */ + @JSONField(name = "enable_audio") + private Integer enableAudio; + /** + * 转协议时,无音频是否添加静音aac音频 + */ + @JSONField(name = "add_mute_audio") + private Integer addMuteAudio; + /** + * mp4录制文件保存根目录,置空使用默认 + */ + @JSONField(name = "mp4_save_path") + private String mp4SavePath; + /** + * mp4录制切片大小,单位秒 + */ + @JSONField(name = "mp4_max_second") + private Integer mp4MaxSecond; + /** + * hls文件保存保存根目录,置空使用默认 + */ + @JSONField(name = "hls_save_path") + private String hlsSavePath; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java new file mode 100644 index 0000000..6729ba1 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java @@ -0,0 +1,35 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:50 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StreamPusherProxyReq extends StreamReq { + /** + * 目标转推url,带参数需要自行url转义 + */ + @JSONField(name = "dst_url") + private String dstUrl; + /** + * 转推失败重试次数,默认无限重试 + */ + @JSONField(name = "retry_count") + private Integer retryCount; + /** + * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 + */ + @JSONField(name = "rtp_type") + private Integer rtpType; + /** + * 拉流超时时间,单位秒,float类型 + */ + @JSONField(name = "timeout_sec") + private Float timeoutSec; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java new file mode 100644 index 0000000..404369a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.monitor.media.zlm.dto.req; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:05 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class StreamReq extends BaseReq { + /** + * 协议,例如 rtsp或rtmp + */ + private String schema; + /** + * 筛选虚拟主机,例如__defaultVhost__ + */ + private String vhost; + /** + * 筛选应用名,例如 live + */ + private String app; + /** + * 筛选流id,例如 test + */ + private String stream; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java new file mode 100644 index 0000000..d6cfa48 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java @@ -0,0 +1,64 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import lombok.Data; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:33 + * @Description: 请求响应基类 + */ +@Data +public class BaseResp { + /** + * code == 0时代表完全成功 + */ + private Integer code; + /** + * 失败提示 + */ + private String msg; + /** + * 失败具体原因 + */ + private String result; + /** + * 返回数据 + */ + private String data; + /** + * 配置项变更个数 + */ + private Integer changed; + /** + * false:未录制,true:正在录制 + */ + private Boolean status; + /** + * 接收端口,方便获取随机端口号 + */ + private Integer port; + /** + * 是否找到记录并关闭 + */ + private Integer hit; + + public String getMsg() { + return StrUtil.format("{}:{}", code, msg); + } + + public Boolean isSuccess() { + return code == 0; + } + + public T getData(Class clazz) { + return JSON.parseObject(data, clazz); + } + + public List getList(Class clazz) { + return JSON.parseArray(data, clazz); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java new file mode 100644 index 0000000..aa0bf8e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java @@ -0,0 +1,25 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 11:59 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class CloseStreamResp extends BaseResp { + /** + * 筛选命中的流个数 + */ + @JSONField(name = "count_hit") + private Integer countHit; + /** + * 被关闭的流个数,可能小于count_hit + */ + @JSONField(name = "count_closed") + private Integer countClosed; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java new file mode 100644 index 0000000..a425cf0 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java @@ -0,0 +1,58 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.dite.znpt.monitor.media.zlm.dto.event.BaseEventReq; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/29 11:18 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MediaResp extends BaseEventReq { + /** + * 本协议观看人数 + */ + private Integer readerCount; + /** + * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv + */ + private Integer totalReaderCount; + /** + * 客户端和服务器网络信息,可能为null类型 + */ + private OriginSock originSock; + /** + * 产生源类型,包括 unknown = 0, rtmp_push = 1, rtsp_push = 2, rtp_push = 3, pull = 4, ffmpeg_pull = 5, mp4_vod = 6, device_chn = 7 + */ + private Integer originType; + /** + * 产生源类型 + */ + private String originTypeStr; + /** + * 产生源的url + */ + private String originUrl; + /** + * GMT unix系统时间戳,单位秒 + */ + private Long createStamp; + /** + * 存活时间,单位秒 + */ + private Long aliveSecond; + /** + * 数据产生速度,单位byte/s + */ + private Long bytesSpeed; + /** + * 音视频轨道 + */ + private List tracks; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java new file mode 100644 index 0000000..f39ea4f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java @@ -0,0 +1,23 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:08 + * @Description: + */ +@Data +public class Mp4RecordFileResp { + /** + * 文件列表 + */ + private List paths; + /** + * 根路径 + */ + private String rootPath; +} + diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java new file mode 100644 index 0000000..37168cc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java @@ -0,0 +1,22 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/29 11:20 + * @Description: + */ +@Data +public class OriginSock { + private String identifier; + @JSONField(name = "local_ip") + private String localIp; + @JSONField(name = "local_port") + private Integer localPort; + @JSONField(name = "peer_ip") + private String peerIp; + @JSONField(name = "peer_port") + private Integer peerPort; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java new file mode 100644 index 0000000..b8654a5 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java @@ -0,0 +1,39 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: huise23 + * @Date: 2022/8/29 12:32 + * @Description: + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RtpInfoResp extends BaseResp { + /** + * 是否存在 + */ + private Boolean exist; + /** + * 推流客户端ip + */ + @JSONField(name = "peer_ip") + private String peerIp; + /** + * 客户端端口号 + */ + @JSONField(name = "peer_port") + private Integer peerPort; + /** + * 本地监听的网卡ip + */ + @JSONField(name = "local_ip") + private String localIp; + /** + * 本地监听端口号 + */ + @JSONField(name = "local_port") + private Integer localPort; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java new file mode 100644 index 0000000..1a5267f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java @@ -0,0 +1,22 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:22 + * @Description: + */ +@Data +public class RtpServerResp { + /** + * 绑定的端口号 + */ + private Integer port; + /** + * 绑定的流ID + */ + @JSONField(name = "stream_id") + private String streamId; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java new file mode 100644 index 0000000..eaf6119 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java @@ -0,0 +1,41 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/29 12:04 + * @Description: + */ +@Data +public class SessionResp { + /** + * 该tcp链接唯一id + */ + private Long id; + /** + * 本机网卡ip + */ + @JSONField(name = "local_ip") + private String localIp; + /** + * 本机端口号 (这是个rtmp播放器或推流器) + */ + @JSONField(name = "local_port") + private Integer localPort; + /** + * 客户端ip + */ + @JSONField(name = "peer_ip") + private String peerIp; + /** + * 客户端端口号 + */ + @JSONField(name = "peer_port") + private Integer peerPort; + /** + * 客户端TCPSession typeid + */ + private String typeid; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java new file mode 100644 index 0000000..f464784 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java @@ -0,0 +1,28 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/29 13:47 + * @Description: + */ +@Data +public class StatisticResp { + private Integer Buffer; + private Integer BufferLikeString; + private Integer BufferList; + private Integer BufferRaw; + private Integer Frame; + private Integer FrameImp; + private Integer MediaSource; + private Integer MultiMediaSourceMuxer; + private Integer RtmpPacket; + private Integer RtpPacket; + private Integer Socket; + private Integer TcpClient; + private Integer TcpServer; + private Integer TcpSession; + private Integer UdpServer; + private Integer UdpSession; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java new file mode 100644 index 0000000..9c0257e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java @@ -0,0 +1,22 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import lombok.Data; + + + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:40 + * @Description: 各epoll(或select)线程负载以及延时 + */ +@Data +public class ThreadsLoadResp { + /** + * 该线程延时 + */ + private Integer delay; + /** + * 该线程负载 + */ + private Integer load; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java new file mode 100644 index 0000000..3cdd362 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java @@ -0,0 +1,58 @@ +package com.dite.znpt.monitor.media.zlm.dto.resp; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * @Author: huise23 + * @Date: 2022/8/29 11:25 + * @Description: + */ +@Data +public class Track { + /** + * 音频通道数 + */ + private Integer channels; + /** + * H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4 + */ + @JSONField(name = "codec_id") + private Integer codecId; + /** + * 编码类型名称 + */ + @JSONField(name = "codec_id_name") + private String codecIdName; + /** + * Video = 0, Audio = 1 + */ + @JSONField(name = "codec_type") + private Integer codecType; + /** + * 轨道是否准备就绪 + */ + private Boolean ready; + /** + * 音频采样位数 + */ + @JSONField(name = "sample_bit") + private Integer sampleBit; + /** + * 音频采样率 + */ + @JSONField(name = "sample_rate") + private Integer sampleRate; + /** + * 视频fps + */ + private Integer fps; + /** + * 视频高 + */ + private Integer height; + /** + * 视频宽 + */ + private Integer width; +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java new file mode 100644 index 0000000..215715c --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java @@ -0,0 +1,43 @@ +package com.dite.znpt.monitor.media.zlm.enums; + +import lombok.Getter; + +/** + * @Author: huise23 + * @Date: 2022/8/31 10:29 + * @Description: + */ +@Getter +public enum MediaFormatType { + /** + * FLV + */ + flv(".live.flv"), + /** + * MP4 + */ + mp4(".live.mp4"), + /** + * HLS + */ + hls("/hls.m3u8"), + /** + * RTS + */ + rts(".live.ts"); + + private final String suffix; + + MediaFormatType(String suffix) { + this.suffix = suffix; + } + + public static String getSuffix(String name) { + for (MediaFormatType value : MediaFormatType.values()) { + if (value.name().equals(name)) { + return value.getSuffix(); + } + } + return ""; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java new file mode 100644 index 0000000..8fb1977 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java @@ -0,0 +1,225 @@ +package com.dite.znpt.monitor.media.zlm.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.dite.znpt.monitor.media.zlm.ZlmApi; +import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; +import com.dite.znpt.monitor.media.zlm.dto.req.*; +import com.dite.znpt.monitor.media.zlm.dto.resp.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/29 10:22 + * @Description: + */ +@Service +@Slf4j +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ZlmApiImpl implements ZlmApi { + private final HttpServletResponse response; + + public V post(ServerInfo server, String url, T req, Class clazz) { + url = StrUtil.format("http://{}:{}/index/api/{}", server.getApiHost(), server.getApiPort(), url); + log.info("ZLM:" + url); + log.info("REQ:" + req); + req.setSecret(server.getSecretKey()); + String respStr = HttpUtil.post(url, JSONUtil.toJsonStr(req)); + V resp = JSONUtil.toBean(respStr, clazz); + if (resp.isSuccess()) { + return resp; + } + throw new RuntimeException(resp.getMsg()); + } + + public BaseResp post(ServerInfo server, String url, T req) { + return post(server, url, req, BaseResp.class); + } + + public V post(ServerInfo server, String url, Class clazz) { + return post(server, url, new BaseReq(), clazz); + } + + public BaseResp post(ServerInfo server, String url) { + return post(server, url, new BaseReq()); + } + + @Override + public List getApiList(ServerInfo server) { + return post(server, "getApiList").getList(String.class); + } + + @Override + public List getThreadsLoad(ServerInfo server) { + return post(server, "getThreadsLoad").getList(ThreadsLoadResp.class); + } + + @Override + public List getWorkThreadsLoad(ServerInfo server) { + return post(server, "getWorkThreadsLoad").getList(ThreadsLoadResp.class); + } + + @Override + public List getServerConfig(ServerInfo server) { + return post(server, "getServerConfig").getList(ServerConfig.class); + } + +// public static void main(String[] args) { +// ZlmApi zlmApi = new ZlmApiImpl(null); +// ServerInfo server = new ServerInfo("10.12.1.41", 8819, "035c73f7-bb6b-4889-a715-d9eb2d1925cc"); +// List config = zlmApi.getMediaList(server,new StreamReq()); +// System.out.println(JSONUtil.toJsonPrettyStr(config)); +// for (MediaResp mediaResp : config) { +// zlmApi.closeRtpServer(server,mediaResp.getStream() ); +// } +// } + + @Override + public Integer setServerConfig(ServerInfo server, ServerConfig config) { + BaseResp req = post(server, "setServerConfig", config); + return req.getChanged(); + } + + @Override + public Boolean restartServer(ServerInfo server) { + BaseResp req = post(server, "restartServer"); + return req.isSuccess(); + } + + @Override + public List getMediaList(ServerInfo server, StreamReq req) { + return post(server, "getMediaList", req).getList(MediaResp.class); + } + + @Override + public CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req) { + return post(server, "close_streams", req, CloseStreamResp.class); + } + + @Override + public List getAllSession(ServerInfo server, GetAllSessionReq req) { + return post(server, "getAllSession", req).getList(SessionResp.class); + } + + @Override + public Boolean kickSession(ServerInfo server, Long id) { + return post(server, "kick_session", new IdReq(id)).isSuccess(); + } + + @Override + public Integer kickSession(ServerInfo server, GetAllSessionReq req) { + return post(server, "kick_sessions", req, CloseStreamResp.class).getCountHit(); + } + + @Override + public String addStreamProxy(ServerInfo server, StreamProxyReq req) { + return post(server, "addStreamProxy", req).getData(Dict.class).getStr("key"); + } + + @Override + public Boolean delStreamProxy(ServerInfo server, String key) { + return post(server, "delStreamProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); + } + + @Override + public String addFfMpegSource(ServerInfo server, FFmpegSourceReq req) { + return post(server, "addFFmpegSource", req).getData(Dict.class).getStr("key"); + } + + @Override + public Boolean delFfMpegSource(ServerInfo server, String key) { + return post(server, "delFFmpegSource", new KeyReq(key)).getData(Dict.class).getBool("flag"); + } + + @Override + public RtpInfoResp getRtpInfo(ServerInfo server, String streamId) { + return post(server, "getRtpInfo", new StreamIdReq(streamId), RtpInfoResp.class); + } + + @Override + public Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req) { + return post(server, "getMp4RecordFile", req).getData(Mp4RecordFileResp.class); + } + + @Override + public Boolean startRecord(ServerInfo server, RecordReq req) { + return BooleanUtil.toBoolean(post(server, "startRecord", req).getResult()); + } + + @Override + public Boolean stopRecord(ServerInfo server, RecordReq req) { + return BooleanUtil.toBoolean(post(server, "stopRecord", req).getResult()); + } + + @Override + public Boolean isRecording(ServerInfo server, RecordReq req) { + return post(server, "isRecording", req).getStatus(); + } + + @Override + public void getSnap(ServerInfo server, SnapReq req) throws IOException { + String url = StrUtil.format("http://{}:{}/index/api/getSnap", server.getApiHost(), server.getApiPort()); + req.setSecret(server.getSecretKey()); + url += "?" + HttpUtil.toParams(BeanUtil.beanToMap(req)); + HttpUtil.download(url, response.getOutputStream(), true); + } + + @Override + public Integer openRtpServer(ServerInfo server, RtpServerReq req) { + return post(server, "openRtpServer", req).getPort(); + } + + @Override + public Boolean closeRtpServer(ServerInfo server, String streamId) { + BaseResp closeRtpServer = post(server, "closeRtpServer", new StreamIdReq(streamId)); + return closeRtpServer.getHit() == 1; + } + + @Override + public List listRtpServer(ServerInfo server) { + return post(server, "listRtpServer").getList(RtpServerResp.class); + } + + @Override + public Integer startSendRtp(ServerInfo server, SendRtpReq req) { + return post(server, "startSendRtp", req, RtpInfoResp.class).getLocalPort(); + } + + @Override + public Integer startSendRtpPassive(ServerInfo server, SendRtpReq req) { + return post(server, "startSendRtpPassive", req, RtpInfoResp.class).getLocalPort(); + } + + @Override + public Boolean stopSendRtp(ServerInfo server, SendRtpReq req) { + return post(server, "stopSendRtp", req).isSuccess(); + } + + @Override + public StatisticResp getStatistic(ServerInfo server) { + return post(server, "getStatistic").getData(StatisticResp.class); + } + + @Override + public String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req) { + return post(server, "addStreamPusherProxy", req).getData(Dict.class).getStr("key"); + } + + @Override + public Boolean delStreamPusherProxy(ServerInfo server, String key) { + return post(server, "delStreamPusherProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java new file mode 100644 index 0000000..2bc7a2e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java @@ -0,0 +1,132 @@ +package com.dite.znpt.monitor.media.zlm.impl; + +import com.dite.znpt.monitor.media.zlm.ZlmService; +import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.event.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author: huise23 + * @Date: 2022/8/30 10:32 + * @Description: + */ +@Service +@Slf4j +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ZlmHookService { + private final ZlmService zlmService; + + /** + * TODO 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, + * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 + */ + public BaseEventResp onFlowReport(FlowReportReq req) { + log.debug("[ZLM] onFlowReport : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO 访问http文件服务器上hls之外的文件时触发。 + */ + public HttpAccessResp onHttpAccess(HttpAccessReq req) { + log.debug("[ZLM] onHttpAccess : {}", req); + return HttpAccessResp.success(); + } + + /** + * TODO 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; + * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 + * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 + */ + public BaseEventResp onPlay(PlayReq req) { + log.debug("[ZLM] onPlay : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO rtsp/rtmp/rtp推流鉴权事件。 + */ + public PublishResp onPublish(PublishReq req) { + System.out.println("[ZLM] 接收到推流信息"); + log.info("[ZLM] onPublish : {}", req); + return PublishResp.success(); + } + + /** + * TODO 录制mp4完成后通知事件;此事件对回复不敏感。 + */ + public BaseEventResp onRecordMp4(RecordMp4Req req) { + log.debug("[ZLM] onRecordMp4 : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 + * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 + */ + public BaseEventResp onRtspRealm(RtspRealmReq req) { + log.debug("[ZLM] onRtspRealm : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 + */ + public RtspAuthResp onRtspAuth(RtspAuthReq req) { + log.debug("[ZLM] onRtspAuth : {}", req); + return RtspAuthResp.success(); + } + + /** + * TODO shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 + * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 + */ + public BaseEventResp onShellLogin(ShellLoginReq req) { + log.debug("[ZLM] onShellLogin : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 + */ + public BaseEventResp onStreamChanged(StreamChangedReq req) { + log.info("[ZLM] onStreamChanged 流信息 : {}", req); + return BaseEventResp.success(); + } + + /** + * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 + */ + public BaseEventResp onStreamNoneReader(StreamNoneReaderReq req) { + log.debug("[ZLM] onStreamNoneReader : {}", req); + zlmService.display(req.getMediaServerId(), req.getStream()); + return BaseEventResp.success().setClose(false); + } + + /** + * TODO 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 + */ + public BaseEventResp onStreamNotFound(StreamNotFoundReq req) { + log.debug("[ZLM] onStreamNotFound : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 + */ + public BaseEventResp onServerStarted(ServerConfig req) { + log.debug("[ZLM] onServerStarted : {}", req); + return BaseEventResp.success(); + } + + /** + * TODO 服务器定时上报时间,上报间隔可配置,默认10s上报一次 + */ + public BaseEventResp onServerKeepalive(ServerKeepaliveReq req) { + log.debug("[ZLM] onServerKeepalive : {}", req); + return BaseEventResp.success(); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java new file mode 100644 index 0000000..aa27940 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java @@ -0,0 +1,195 @@ +package com.dite.znpt.monitor.media.zlm.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; +import com.dite.znpt.monitor.media.zlm.ZlmApi; +import com.dite.znpt.monitor.media.zlm.ZlmService; +import com.dite.znpt.monitor.media.zlm.cache.MediaServerCache; +import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; +import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.MediaItem; +import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; +import com.dite.znpt.monitor.media.zlm.dto.ServerItem; +import com.dite.znpt.monitor.media.zlm.dto.req.RtpServerReq; +import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; +import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; +import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; +import com.dite.znpt.monitor.service.StreamMediaFormatService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.dite.znpt.monitor.config.MediaFormatConfig.streamMediaFormatList; + +/** + * @Author: huise23 + * @Date: 2022/8/30 10:40 + * @Description: + */ +@Service +@Slf4j +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@EnableScheduling +public class ZlmServiceImpl implements ZlmService, ApplicationRunner { + private final StreamMediaFormatService formatService; + private final ZlmApi zlmApi; + private final MediaServerCache serverCache; + private final MediaServerChannelCache channelCache; + private final Environment environment; + private final StreamMediaServerConfig zlmConfig; + + @Value("${spring.profiles.active:dev}") + private String activeProfile; + @Value("${server.host:''}") + private String serverHost; + @Value("${server.port:''}") + private String serverPort; + + private String profile = "dev"; + + /** + * 系统启动加载服务器 + */ + @Override + public void run(ApplicationArguments args) throws Exception { + //TODO 媒体格式注入 + List formatList = streamMediaFormatList(); + ServerItem item = new ServerItem(zlmConfig, formatList); + try { + // 开发环境不去修改多媒体配置 +// if (!StrUtil.equalsIgnoreCase(activeProfile, profile)) { +// String host = StrUtil.blankToDefault(serverHost, IpUtils.getHostIp()); +// String port = StrUtil.blankToDefault(serverPort, environment.getProperty("server.port")); +// ServerConfig config = new ServerConfig(); +// config.refreshHook(host, port, zlmConfig); +// zlmApi.setServerConfig(item.getServer(), config); +// } + List configList = zlmApi.getServerConfig(item.getServer()); + item.setConfig(configList.get(0)); + item.setStatus(true); + } catch (Exception e) { + log.error("流服务器节点配置错误:", e); + item.setStatus(false); + } + //初始化参数 + serverCache.putLoad(item); + } + + @Scheduled(cron = "*/10 * * * * ?") + public void heartbeat1() { + log.debug("开始心跳检查..."); + ServerItem item = serverCache.getLoad(); + // 获取服务器流信息 + try { + List media = zlmApi.getMediaList(item.getServer(), new StreamReq()); + item.setMedia(media); + item.setStatus(true); + } catch (Exception e) { + log.error("流服务器节点丢失:", e); + item.setStatus(false); + } + serverCache.putLoad(item); + } + + @Override + public MediaItem play(String deviceCode, String channelCode) { + // 获取通道信息 + MediaItem media; + if (channelCache.has(deviceCode, channelCode)) { + media = channelCache.get(deviceCode, channelCode); + } else { + media = new MediaItem().setDeviceCode(deviceCode).setChannelCode(channelCode); + } + media.setIsCache(true); + // 检查节点是否正常 + if (!checkServer(media.getConfigId())) { + // 获取负载最小的节点 + ServerItem server = serverCache.getLoad(); + if (!server.getStatus()) { + throw new ServiceException("无正常的流媒体节点可用!"); + } + media.setSsrc(server.genPlaySsrc(channelCode)); + media.setConfigId(server.getConfigId()); + media.setConfig(server.getConfig()); + media.setServer(server.getServer()); + media.setFormatList(server.getFormatList()); + media.setIsCache(false); + serverCache.putLoad(server); + } + // 检查播放流是否正常 + if (StrUtil.isNotBlank(media.getStreamId())) { + RtpInfoResp rtp = zlmApi.getRtpInfo(media.getServer(), media.getStreamId()); + if (rtp.getExist()) { + media.setRtp(rtp); + media.setIsCache(true); + return media; + } + } + // 不正常,需要重新拉流 + Integer rtpPort = zlmApi.openRtpServer(media.getServer(), new RtpServerReq(media.getSsrc())); + media.setRtpPort(rtpPort); + media.setStreamId(media.getSsrc()); + // 缓存链接信息 + channelCache.put(deviceCode, channelCode, media); + media.setIsCache(false); + return media; + } + + @Override + public void release(String deviceCode, String channelCode) { + // 获取通道信息 + MediaItem media = channelCache.get(deviceCode, channelCode); + release(media); + } + + @Override + public void release(MediaItem media) { + if (ObjectUtil.isNull(media)) { + return; + } + try { + List list = zlmApi.getMediaList(media.getServer(), new StreamReq().setStream(media.getStreamId())); + if (!CollUtil.isEmpty(list) && list.get(0).getTotalReaderCount() > 0) { + // 当前还有观看者 不释放资源 + return; + } + zlmApi.closeRtpServer(media.getServer(), media.getStreamId()); + } catch (Exception e) { + log.error("流媒体服务器调用失败:", e); + } + // 释放SSRC句柄 + serverCache.releaseSsrc(media.getSsrc()); + // 删除链接信息 + channelCache.delete(media); + } + + @Override + public void display(String mediaServerId, String streamId) { + // 获取通道信息 + MediaItem media = channelCache.getByStream(mediaServerId, streamId); + release(media); + } + + /** + * 检查节点是否正常 + */ + private boolean checkServer(String configId) { + if (ObjectUtil.isNull(configId)) { + return false; + } + ServerItem item = serverCache.getLoad(); + return ObjectUtil.isNotNull(item) && item.getStatus(); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java new file mode 100644 index 0000000..6632114 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java @@ -0,0 +1,120 @@ +package com.dite.znpt.monitor.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; +import com.dite.znpt.monitor.domain.req.VideoInfoReq; +import com.dite.znpt.monitor.domain.resp.VideoInfoResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; +import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; + +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:10 + * @Description: + */ +public interface DeviceVideoChannelService extends IService { + /** + * 查询视频通道列表 + * + * @param videoId 视频id + * @param keyword 查询条件 + * @return {@link PageResult < DeviceVideoChannelListResp >} + */ + PageResult selectDeviceVideoChannel(Long videoId, String keyword); + + /** + * 查询所有视频通道列表 + * + * @param keyword 查询条件 + * @return {@link PageResult< DeviceVideoChannelListResp>} + */ + PageResult selectAllDeviceVideoChannel(String keyword); + + /** + * 查询视频通道详情 + * + * @param channelCode + * @return {@link DeviceVideoChannelResp} + */ + DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode); + + /** + * 编辑视频设备通道 + * + * @param channelId + * @param req + * @return + */ + void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req); + + /** + * 根据通道id删除通道信息 + * + * @param channelIds + * @return {@link boolean} + */ + Result removeByChannelIds(List channelIds); + + /** + * 根据通道编码查询通道信息 + * + * @param channelCode 通道编码 + * @return 通道信息 + */ + DeviceVideoChannelEntity getByCode(String channelCode); + + /** + * 根据设备id查询设备通道 + * @param videoId 设备id + * @return {@link List< DeviceVideoChannelEntity>} + */ + List selectDeviceVideoChannelByVideoCode(Long videoId); + + /** + * 播放直播视频 + * + * @param channelCode + * @return + */ + VideoPayResp play(String channelCode); + + /** + * 是否在线 + * + * @param channelCode + * @return + */ + boolean isOnline(String channelCode); + + /** + * 停止播放直播 + * + * @param channelCode + * @return + */ + void stop(String channelCode); + + /** + * 下线视频设备下的所有通道 + * @param videoId + * @return + */ + void offlineByVideoId(Long videoId); + + /** + * 查询通道及视频信息 + * + * @param videoInfoReq 查询参数 + * @return {@link VideoInfoResp } + * @author huise23 + * @since 2024-12-03 13:54:52 + */ + List selectVideoInfoList(VideoInfoReq videoInfoReq); + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java new file mode 100644 index 0000000..79ac330 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java @@ -0,0 +1,104 @@ +package com.dite.znpt.monitor.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:09 + * @Description: + */ +public interface DeviceVideoService extends IService { + + /** + * 查询视频设备列表 + * + * @param status 状态 + * @param keyword 设备编码或者设备名称 + * @return {@link PageResult< DeviceVideoListResp>} + */ + PageResult selectDeviceVideoList(String status, String keyword, String hostAddress); + + /** + * 查询视频设备数量 + * + * @return {@link DeviceVideoNumResp} + */ + DeviceVideoNumResp countDeviceVideoNum(); + + /** + * 编辑视频设备信息 + * + * @param videoId 视频设备id + * @param req 视频设备信息 + * @return + */ + void editDeviceVideo(Long videoId, DeviceVideoEditReq req); + + /** + * 删除视频设备 + * + * @param videoId 视频设备id + * @return + */ + Result removeByVideoId(Long videoId); + + /** + * 根据端口和host查询设备 + * + * @param host 地址 + * @param port 端口 + * @return 设备 + */ + DeviceVideoEntity getDeviceByHostAndPort(String host, int port); + + /** + * 设备离线 + * + * @param videoCode videoCode + */ + void offline(String videoCode); + + /** + * 上线设备 + * @param entity + * @return + */ + void online(DeviceVideoEntity entity); + + /** + * 判断是否注册已经失效 + * @param entity 设备信息 + * @return {@link boolean} + */ + boolean expire(DeviceVideoEntity entity); + + /** + * 根据 videoCode 获取设备 + * + * @param videoCode videoCode + * @return 设备 + */ + DeviceVideoEntity getByCode(String videoCode); + + /** + * 根据 videoCode 获取设备 + * + * @param channelCode + * @return 设备 + */ + DeviceVideoEntity getByChannelCode(String channelCode); + + /** + * 查询设备状态 + * @param videoId + * @return + */ + void queryDeviceStatus(Long videoId); + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java b/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java new file mode 100644 index 0000000..11a53d1 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java @@ -0,0 +1,27 @@ +package com.dite.znpt.monitor.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.monitor.domain.entity.IpConfigEntity; +import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; + +import java.util.List; + +/** + * @Date: 2023/09/05 16:39 + * @Description: 监控设备IP配置表服务接口 + */ +public interface IpConfigService extends IService { + + /** + * 新增ip配置 + * @param req + */ + void configAdd(MonitorConfigAddReq req); + + /** + * 查询ip配置 + * @return + */ + List configList(); +} + diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java b/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java new file mode 100644 index 0000000..fa959bc --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java @@ -0,0 +1,12 @@ +package com.dite.znpt.monitor.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:58 + * @Description: + */ +public interface StreamMediaFormatService extends IService { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java new file mode 100644 index 0000000..931a754 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java @@ -0,0 +1,262 @@ +package com.dite.znpt.monitor.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.monitor.constant.IotRespMessage; +import com.dite.znpt.monitor.constant.dict.CameraType; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.constant.dict.YesOrNo; +import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.req.VideoInfoReq; +import com.dite.znpt.monitor.domain.resp.VideoInfoResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; +import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; +import com.dite.znpt.monitor.mapper.DeviceVideoChannelMapper; +import com.dite.znpt.monitor.media.zlm.ZlmApi; +import com.dite.znpt.monitor.media.zlm.ZlmService; +import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; +import com.dite.znpt.monitor.media.zlm.dto.MediaItem; +import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; +import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; +import com.dite.znpt.monitor.service.DeviceVideoChannelService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.config.SipConfig; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.utils.DictUtils; +import com.dite.znpt.util.PageUtil; +import com.github.pagehelper.PageInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:10 + * @Description: + */ +@Service +public class DeviceVideoChannelServiceImpl extends ServiceImpl implements DeviceVideoChannelService { + + @Resource + private MediaServerChannelCache channelCache; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private ISipDeviceCommander sipDeviceCommander; + + @Resource + private ZlmService zlmService; + + @Resource + private ZlmApi zlmApi; + + @Resource + private SipConfig sipConfig; + + /** + * 查询视频通道列表 + * + * @param videoId 视频id + * @param keyword 查询条件 + * @return {@link PageResult < DeviceVideoChannelListResp >} + */ + @Override + public PageResult selectDeviceVideoChannel(Long videoId, String keyword) { + PageUtil.startPage(); + List list = this.baseMapper.selectDeviceVideoChannel(videoId, keyword); + return buildPageResult(list); + } + + /** + * 查询所有视频通道列表 + * + * @param keyword 查询条件 + * @return {@link PageResult< DeviceVideoChannelListResp>} + */ + @Override + public PageResult selectAllDeviceVideoChannel(String keyword) { + PageUtil.startPage(); + List list = this.baseMapper.selectAllDeviceVideoChannel(keyword); + return buildPageResult(list); + } + + private PageResult buildPageResult(List list) { + if (CollectionUtil.isEmpty(list)) { + return PageResult.ok(list, 0); + } + long total = new PageInfo<>(list).getTotal(); + list.stream().peek(resp -> { + resp.setCameraTypeLabel(DictUtils.getDictLabel(CameraType.class, resp.getCameraType())); + resp.setPtzControlLabel(DictUtils.getDictLabel(YesOrNo.class, resp.getPtzControl())); + resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); + }).collect(Collectors.toList()); + return PageResult.ok(list, total); + } + + /** + * 查询视频通道详情 + * + * @param channelCode + * @return {@link DeviceVideoChannelResp} + */ + @Override + public DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode) { + return this.baseMapper.getDeviceVideoChannelDetail(channelCode); + } + + /** + * 编辑视频设备通道 + * + * @param channelId + * @param req + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req) { + DeviceVideoChannelEntity entity = this.getById(channelId); + BeanUtil.copyProperties(req, entity); + entity.setUpdateTime(LocalDateTime.now()); + this.updateById(entity); + } + + /** + * 根据通道id删除通道信息 + * + * @param channelIds + * @return {@link boolean} + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Result removeByChannelIds(List channelIds) { + List list = this.listByIds(channelIds); + List ids = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); + if (ids.size() == list.size()) { + return Result.ok(this.removeByIds(ids)); + } else { + return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); + } + } + + @Override + public DeviceVideoChannelEntity getByCode(String channelCode) { + return super.getOne(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class) + .eq(DeviceVideoChannelEntity::getChannelCode, channelCode) + .orderByDesc(DeviceVideoChannelEntity::getCreateTime) + .last("limit 1")); + } + + /** + * 根据设备国标编码查询设备通道 + * + * @param videoId 设备id + * @return {@link List< DeviceVideoChannelEntity>} + */ + @Override + public List selectDeviceVideoChannelByVideoCode(Long videoId) { + return this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); + } + + /** + * 播放视频 + * + * @param channelCode + * @return + */ + @Override + public VideoPayResp play(String channelCode) { + DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + MediaItem mediaItem = zlmService.play(videoEntity.getVideoCode(), channelEntity.getChannelCode()); + if (!mediaItem.getIsCache()) { + sipDeviceCommander.playStreamCmd(videoEntity, channelEntity.getChannelCode(), mediaItem.getSsrc(), mediaItem.getRtpPort(), mediaItem.getServer().getApiHost()); + } + return VideoPayResp.builder() + .mediaType(sipConfig.getMediaType()) + .streamMediaFormatList(mediaItem.getFormatList(sipConfig.getMediaRouter())) + .build(); + } + + /** + * 是否在线 + * + * @param channelCode + * @return + */ + @Override + public boolean isOnline(String channelCode) { + DeviceVideoChannelEntity channelEntity = this.getByCode(channelCode); + return Objects.nonNull(channelEntity) && channelEntity.getStatus().equals(DeviceStatus.ONLINE.getValue()); + } + + /** + * 停止播放直播 + * + * @param channelCode + * @return + */ + @Override + public void stop(String channelCode) { + DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + MediaItem mediaItem = channelCache.get(videoEntity.getVideoCode(), channelEntity.getChannelCode()); + if (null != mediaItem) { + List list = zlmApi.getMediaList(mediaItem.getServer(), new StreamReq().setStream(mediaItem.getStreamId())); + if (CollectionUtil.isNotEmpty(list) && list.get(0).getTotalReaderCount() <= 1) { + // 当只有一个人观看时,想设备发送停止推流命令 + sipDeviceCommander.stopStreamCmd(mediaItem.getSsrc()); + } + zlmService.release(videoEntity.getVideoCode(), channelEntity.getChannelCode()); + } + } + + /** + * 下线视频设备下的所有通道 + * + * @param videoId + * @return + */ + @Override + public void offlineByVideoId(Long videoId) { + List list = this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); + if (ObjectUtil.isNotNull(list)) { + this.updateBatchById( + list.stream().peek(entity -> { + entity.setUpdateTime(LocalDateTime.now()); + entity.setStatus(DeviceStatus.OFFLINE.getValue()); + }).collect(Collectors.toList()) + ); + } + } + + /** + * 查询通道及视频信息 + * + * @param videoInfoReq 查询参数 + * @return {@link VideoInfoResp } + * @author huise23 + * @since 2024-12-03 13:54:52 + */ + @Override + public List selectVideoInfoList(VideoInfoReq videoInfoReq) { + return this.baseMapper.selectVideoInfoList(videoInfoReq); + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java new file mode 100644 index 0000000..58444ec --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java @@ -0,0 +1,225 @@ +package com.dite.znpt.monitor.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.monitor.constant.IotCacheConstants; +import com.dite.znpt.monitor.constant.IotDictConstants; +import com.dite.znpt.monitor.constant.IotRespMessage; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.constant.dict.SipTransferMode; +import com.dite.znpt.monitor.constant.dict.StreamTransferMode; +import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; +import com.dite.znpt.monitor.mapper.DeviceVideoMapper; +import com.dite.znpt.monitor.service.DeviceVideoChannelService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.utils.DictUtils; +import com.dite.znpt.service.RedisService; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Author: huise23 + * @Date: 2022/8/11 18:11 + * @Description: + */ +@Slf4j +@Service +public class DeviceVideoServiceImpl extends ServiceImpl implements DeviceVideoService { + + @Resource + private RedisService redisService; + + @Resource + private DeviceVideoChannelService deviceVideoChannelService; + + @Resource + private ISipDeviceCommander sipDeviceCommander; + + /** + * 查询视频设备列表 + * + * @param status 状态 + * @param keyword 设备编码或者设备名称 + * @return {@link List < DeviceVideoListResp >} + */ + @Override + public PageResult selectDeviceVideoList(String status, String keyword, String hostAddress) { + List deviceVideoListResps = this.baseMapper.selectDeviceVideoList(status, keyword,hostAddress); + int total = (int) new PageInfo(deviceVideoListResps).getTotal(); + deviceVideoListResps = deviceVideoListResps.stream().peek(resp -> { + resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); + resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); + resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); + }).collect(Collectors.toList()); + return PageResult.ok(deviceVideoListResps,total); + } + + /** + * 查询视频设备数量 + * + * @param + * @return {@link DeviceVideoNumResp} + */ + @Override + public DeviceVideoNumResp countDeviceVideoNum() { + DeviceVideoNumResp deviceVideoNumResp = new DeviceVideoNumResp(); + List deviceVideoList = this.baseMapper.selectDeviceVideoList(null, null,null); + deviceVideoNumResp.setAllDevice(deviceVideoList.stream().count()); + deviceVideoNumResp.setOnlineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_ONLINE.equals(item.getStatus())).count()); + deviceVideoNumResp.setOfflineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_OFFLINE.equals(item.getStatus())).count()); + return deviceVideoNumResp; + } + + /** + * 编辑视频设备信息 + * + * @param videoId 视频设备id + * @param req 视频设备信息 + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void editDeviceVideo(Long videoId, DeviceVideoEditReq req) { + DeviceVideoEntity entity = this.getById(videoId); + if (null == entity) { + throw new ServiceException(IotRespMessage.ID_NOT_FOUND); + } + BeanUtil.copyProperties(req, entity); + this.updateById(entity); + } + + /** + * 删除视频设备 + * + * @param videoId 视频设备id + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Result removeByVideoId(Long videoId) { + DeviceVideoEntity entity = this.getById(videoId); + if (null == entity) { + throw new ServiceException(IotRespMessage.ID_NOT_FOUND); + } + if (!DeviceStatus.OFFLINE.getValue().equals(entity.getStatus())) { + return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); + } + Result result = Result.ok(); + List list = deviceVideoChannelService.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId,videoId)); + List channelIds = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(channelIds)){ + result = deviceVideoChannelService.removeByChannelIds(channelIds); + } + if (HttpStatus.HTTP_OK == result.getCode()) { + return this.removeById(videoId) ? Result.ok() : Result.error(); + } else { + return result; + } + } + + @Override + public DeviceVideoEntity getDeviceByHostAndPort(String host, int port) { + return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) + .eq(DeviceVideoEntity::getIp, host) + .eq(DeviceVideoEntity::getPort, port) +// .orderByDesc(DeviceVideoEntity::getCreateTime) + .last("limit 1")); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void offline(String videoCode) { + DeviceVideoEntity entity = this.getByCode(videoCode); + entity.setStatus(DeviceStatus.OFFLINE.getValue()); +// entity.setUpdateTime(LocalDateTime.now()); + this.updateById(entity); + deviceVideoChannelService.offlineByVideoId(entity.getVideoId()); + + } + + /** + * 上线设备 + * + * @param entity + * @return + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void online(DeviceVideoEntity entity) { + log.info("[设备上线] deviceId:{}->{}:{}",entity.getVideoCode(), entity.getIp(), entity.getPort()); + String deviceCacheKey = IotCacheConstants.getIotDeviceVideoKey(entity.getVideoCode()); + entity.setStatus(DeviceStatus.ONLINE.getValue()); + if(entity.getVideoId() == null){ + // 设备首次上线 + if(redisService.hasKey(deviceCacheKey)){ + // 脏数据 + redisService.deleteObject(deviceCacheKey); + } + this.save(entity); + } else { + entity.setUpdateTime(LocalDateTime.now()); + this.updateById(entity); + } + sipDeviceCommander.queryDeviceInfo(entity); + sipDeviceCommander.queryCatalog(entity); + } + + @Override + public boolean expire(DeviceVideoEntity entity) { + LocalDateTime expireDateTime = entity.getRegisterTime().plus(entity.getExpires(), ChronoUnit.MILLIS); + return expireDateTime.isBefore(LocalDateTime.now()); + } + + @Override + public DeviceVideoEntity getByCode(String videoCode) { + return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) + .eq(DeviceVideoEntity::getVideoCode, videoCode) + .orderByDesc(DeviceVideoEntity::getCreateTime) + .last("limit 1")); + } + + /** + * 根据 videoCode 获取设备 + * + * @param channelCode + * @return 设备 + */ + @Override + public DeviceVideoEntity getByChannelCode(String channelCode) { + DeviceVideoChannelEntity channelEntity = Optional.ofNullable(deviceVideoChannelService.getByCode(channelCode)).orElseThrow(()-> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + return this.getById(channelEntity.getVideoId()); + } + + /** + * 查询设备状态 + * + * @param videoId + * @return + */ + @Override + public void queryDeviceStatus(Long videoId) { + DeviceVideoEntity entity = Optional.ofNullable(this.getById(videoId)).orElseThrow( () -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); + sipDeviceCommander.queryDeviceStatus(entity); + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java new file mode 100644 index 0000000..0d33fa6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java @@ -0,0 +1,80 @@ +package com.dite.znpt.monitor.service.impl; + +import cn.hutool.core.util.NumberUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.monitor.domain.entity.IpConfigEntity; +import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; +import com.dite.znpt.monitor.mapper.IpConfigMapper; +import com.dite.znpt.monitor.service.IpConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Date: 2023/09/05 16:39 + * @Description: 监控设备IP配置表服务实现类 + */ +@Service +public class IpConfigServiceImpl extends ServiceImpl implements IpConfigService { + + + @Override + @Transactional(rollbackFor = Exception.class) + public void configAdd(MonitorConfigAddReq req) { + //先删除再新增--全量新增 + final List configAdds = req.getIpAddresses().stream().map(this::BuildConfigEntity).collect(Collectors.toList()); + //校验是否有重复的--用前三位来判断重复 + checkDup(configAdds); + deleteConfig(); + this.saveBatch(configAdds); + } + + + + @Override + public List configList() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + final List ifConfigs = this.list(wrapper); + return ifConfigs.stream().map(t->t.getIp()).collect(Collectors.toList()); + } + + private void deleteConfig(){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.remove(wrapper); + } + + private void checkDup(List configAdds) { + final List ipTopThreeList = configAdds.stream().map(t -> t.getIpTopThree()).collect(Collectors.toList()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(IpConfigEntity::getIpTopThree,ipTopThreeList) + .last("limit 1"); + final IpConfigEntity one = this.getOne(wrapper); + if(one != null){ + throw new ServiceException("与现有视频地址重复,请重新选择!"); + } + } + + private IpConfigEntity BuildConfigEntity( String ip) { + IpConfigEntity entity = new IpConfigEntity(); + final String[] ipArray = ip.split("\\."); + ipValidate(ipArray); + entity.setIp(ip); + entity.setIpTopThree(ipArray[0]+"."+ipArray[1]+"."+ipArray[2]); + return entity; + } + + private void ipValidate(String[] ipArray) { + if(ipArray.length!=4){ + throw new ServiceException("ip地址长度不对"); + } + for (int i = 0; i < 4; i++) { + if(! (NumberUtil.isInteger(ipArray[i]) || (i==3 && "*".equals(ipArray[i])))){ + throw new ServiceException("ip地址为非数字"); + } + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java new file mode 100644 index 0000000..06aaa50 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java @@ -0,0 +1,17 @@ +package com.dite.znpt.monitor.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; +import com.dite.znpt.monitor.mapper.StreamMediaFormatMapper; +import com.dite.znpt.monitor.service.StreamMediaFormatService; +import org.springframework.stereotype.Service; + +/** + * @Author: huise23 + * @Date: 2022/8/11 14:59 + * @Description: + */ +@Service +public class StreamMediaFormatServiceImpl extends ServiceImpl implements StreamMediaFormatService { + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java new file mode 100644 index 0000000..f2786fe --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java @@ -0,0 +1,109 @@ +package com.dite.znpt.monitor.sip; + +import com.dite.znpt.monitor.sip.config.SipConfig; +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryI; +import gov.nist.javax.sip.SipProviderImpl; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.bridge.SLF4JBridgeHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.DependsOn; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.sip.*; +import java.util.Properties; +import java.util.TooManyListenersException; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:20 + * @Description: + */ +@Slf4j +@Component +public class SipLayer { + + @Resource + private SipConfig sipConfig; + + @Resource + private SipProcessorFactoryI sipProcessorFactory; + + private SipStack sipStack; + + private SipFactory sipFactory; + + @PostConstruct + public void initLogging() { + SLF4JBridgeHandler.removeHandlersForRootLogger(); + SLF4JBridgeHandler.install(); + } + + @Bean("sipFactory") + SipFactory createSipFactory() { + sipFactory = SipFactory.getInstance(); + sipFactory.setPathName("gov.nist"); + return sipFactory; + } + + @Bean("sipStack") + @DependsOn({"sipFactory"}) + SipStack createSipStack() throws PeerUnavailableException { + Properties properties = new Properties(); + properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); + properties.setProperty("gov.nist.javax.sip.PATH_NAME", "gov.nist"); + properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getIp()); + /** + * 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码 + * gov/nist/javax/sip/SipStackImpl.class + */ + if (log.isDebugEnabled()) { + properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); + } + // 接收所有notify请求,即使没有订阅 + properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); + // 为_NULL _对话框传递_终止的_事件 + properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true"); + // 会话清理策略 + properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal"); + // 处理由该服务器处理的基于底层TCP的保持生存超时 + properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60"); + + /** + * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE = + * 0; public static final int TRACE_MESSAGES = 16; public static final int + * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; + */ + if (log.isDebugEnabled()) { + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); + } + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); +// properties.setProperty("gov.nist.javax.sip.STACK_LOGGER", "gov.nist.core.CommonLoggerSlf4j"); // 通过 SLF4J 桥接 + sipStack = sipFactory.createSipStack(properties); + + return sipStack; + } + + @Bean(name = "tcpSipProvider") + @DependsOn("sipStack") + SipProviderImpl startTcpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { + ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "TCP"); + SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); + tcpSipProvider.setDialogErrorsAutomaticallyHandled(); + tcpSipProvider.addSipListener(sipProcessorFactory); + log.info("[Sip Server] TCP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); + return tcpSipProvider; + } + + @Bean(name = "udpSipProvider") + @DependsOn("sipStack") + SipProviderImpl startUdpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { + ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); + SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); + udpSipProvider.addSipListener(sipProcessorFactory); + log.info("[Sip Server] UDP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); + return udpSipProvider; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java b/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java new file mode 100644 index 0000000..86d475f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java @@ -0,0 +1,38 @@ +package com.dite.znpt.monitor.sip.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:59 + * @Description: + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "sip-config") +public class SipConfig { + + String name; + + String ip; + + Integer port; + + String charset; + + String domain; + + String id; + + String password; + + String mediaType = "mp4"; + + /** + * zlm播放地址路由 + */ + String mediaRouter = "/zlm"; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java b/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java new file mode 100644 index 0000000..48d758d --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java @@ -0,0 +1,26 @@ +package com.dite.znpt.monitor.sip.session; + +import org.springframework.stereotype.Component; + +import javax.sip.ClientTransaction; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author: huise23 + * @Date: 2022/8/29 16:52 + * @Description: 视频流session管理器,管理视频预览、预览回放的通信句柄 + */ +@Component +public class StreamSessionManager { + + private ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); + + public void put(String ssrc, ClientTransaction transaction){ + sessionMap.put(ssrc, transaction); + } + + public ClientTransaction get(String ssrc){ + return sessionMap.get(ssrc); + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java new file mode 100644 index 0000000..ad1c041 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java @@ -0,0 +1,11 @@ +package com.dite.znpt.monitor.sip.transmit; + +import javax.sip.SipListener; + +/** + * @Author: huise23 + * @Date: 2022/8/29 16:52 + * @Description: + */ +public interface SipProcessorFactoryI extends SipListener { +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java new file mode 100644 index 0000000..b450e7e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java @@ -0,0 +1,99 @@ +package com.dite.znpt.monitor.sip.transmit; + + +import cn.hutool.json.JSONUtil; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; +import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessor; +import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import javax.sip.*; +import javax.sip.header.CSeqHeader; +import javax.sip.message.Response; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:44 + * @Description: + */ +@Slf4j +@Component +public class SipProcessorFactoryImpl implements SipProcessorFactoryI { + + private static Map requestProcessorMap = new ConcurrentHashMap<>(); + + private static Map responseProcessorMap = new ConcurrentHashMap<>(); + + private static ITimeoutProcessor timeoutProcessor; + + public void addRequestProcessor(String method, ISipRequestProcessor processor) { + requestProcessorMap.put(method, processor); + } + + public void addResponseProcessor(String method, ISipResponseProcessor processor) { + responseProcessorMap.put(method, processor); + } + + public void addTimeoutProcessor(ITimeoutProcessor processor) { + timeoutProcessor = processor; + } + + @Override + @Async + public void processRequest(RequestEvent requestEvent) { + log.info("requestEvent:"+ JSONUtil.toJsonStr(requestEvent.getRequest())); + String method = requestEvent.getRequest().getMethod(); + ISipRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); + if (sipRequestProcessor == null) { + log.warn("不支持方法{}的request", method); + return; + } + sipRequestProcessor.process(requestEvent); + } + + @Override + @Async + public void processResponse(ResponseEvent responseEvent) { + Response response = responseEvent.getResponse(); + int status = response.getStatusCode(); + if ((status >= 200 && status < 300) || status == Response.UNAUTHORIZED) { + CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); + String method = cseqHeader.getMethod(); + ISipResponseProcessor sipResponseProcessor = responseProcessorMap.get(method); + if (sipResponseProcessor == null) { + log.warn("不支持方法{}的response", method); + return; + } + sipResponseProcessor.process(responseEvent); + } else if ((status >= 100) && (status < 200)) { + // 增加其它无需回复的响应,如101、180等 + } else { + //未完成 接收到失败的response响应!status:400,message:Bad Request + log.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()); + } + } + + @Override + public void processTimeout(TimeoutEvent timeoutEvent) { + // TODO Auto-generated method stub + } + + @Override + public void processIOException(IOExceptionEvent exceptionEvent) { + // TODO Auto-generated method stub + } + + @Override + public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) { + // TODO Auto-generated method stub + } + + @Override + public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) { + // TODO Auto-generated method stub + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java new file mode 100644 index 0000000..7ace5f6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java @@ -0,0 +1,50 @@ +package com.dite.znpt.monitor.sip.transmit.cmd; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; + +/** + * @Author: huise23 + * @Date: 2022/8/30 8:46 + * @Description: + */ +public interface ISipDeviceCommander { + + /** + * 查询目录列表 + * @param entity + * @return {@link boolean} + */ + boolean queryCatalog(DeviceVideoEntity entity); + + /** + * 查询设备信息 + * @param entity + * @return {@link boolean} + */ + boolean queryDeviceInfo(DeviceVideoEntity entity); + + /** + * 查询设备状态 + * @param entity + * @return {@link boolean} + */ + boolean queryDeviceStatus(DeviceVideoEntity entity); + + /** + * 请求预览视频流 + * + * @param entity + * @param channelCode + * @param ssrc + * @param ssrcPort + * @return {@link String} + */ + void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp); + + /** + * 停止视频流 + * @param ssrc + * @return + */ + void stopStreamCmd(String ssrc); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java new file mode 100644 index 0000000..383c7c8 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java @@ -0,0 +1,120 @@ +package com.dite.znpt.monitor.sip.transmit.cmd; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.sip.config.SipConfig; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.PeerUnavailableException; +import javax.sip.SipFactory; +import javax.sip.SipProvider; +import javax.sip.address.Address; +import javax.sip.address.SipURI; +import javax.sip.header.*; +import javax.sip.message.Request; +import java.security.SecureRandom; +import java.text.ParseException; +import java.util.ArrayList; + +/** + * 摄像头命令request构造器 + * + * @author yun11 + * @date 2023/05/11 + */ +@Component +public class SipRequestHeaderProvider { + + @Resource + private SipConfig sipConfig; + + @Resource + private SipFactory sipFactory; + + @Resource + @Qualifier(value="tcpSipProvider") + private SipProvider tcpSipProvider; + + @Resource + @Qualifier(value="udpSipProvider") + private SipProvider udpSipProvider; + + /** + * 创建Message信令请求报文 + * @param device + * @param content + * @param viaTag + * @param fromTag + * @param toTag + * @return {@link Request} + */ + public Request createMessageRequest(DeviceVideoEntity device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException, PeerUnavailableException { + Request request = null; + // sipuri + SipURI requestUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); + // via + ArrayList viaHeaders = new ArrayList(); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); + viaHeader.setRPort(); + viaHeaders.add(viaHeader); + // from + SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); + Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI); + FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); + // to + SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); + Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); + // callid + CallIdHeader callIdHeader = "TCP".equals(device.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); + // Forwards + MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); + // ceq + CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.MESSAGE); + + request = sipFactory.createMessageFactory().createRequest(requestUri, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, + toHeader, viaHeaders, maxForwards); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + request.setContent(content, contentTypeHeader); + return request; + } + + public Request createInviteRequest(DeviceVideoEntity entity, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { + Request request = null; + //请求行 + SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); + //via + ArrayList viaHeaders = new ArrayList(); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), entity.getTransport(), viaTag); + viaHeader.setRPort(); + viaHeaders.add(viaHeader); + //from + SipURI fromSipUri = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); + Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipUri); + //必须要有标记,否则无法创建会话,无法回应ack + FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); + //to + SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); + Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); + + //Forwards + MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); + + //ceq + CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.INVITE); + request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); + + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); + request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + // Subject + SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); + request.addHeader(subjectHeader); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); + request.setContent(content, contentTypeHeader); + return request; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java new file mode 100644 index 0000000..bc686a9 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java @@ -0,0 +1,226 @@ +package com.dite.znpt.monitor.sip.transmit.cmd.impl; + +import cn.hutool.core.util.SerializeUtil; +import com.dite.znpt.monitor.constant.IotCacheConstants; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.media.zlm.ZlmService; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.sip.transmit.cmd.SipRequestHeaderProvider; +import com.dite.znpt.service.RedisService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.ClientTransaction; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import javax.sip.SipProvider; +import javax.sip.address.SipURI; +import javax.sip.header.CallIdHeader; +import javax.sip.header.ViaHeader; +import javax.sip.message.Request; +import java.text.ParseException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author: huise23 + * @Date: 2022/8/30 8:50 + * @Description: + */ +@Slf4j +@Component +public class SipDeviceCommanderImpl implements ISipDeviceCommander { + + private final static Pattern VIA_HEADER_PATTERN = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)"); + @Resource + @Qualifier(value="tcpSipProvider") + private SipProvider tcpSipProvider; + + @Resource + @Qualifier(value="udpSipProvider") + private SipProvider udpSipProvider; + + @Resource + private SipRequestHeaderProvider sipRequestHeaderProvider; + + @Resource + private ZlmService zlmService; + + @Resource + private RedisService redisService; + + /** + * 查询目录列表 + * @param entity + * @return {@link boolean} + */ + @Override + public boolean queryCatalog(DeviceVideoEntity entity) { + try { + StringBuffer content = new StringBuffer(200); + String charset = entity.getCharset(); + content.append("\r\n"); + content.append("\r\n"); + content.append(" Catalog\r\n"); + content.append(" " + (int)((Math.random()*9+1)*100000) + "\r\n"); + content.append(" " + entity.getVideoCode() + "\r\n"); + content.append("\r\n"); + + String tag = String.valueOf(System.nanoTime()); + Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); + transmitRequest(entity.getTransport(), request); + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 查询设备信息 + * @param entity + * @return {@link boolean} + */ + @Override + public boolean queryDeviceInfo(DeviceVideoEntity entity) { + try { + StringBuffer content = new StringBuffer(200); + String charset = entity.getCharset(); + content.append("\r\n"); + content.append("\r\n"); + content.append("DeviceInfo\r\n"); + content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); + content.append("" + entity.getVideoCode() + "\r\n"); + content.append("\r\n"); + String tag = String.valueOf(System.nanoTime()); + Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); + transmitRequest(entity.getTransport(), request); + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 查询设备状态 + * @param entity + * @return {@link boolean} + */ + @Override + public boolean queryDeviceStatus(DeviceVideoEntity entity) { + try { + StringBuffer content = new StringBuffer(200); + content.append("\r\n"); + content.append("\r\n"); + content.append("DeviceStatus\r\n"); + content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); + content.append("" + entity.getVideoCode() + "\r\n"); + content.append("\r\n"); + String tag = String.valueOf(System.nanoTime()); + Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, tag); + transmitRequest(entity.getTransport(), request); + return true; + + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + return false; + } + } + + /** + * 请求预览视频流 + * + * @param entity + * @param channelCode 流传输协议 + * @param ssrc + * @param ssrcPort + * @return {@link String} + */ + @Override + public void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp){ + try { + String streamMode = entity.getStreamMode().toUpperCase(); + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o=" + channelCode + " 0 0 IN IP4 " + mediaIp + "\r\n"); + content.append("s=Play\r\n"); + content.append("c=IN IP4 " + mediaIp + "\r\n"); + content.append("t=0 0\r\n"); + if("TCP-PASSIVE".equals(streamMode)) { + content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); + }else if ("TCP-ACTIVE".equals(streamMode)) { + content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); + }else if("UDP".equals(streamMode)) { + content.append("m=video " + ssrcPort + " RTP/AVP 96 97 98 99\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + if ("TCP-PASSIVE".equals(streamMode)) { // tcp被动模式 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp主动模式 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + content.append("y=" + ssrc + "\r\n");//ssrc + String tm = Long.toString(System.currentTimeMillis()); + CallIdHeader callIdHeader = "TCP".equals(entity.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); + Request request = sipRequestHeaderProvider.createInviteRequest(entity, channelCode, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader); + ClientTransaction clientTransaction = transmitRequest(entity.getTransport(), request); + System.out.println("-----------------------------------------------------------"); + redisService.setCacheObject(IotCacheConstants.getClientTransactionCacheKey(ssrc), SerializeUtil.serialize(clientTransaction)); + } catch (ParseException | InvalidArgumentException | SipException e) { + System.out.println("[zlm]拉流失败"); + zlmService.release(entity.getVideoCode(), channelCode); + e.printStackTrace(); + } + } + + /** + * 停止视频流 + * + * @param ssrc + * @return + */ + @Override + public void stopStreamCmd(String ssrc) { + try { + ClientTransaction transaction = redisService.hasKey(ssrc) ? SerializeUtil.deserialize(redisService.getCacheObject(ssrc)) : null; + if ( null == transaction || null == transaction.getDialog()) { + return; + } + Request byeRequest = transaction.getDialog().createRequest(Request.BYE); + SipURI byeURI = (SipURI) byeRequest.getRequestURI(); + String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString(); + + Matcher matcher = VIA_HEADER_PATTERN.matcher(vh); + if (VIA_HEADER_PATTERN.matcher(vh).find()) { + byeURI.setHost(matcher.group(1)); + } + ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); + String protocol = viaHeader.getTransport().toUpperCase(); + ClientTransaction clientTransaction = null; + if("TCP".equals(protocol)) { + clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); + } else if("UDP".equals(protocol)) { + clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); + } + transaction.getDialog().sendRequest(clientTransaction); + redisService.deleteObject(ssrc); + } catch (SipException | ParseException e) { + e.printStackTrace(); + } + } + + private ClientTransaction transmitRequest(String transport, Request request) throws SipException { + ClientTransaction clientTransaction = "TCP".equals(transport) ? tcpSipProvider.getNewClientTransaction(request) : udpSipProvider.getNewClientTransaction(request); + clientTransaction.sendRequest(); + return clientTransaction; + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java new file mode 100644 index 0000000..14ad459 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java @@ -0,0 +1,12 @@ +package com.dite.znpt.monitor.sip.transmit.request; + +import javax.sip.RequestEvent; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:46 + * @Description: + */ +public interface ISipRequestProcessor { + void process(RequestEvent event); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java new file mode 100644 index 0000000..20d7e99 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java @@ -0,0 +1,259 @@ +package com.dite.znpt.monitor.sip.transmit.request; + +import gov.nist.javax.sip.SipProviderImpl; +import gov.nist.javax.sip.SipStackImpl; +import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.stack.SIPServerTransaction; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import javax.sip.*; +import javax.sip.address.Address; +import javax.sip.address.AddressFactory; +import javax.sip.address.SipURI; +import javax.sip.header.ContentTypeHeader; +import javax.sip.header.ExpiresHeader; +import javax.sip.header.HeaderFactory; +import javax.sip.header.ViaHeader; +import javax.sip.message.MessageFactory; +import javax.sip.message.Request; +import javax.sip.message.Response; +import java.io.ByteArrayInputStream; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:48 + * @Description: + */ + +@Slf4j +public abstract class ISipRequestProcessorAbstract { + + @Autowired + @Qualifier(value="tcpSipProvider") + private SipProviderImpl tcpSipProvider; + + @Autowired + @Qualifier(value="udpSipProvider") + private SipProviderImpl udpSipProvider; + + /** + * 根据 RequestEvent 获取 ServerTransaction + * @param evt + * @return + */ + public ServerTransaction getServerTransaction(RequestEvent evt) { + Request request = evt.getRequest(); + ServerTransaction serverTransaction = evt.getServerTransaction(); + // 判断TCP还是UDP + boolean isTcp = false; + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + String transport = reqViaHeader.getTransport(); + if ("TCP".equals(transport)) { + isTcp = true; + } + + if (serverTransaction == null) { + try { + if (isTcp) { + SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); + serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); + if (serverTransaction == null) { + serverTransaction = tcpSipProvider.getNewServerTransaction(request); + } + } else { + SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); + serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); + if (serverTransaction == null) { + serverTransaction = udpSipProvider.getNewServerTransaction(request); + } + } + } catch (TransactionAlreadyExistsException e) { + log.error(e.getMessage()); + } catch (TransactionUnavailableException e) { + log.error(e.getMessage()); + } + } + return serverTransaction; + } + + public AddressFactory getAddressFactory() { + try { + return SipFactory.getInstance().createAddressFactory(); + } catch (PeerUnavailableException e) { + e.printStackTrace(); + } + return null; + } + + public HeaderFactory getHeaderFactory() { + try { + return SipFactory.getInstance().createHeaderFactory(); + } catch (PeerUnavailableException e) { + e.printStackTrace(); + } + return null; + } + + public MessageFactory getMessageFactory() { + try { + return SipFactory.getInstance().createMessageFactory(); + } catch (PeerUnavailableException e) { + e.printStackTrace(); + } + return null; + } + + /*** + * 回复状态码 + * 100 trying + * 200 OK + * 400 + * 404 + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); + ServerTransaction serverTransaction = getServerTransaction(evt); + if (serverTransaction == null) { + log.warn("回复失败:{}", response); + return; + } + serverTransaction.sendResponse(response); + if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } + } + } + + public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); + response.setReasonPhrase(msg); + ServerTransaction serverTransaction = getServerTransaction(evt); + serverTransaction.sendResponse(response); + if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } + } + } + + /** + * 回复带sdp的200 + * @param evt + * @param sdp + * @param sipServerCode SIP服务国标编码 + * @param serverIp SIP服务ip + * @param sipServerPort SIP服务端口 + * @return + */ + public void responseSdpAck(RequestEvent evt, String sdp, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); + SipFactory sipFactory = SipFactory.getInstance(); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); + response.setContent(sdp, contentTypeHeader); + + // 兼容国标中的使用编码@域名作为RequestURI的情况 + SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); + if (sipURI.getPort() == -1) { + sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp+":" + sipServerPort); + } + log.debug("responseSdpAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); + + Address concatAddress = sipFactory.createAddressFactory().createAddress( + sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() + )); + response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + getServerTransaction(evt).sendResponse(response); + } + + /** + * 回复带xml的200 + * @param evt + * @param xml + * @param sipServerCode SIP服务国标编码 + * @param serverIp SIP服务ip + * @param sipServerPort SIP服务端口 + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + public Response responseXmlAck(RequestEvent evt, String xml, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); + SipFactory sipFactory = SipFactory.getInstance(); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + response.setContent(xml, contentTypeHeader); + + // 兼容国标中的使用编码@域名作为RequestURI的情况 + SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); + if (sipURI.getPort() == -1) { + sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp + ":" + sipServerPort); + } + log.debug("responseXmlAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); + + Address concatAddress = sipFactory.createAddressFactory().createAddress( + sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() + )); + response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + response.addHeader(evt.getRequest().getHeader(ExpiresHeader.NAME)); + getServerTransaction(evt).sendResponse(response); + return response; + } + + public Element getRootElement(RequestEvent evt) throws DocumentException { + return getRootElement(evt, "gb2312"); + } + + public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { + if (charset == null) { + charset = "gb2312"; + } + Request request = evt.getRequest(); + SAXReader reader = new SAXReader(); + reader.setEncoding(charset); + // 对海康出现的未转义字符做处理。 + String[] destStrArray = new String[]{"<",">","&","'","""}; + char despChar = '&'; // 或许可扩展兼容其他字符 + byte destBye = (byte) despChar; + List result = new ArrayList<>(); + byte[] rawContent = request.getRawContent(); + if (rawContent == null) { + return null; + } + for (int i = 0; i < rawContent.length; i++) { + if (rawContent[i] == destBye) { + boolean resul = false; + for (String destStr : destStrArray) { + if (i + destStr.length() <= rawContent.length) { + byte[] bytes = Arrays.copyOfRange(rawContent, i, i + destStr.length()); + resul = resul || (Arrays.equals(bytes,destStr.getBytes())); + } + } + if (resul) { + result.add(rawContent[i]); + } + }else { + result.add(rawContent[i]); + } + } + Byte[] bytes = new Byte[0]; + byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes)); + + Document xml = reader.read(new ByteArrayInputStream(bytesResult)); + return xml.getRootElement(); + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java new file mode 100644 index 0000000..4fdfe4c --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java @@ -0,0 +1,53 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl; + +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import gov.nist.javax.sip.header.CSeq; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.DocumentException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.Dialog; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Request; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:54 + * @Description: + */ +@Slf4j +@Component +public class AckRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { + + private final String METHOD = "ACK"; + + @Resource + private SipProcessorFactoryImpl sipProcessorFactory; + + @Override + public void afterPropertiesSet() { + sipProcessorFactory.addRequestProcessor(METHOD, this); + } + + + @Override + public void process(RequestEvent evt) { + Request request = evt.getRequest(); + Dialog dialog = evt.getDialog(); + try { + log.info("接收到bye请求:{}", getRootElement(evt)); + CSeq csReq = (CSeq) request.getHeader(CSeq.NAME); + Request ackRequest = dialog.createAck(csReq.getSeqNumber()); + dialog.sendAck(ackRequest); + log.info("send ack : " + ackRequest.toString()); + } catch (SipException | InvalidArgumentException | DocumentException e) { + e.printStackTrace(); + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java new file mode 100644 index 0000000..a872d5f --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java @@ -0,0 +1,63 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.media.zlm.ZlmService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.*; +import javax.sip.address.SipURI; +import javax.sip.header.FromHeader; +import javax.sip.header.HeaderAddress; +import javax.sip.message.Response; +import java.text.ParseException; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:55 + * @Description: + */ +@Slf4j +@Component +public class ByeRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { + + private final String METHOD = "BYE"; + + @Resource + private SipProcessorFactoryImpl sipProcessorFactory; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private ZlmService zlmService; + + @Override + public void afterPropertiesSet() { + sipProcessorFactory.addRequestProcessor(METHOD, this); + } + @Override + public void process(RequestEvent evt) { + try { + responseAck(evt, Response.OK); + Dialog dialog = evt.getDialog(); + if (dialog == null) { + return; + } + if (dialog.getState().equals(DialogState.TERMINATED)) { + String channelCode = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); + DeviceVideoEntity videoEntity = deviceVideoService.getByChannelCode(channelCode); + zlmService.release(videoEntity.getVideoCode(), channelCode); + } + } catch (SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java new file mode 100644 index 0000000..674bbf6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java @@ -0,0 +1,75 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; +import com.dite.znpt.monitor.sip.utils.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.RequestEvent; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author: huise23 + * @Date: 2022/8/29 18:43 + * @Description: + */ +@Slf4j +@Component +public class MessageRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { + + private final String METHOD = "MESSAGE"; + + public Map messageHandlerMap = new ConcurrentHashMap<>(); + + public void addHandler(String cmdType, IMessageHandler messageHandler) { + messageHandlerMap.put(cmdType, messageHandler); + } + + @Resource + private SipProcessorFactoryImpl sipProcessorFactory; + + @Resource + private DeviceVideoService deviceVideoService; + + @Override + public void afterPropertiesSet() { + sipProcessorFactory.addRequestProcessor(METHOD, this); + } + + @Override + public void process(RequestEvent event) { + try { + Element rootElement = getRootElement(event); + String cmd = XmlUtil.getText(rootElement,"CmdType"); + log.info("接收到message请求:{}", cmd); + IMessageHandler messageHandler = messageHandlerMap.get(cmd); + if(null == messageHandler){ + log.info("不支持的消息类型:{}", cmd); + return; + } + String videoCode = rootElement.element("DeviceID").getText(); + DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); + if(null == entity){ + log.info("设备未注册,国标编码:{}", videoCode); + return; + } + messageHandler.process(entity, event); + + } catch (DocumentException e) { + e.printStackTrace(); + } + } + + + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java new file mode 100644 index 0000000..da11e57 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java @@ -0,0 +1,158 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.service.IpConfigService; +import com.dite.znpt.monitor.sip.config.SipConfig; +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.utils.DigestServerAuthenticationHelper; +import gov.nist.javax.sip.address.AddressImpl; +import gov.nist.javax.sip.address.SipUri; +import gov.nist.javax.sip.header.Expires; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.header.*; +import javax.sip.message.Request; +import javax.sip.message.Response; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:53 + * @Description: + */ +@Slf4j +@Component +public class RegisterRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { + + public final String METHOD = "REGISTER"; + + @Resource + private SipProcessorFactoryImpl sipProcessorFactory; + + @Resource + private SipConfig sipConfig; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private ISipDeviceCommander sipDeviceCommander; + + @Resource + private IpConfigService ipConfigService; + + @Override + public void afterPropertiesSet() { + sipProcessorFactory.addRequestProcessor(METHOD, this); + } + + @Override + public synchronized void process(RequestEvent evt) { + try { + log.info("收到注册请求,开始处理"); + Request request = evt.getRequest(); + Response response; + // 注册标志 + boolean registerFlag = false; + AuthorizationHeader authorHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); + + String password = sipConfig.getPassword(); + if (StrUtil.isNotBlank(password)) { + // 未携带授权头或者密码错误 回复401 + if (authorHeader == null && StrUtil.isNotEmpty(sipConfig.getPassword())) { + log.info("未携带授权头或者密码错误,回复401"); + response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); + new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); + getServerTransaction(evt).sendResponse(response); + return; + } + // 校验密码是否正确 + boolean passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword()); + if (!passwordCorrect) { + response = getMessageFactory().createResponse(Response.FORBIDDEN, request); + response.setReasonPhrase("wrong password"); + log.info("[注册请求] 密码/SIP服务器ID错误, 回复403"); + getServerTransaction(evt).sendResponse(response); + return; + } + } + // 携带授权头并且密码正确 + response = getMessageFactory().createResponse(Response.OK, request); + // 添加date头 + response.addHeader(getHeaderFactory().createDateHeader(Calendar.getInstance(Locale.ENGLISH))); + ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); + // 添加Contact头 + response.addHeader(request.getHeader(ContactHeader.NAME)); + // 添加Expires头 + response.addHeader(request.getExpires()); + // 获取到通信地址等信息 + FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); + ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + AddressImpl address = (AddressImpl) fromHeader.getAddress(); + SipUri uri = (SipUri) address.getURI(); + String videoCode = uri.getUser(); + DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); + log.info("entity:"+JSONUtil.toJsonStr(entity)); + if (expiresHeader != null && expiresHeader.getExpires() == 0) { + // 注册失败 + registerFlag = false; + } else { + // 注册成功 + registerFlag = true; + if (entity == null) { + entity = new DeviceVideoEntity(); + entity.setStreamMode("UDP"); + entity.setVideoCode(videoCode); + entity.setVideoCode(DeviceStatus.OFFLINE.getValue()); + } + entity.setVideoCode(videoCode); + entity.setExpires(expiresHeader.getExpires()); + + String ip = viaHeader.getHost(); + int rPort = viaHeader.getRPort(); + // 解析本地地址替代 + if (ObjectUtils.isEmpty(ip) || rPort == -1) { + ip = viaHeader.getHost(); + rPort = viaHeader.getPort(); + } + entity.setIp(ip); + entity.setPort(rPort); + entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); + // 判断TCP还是UDP + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + entity.setTransport("TCP".equals(reqViaHeader.getTransport()) ? "TCP" : "UDP"); + entity.setCharset("GB2312"); + } + getServerTransaction(evt).sendResponse(response); + if(registerFlag){ + entity.setRegisterTime(LocalDateTime.now()); + deviceVideoService.online(entity); + }else{ + deviceVideoService.offline(videoCode); + } + } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) { + e.printStackTrace(); + } + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java new file mode 100644 index 0000000..36db6b6 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java @@ -0,0 +1,20 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl.message; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; + +import javax.sip.RequestEvent; + +/** + * @Author: huise23 + * @Date: 2022/9/1 13:48 + * @Description: + */ +public interface IMessageHandler { + + /** + * 处理消息 + * @param evt + * @return + */ + void process(DeviceVideoEntity entity, RequestEvent evt); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java new file mode 100644 index 0000000..bd28287 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java @@ -0,0 +1,137 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoChannelService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; +import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; +import com.dite.znpt.monitor.sip.utils.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Response; +import java.text.ParseException; +import java.time.LocalDateTime; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Author: huise23 + * @Date: 2022/9/1 13:33 + * @Description: + */ +@Slf4j +@Component +public class CatalogHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { + + private final static String CMD_TYPE = "Catalog"; + + @Resource + private MessageRequestProcessorImpl messageRequestProcessor; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private DeviceVideoChannelService deviceVideoChannelService; + + @Override + public void afterPropertiesSet(){ + messageRequestProcessor.addHandler(CMD_TYPE, this); + } + + /** + * 处理消息 + * + * @param evt + * @param entity + * @return + */ + @Override + public void process(DeviceVideoEntity entity, RequestEvent evt) { + try { + Element rootElement = getRootElement(evt); + log.info("接收到catalog消息"); + Element deviceChannelElement = rootElement.element("DeviceList"); + Element sumNumElement = rootElement.element("SumNum"); + Element snElement = rootElement.element("SN"); + if (snElement == null || sumNumElement == null || deviceChannelElement == null) { + log.info("报文异常:{},{},{}", deviceChannelElement.getText(), sumNumElement.getText(), snElement.getText()); + responseAck(evt, Response.BAD_REQUEST); + return; + } + Iterator deviceListIterator = deviceChannelElement.elementIterator(); + if (deviceListIterator != null) { + List channelEntityList = deviceVideoChannelService.selectDeviceVideoChannelByVideoCode(entity.getVideoId()); + Map channelCodeMapEntity = channelEntityList.stream().collect(Collectors.toMap(k->k.getChannelCode(), v->v)); + // 遍历DeviceList + while (deviceListIterator.hasNext()) { + Element itemDevice = deviceListIterator.next(); + Element channelDeviceElement = itemDevice.element("DeviceID"); + + int parental = NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Parental")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Parental")): 0; + String parentId = XmlUtil.getText(itemDevice, "ParentID"); + if (channelDeviceElement == null || parental != 0 || StrUtil.isEmpty(parentId)) { + continue; + } + String channelCode = channelDeviceElement.getText(); + DeviceVideoChannelEntity channelEntity = channelCodeMapEntity.containsKey(channelCode) ? channelCodeMapEntity.get(channelCode) : new DeviceVideoChannelEntity(); + channelEntity.setChannelCode(channelCode); + channelEntity.setVideoId(entity.getVideoId()); + channelEntity.setChannelName( ObjectUtil.isNotEmpty(itemDevice.element("Name")) ? itemDevice.element("Name").getText(): ""); + channelEntity.setManufacture(XmlUtil.getText(itemDevice,"Manufacturer")); + channelEntity.setModel(XmlUtil.getText(itemDevice,"Model")); + channelEntity.setOwner(XmlUtil.getText(itemDevice,"Owner")); + channelEntity.setCivilCode(XmlUtil.getText(itemDevice,"CivilCode")); + channelEntity.setBlock(XmlUtil.getText(itemDevice,"Block")); + channelEntity.setAddress(XmlUtil.getText(itemDevice,"Address")); + channelEntity.setParental(parental); + channelEntity.setParentId(parentId); + channelEntity.setSafetyWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"SafetyWay")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"SafetyWay")):0); + channelEntity.setRegisterWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"RegisterWay"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"RegisterWay")): 1); + channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); + channelEntity.setCertifiable(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Certifiable"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Certifiable")): 0); + channelEntity.setErrCode(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"ErrCode"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"ErrCode")): 0); + channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); + channelEntity.setEndTime(XmlUtil.getText(itemDevice,"EndTime")); + channelEntity.setSecrecy(XmlUtil.getText(itemDevice,"Secrecy")); + channelEntity.setIpAddress(XmlUtil.getText(itemDevice,"IPAddress")); + channelEntity.setPort(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Port"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Port")): 0); + channelEntity.setPassword(XmlUtil.getText(itemDevice,"Password")); + Element statusElement = itemDevice.element("Status"); + String status = statusElement != null && "OFF".equals(statusElement.getText())? DeviceStatus.OFFLINE.getValue() : DeviceStatus.ONLINE.getValue(); + channelEntity.setStatus(status); + channelEntity.setLongitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Longitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Longitude")): 0.00); + channelEntity.setLatitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Latitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Latitude")): 0.00); + channelEntity.setUpdateTime(LocalDateTime.now()); + channelEntityList.add(channelEntity); + } + deviceVideoChannelService.saveOrUpdateBatch(channelEntityList); + + entity.setChannelCount(channelEntityList.size()); + entity.setUpdateTime(LocalDateTime.now()); + deviceVideoService.updateById(entity); + + responseAck(evt, Response.OK); + } + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java new file mode 100644 index 0000000..7e44cb4 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java @@ -0,0 +1,68 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; +import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; +import com.dite.znpt.monitor.sip.utils.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Response; +import java.text.ParseException; +import java.time.LocalDateTime; + +/** + * @Author: huise23 + * @Date: 2022/9/1 13:34 + * @Description: blog.csdn.net/Marvin1311/article/details/98845468 + */ +@Slf4j +@Component +public class DeviceInfoHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { + + private final static String CMD_TYPE = "DeviceInfo"; + + @Resource + private MessageRequestProcessorImpl messageRequestProcessor; + + @Resource + private DeviceVideoService deviceVideoService; + + @Override + public void afterPropertiesSet() { + messageRequestProcessor.addHandler(CMD_TYPE, this); + } + + /** + * 处理消息 + * + * @param evt + * @param entity + * @return + */ + @Override + public void process(DeviceVideoEntity entity, RequestEvent evt) { + try { + Element rootElement = getRootElement(evt); + log.info("接收到deviceInfo消息"); + entity.setVideoName(XmlUtil.getText(rootElement,"DeviceName")); + entity.setManufacturer(XmlUtil.getText(rootElement,"Manufacturer")); + entity.setModel(XmlUtil.getText(rootElement,"Model")); + entity.setFirmware(XmlUtil.getText(rootElement,"Firmware")); + entity.setUpdateTime(LocalDateTime.now()); + deviceVideoService.updateById(entity); + responseAck(evt, Response.OK); + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java new file mode 100644 index 0000000..8a28193 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java @@ -0,0 +1,68 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; + +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; +import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Response; +import java.text.ParseException; +import java.util.Objects; + +/** + * @Author: huise23 + * @Date: 2022/9/1 13:34 + * @Description: + */ +@Slf4j +@Component +public class DeviceStatusHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { + + private final static String CMD_TYPE = "DeviceStatus"; + + @Resource + private MessageRequestProcessorImpl messageRequestProcessor; + + @Override + public void afterPropertiesSet() { + messageRequestProcessor.addHandler(CMD_TYPE, this); + } + + + @Resource + private DeviceVideoService deviceVideoService; + /** + * 处理消息 + * + * @param evt + * @param entity + * @return + */ + @Override + public void process(DeviceVideoEntity entity, RequestEvent evt) { + try { + Element rootElement = getRootElement(evt); + log.info("接收到DeviceStatus消息"); + responseAck(evt, Response.OK); + Element onlineElement = rootElement.element("Online"); + String text = onlineElement.getText(); + if (Objects.equals(text.trim().toUpperCase(), "ONLINE")) { + deviceVideoService.online(entity); + }else { + deviceVideoService.offline(entity.getVideoCode()); + } + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java new file mode 100644 index 0000000..47927b8 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java @@ -0,0 +1,89 @@ +package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; + +import com.alibaba.fastjson.JSON; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; +import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; +import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.header.ViaHeader; +import javax.sip.message.Response; +import java.text.ParseException; +import java.time.LocalDateTime; + +/** + * @Author: huise23 + * @Date: 2022/9/1 13:35 + * @Description: + */ +@Slf4j +@Component +public class KeepaliveHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { + + private final static String CMD_TYPE = "Keepalive"; + + @Resource + private MessageRequestProcessorImpl messageRequestProcessor; + + @Resource + private DeviceVideoService deviceVideoService; + + @Override + public void afterPropertiesSet() { + messageRequestProcessor.addHandler(CMD_TYPE, this); + } + + /** + * 处理消息 + * + * @param evt + * @param entity + * @return + */ + @Override + public void process(DeviceVideoEntity entity, RequestEvent evt) { + try { + log.info("接收到keepalive消息"); + // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息 + // 获取到通信地址等信息 + ViaHeader viaHeader = (ViaHeader) evt.getRequest().getHeader(ViaHeader.NAME); + log.info("viaHeader:{}", JSON.toJSONString(viaHeader)); + String ip = viaHeader.getHost(); + int rPort = viaHeader.getRPort(); + // 解析本地地址替代 + if (ObjectUtils.isEmpty(ip) || rPort == -1) { + ip = viaHeader.getHost(); + rPort = viaHeader.getPort(); + } + log.info("port:{}",rPort); + if (entity.getPort() != rPort) { + entity.setPort(rPort); + entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); + } + entity.setKeepaliveTime(LocalDateTime.now()); + // 回复200 OK + responseAck(evt, Response.OK); + if (DeviceStatus.ONLINE.getValue().equals(entity.getStatus())) { + entity.setUpdateTime(LocalDateTime.now()); + deviceVideoService.updateById(entity); + }else { + // 对于已经离线的设备判断他的注册是否已经过期 + if (deviceVideoService.expire(entity)){ + deviceVideoService.online(entity); + } + } + } catch (SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java new file mode 100644 index 0000000..255e4c2 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java @@ -0,0 +1,13 @@ +package com.dite.znpt.monitor.sip.transmit.response; + + +import javax.sip.ResponseEvent; + +/** + * @Author: huise23 + * @Date: 2022/8/10 16:47 + * @Description: + */ +public interface ISipResponseProcessor { + void process(ResponseEvent evt); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java new file mode 100644 index 0000000..30e3a4e --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java @@ -0,0 +1,12 @@ +package com.dite.znpt.monitor.sip.transmit.response; + +import org.springframework.beans.factory.InitializingBean; + +/** + * @Author: huise23 + * @Date: 2022/8/29 17:59 + * @Description: + */ +public abstract class ISipResponseProcessorAbstract implements InitializingBean, ISipResponseProcessor{ + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java new file mode 100644 index 0000000..bb82e96 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java @@ -0,0 +1 @@ +package com.dite.znpt.monitor.sip.transmit.response.impl; import com.dite.znpt.monitor.sip.config.SipConfig; import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessorAbstract; import gov.nist.javax.sip.ResponseEventExt; import gov.nist.javax.sip.stack.SIPDialog; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.sdp.SdpFactory; import javax.sdp.SdpParseException; import javax.sdp.SessionDescription; import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; /** * @Description:处理INVITE响应 * @author: swwheihei * @date: 2020年5月3日 下午4:43:52 */ @Slf4j @Component public class InviteResponseProcessorImpl extends ISipResponseProcessorAbstract { private final String method = "INVITE"; @Resource private SipConfig sipConfig; @Resource private SipFactory sipFactory; @Resource private SipProcessorFactoryImpl sipProcessorFactory; @Override public void afterPropertiesSet(){ sipProcessorFactory.addResponseProcessor(method, this); } /** * 处理invite响应 * @param evt 响应消息 */ @Override public void process(ResponseEvent evt) { try { Response response = evt.getResponse(); int statusCode = response.getStatusCode(); // trying不会回复 if (statusCode == Response.TRYING) { } // 成功响应 // 下发ack if (statusCode == Response.OK) { ResponseEventExt event = (ResponseEventExt)evt; SIPDialog dialog = (SIPDialog)evt.getDialog(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); Request reqAck = dialog.createAck(cseq.getSeqNumber()); SipURI requestUri = (SipURI) reqAck.getRequestURI(); String contentString = new String(response.getRawContent()); // jainSip不支持y=字段, 移除以解析。 int ssrcIndex = contentString.indexOf("y="); // 检查是否有y字段 SessionDescription sdp; if (ssrcIndex >= 0) { //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 String substring = contentString.substring(0, contentString.indexOf("y=")); sdp = SdpFactory.getInstance().createSessionDescription(substring); } else { sdp = SdpFactory.getInstance().createSessionDescription(contentString); } requestUri.setUser(sdp.getOrigin().getUsername()); requestUri.setHost(event.getRemoteIpAddress()); requestUri.setPort(event.getRemotePort()); reqAck.setRequestURI(requestUri); Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); log.info("[invite回复ack] {}-> {}:{} ",requestUri, event.getRemoteIpAddress(), event.getRemotePort()); dialog.sendAck(reqAck); } } catch (InvalidArgumentException | SipException e) { e.printStackTrace(); } catch (ParseException e) { throw new RuntimeException(e); } catch (SdpParseException e) { throw new RuntimeException(e); } } } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java new file mode 100644 index 0000000..36e1201 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java @@ -0,0 +1,7 @@ +package com.dite.znpt.monitor.sip.transmit.timeout; + +import javax.sip.TimeoutEvent; + +public interface ITimeoutProcessor { + void process(TimeoutEvent event); +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java new file mode 100644 index 0000000..a750ef1 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java @@ -0,0 +1,34 @@ +package com.dite.znpt.monitor.sip.transmit.timeout.impl; + +import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; +import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.sip.TimeoutEvent; +import javax.sip.header.CallIdHeader; + +/** + * @author huise23 + */ +@Component +public class TimeoutProcessorImpl implements InitializingBean, ITimeoutProcessor { + + @Autowired + private SipProcessorFactoryImpl sipProcessorFactory; + + + @Override + public void afterPropertiesSet() { + sipProcessorFactory.addTimeoutProcessor(this); + } + + @Override + public void process(TimeoutEvent event) { + CallIdHeader callIdHeader = event.getClientTransaction().getDialog().getCallId(); + String callId = callIdHeader.getCallId(); + // TODO + + } +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java new file mode 100644 index 0000000..ce07ee5 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java @@ -0,0 +1,210 @@ +/* +* Conditions Of Use +* +* This software was developed by employees of the National Institute of +* Standards and Technology (NIST), an agency of the Federal Government. +* Pursuant to title 15 Untied States Code Section 105, works of NIST +* employees are not subject to copyright protection in the United States +* and are considered to be in the public domain. As a result, a formal +* license is not needed to use the software. +* +* This software is provided by NIST as a service and is expressly +* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED +* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT +* AND DATA ACCURACY. NIST does not warrant or make any representations +* regarding the use of the software or the results thereof, including but +* not limited to the correctness, accuracy, reliability or usefulness of +* the software. +* +* Permission to use this software is contingent upon your acceptance +* of the terms of this agreement +* +* . +* +*/ +package com.dite.znpt.monitor.sip.utils; + +import gov.nist.core.InternalErrorHandler; + +import javax.sip.address.URI; +import javax.sip.header.AuthorizationHeader; +import javax.sip.header.HeaderFactory; +import javax.sip.header.WWWAuthenticateHeader; +import javax.sip.message.Request; +import javax.sip.message.Response; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.Random; + +/** + * Implements the HTTP digest authentication method server side functionality. + * + * @author M. Ranganathan + * @author Marc Bednarek + */ + +public class DigestServerAuthenticationHelper { + + private MessageDigest messageDigest; + + public static final String DEFAULT_ALGORITHM = "MD5"; + public static final String DEFAULT_SCHEME = "Digest"; + + + + + /** to hex converter */ + private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + /** + * Default constructor. + * @throws NoSuchAlgorithmException + */ + public DigestServerAuthenticationHelper() + throws NoSuchAlgorithmException { + messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM); + } + + public static String toHexString(byte b[]) { + int pos = 0; + char[] c = new char[b.length * 2]; + for (int i = 0; i < b.length; i++) { + c[pos++] = toHex[(b[i] >> 4) & 0x0F]; + c[pos++] = toHex[b[i] & 0x0f]; + } + return new String(c); + } + + /** + * Generate the challenge string. + * + * @return a generated nonce. + */ + private String generateNonce() { + // Get the time of day and run MD5 over it. + Date date = new Date(); + long time = date.getTime(); + Random rand = new Random(); + long pad = rand.nextLong(); + String nonceString = (new Long(time)).toString() + + (new Long(pad)).toString(); + byte mdbytes[] = messageDigest.digest(nonceString.getBytes()); + // Convert the mdbytes array into a hex string. + return toHexString(mdbytes); + } + + public Response generateChallenge(HeaderFactory headerFactory, Response response, String realm) { + try { + WWWAuthenticateHeader proxyAuthenticate = headerFactory + .createWWWAuthenticateHeader(DEFAULT_SCHEME); + proxyAuthenticate.setParameter("realm", realm); + proxyAuthenticate.setParameter("nonce", generateNonce()); + proxyAuthenticate.setParameter("opaque", ""); + proxyAuthenticate.setParameter("stale", "FALSE"); + proxyAuthenticate.setParameter("algorithm", DEFAULT_ALGORITHM); + response.setHeader(proxyAuthenticate); + } catch (Exception ex) { + InternalErrorHandler.handleException(ex); + } + return response; + } + /** + * Authenticate the inbound request. + * + * @param request - the request to authenticate. + * @param hashedPassword -- the MD5 hashed string of username:realm:plaintext password. + * + * @return true if authentication succeded and false otherwise. + */ + public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) { + AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); + if ( authHeader == null ) return false; + String realm = authHeader.getRealm(); + String username = authHeader.getUsername(); + + if ( username == null || realm == null ) { + return false; + } + + String nonce = authHeader.getNonce(); + URI uri = authHeader.getURI(); + if (uri == null) { + return false; + } + + + + String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); + String HA1 = hashedPassword; + + + byte[] mdbytes = messageDigest.digest(A2.getBytes()); + String HA2 = toHexString(mdbytes); + + String cnonce = authHeader.getCNonce(); + String KD = HA1 + ":" + nonce; + if (cnonce != null) { + KD += ":" + cnonce; + } + KD += ":" + HA2; + mdbytes = messageDigest.digest(KD.getBytes()); + String mdString = toHexString(mdbytes); + String response = authHeader.getResponse(); + + + return mdString.equals(response); + } + + /** + * Authenticate the inbound request given plain text password. + * + * @param request - the request to authenticate. + * @param pass -- the plain text password. + * + * @return true if authentication succeded and false otherwise. + */ + public boolean doAuthenticatePlainTextPassword(Request request, String pass) { + AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); + if ( authHeader == null ) return false; + String realm = authHeader.getRealm(); + String username = authHeader.getUsername(); + + + if ( username == null || realm == null ) { + return false; + } + + + String nonce = authHeader.getNonce(); + URI uri = authHeader.getURI(); + if (uri == null) { + return false; + } + + + String A1 = username + ":" + realm + ":" + pass; + String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); + byte mdbytes[] = messageDigest.digest(A1.getBytes()); + String HA1 = toHexString(mdbytes); + + + mdbytes = messageDigest.digest(A2.getBytes()); + String HA2 = toHexString(mdbytes); + + String cnonce = authHeader.getCNonce(); + String KD = HA1 + ":" + nonce; + if (cnonce != null) { + KD += ":" + cnonce; + } + KD += ":" + HA2; + mdbytes = messageDigest.digest(KD.getBytes()); + String mdString = toHexString(mdbytes); + String response = authHeader.getResponse(); + return mdString.equals(response); + + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java new file mode 100644 index 0000000..934490a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java @@ -0,0 +1,95 @@ +package com.dite.znpt.monitor.sip.utils; + +import lombok.extern.slf4j.Slf4j; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.StringReader; +import java.util.*; + +/** + * 基于dom4j的工具包 + * + * + */ +@Slf4j +public class XmlUtil +{ + /** + * 解析XML为Document对象 + * + * @param xml 被解析的XMl + * @return Document + */ + public static Element parseXml(String xml){ + Document document = null; + // + StringReader sr = new StringReader(xml); + SAXReader saxReader = new SAXReader(); + try{ + document = saxReader.read(sr); + }catch (DocumentException e){ + log.error("解析失败", e); + } + return null == document ? null : document.getRootElement(); + } + + /** + * 获取element对象的text的值 + * + * @param em 节点的对象 + * @param tag 节点的tag + * @return 节点 + */ + public static String getText(Element em, String tag){ + if (null == em){ + return null; + } + Element e = em.element(tag); + // + return null == e ? null : e.getText(); + } + + /** + * 递归解析xml节点,适用于 多节点数据 + * + * @param node node + * @param nodeName nodeName + * @return List> + */ + public static List> listNodes(Element node, String nodeName){ + if (null == node){ + return null; + } + // 初始化返回 + List> listMap = new ArrayList>(); + // 首先获取当前节点的所有属性节点 + List list = node.attributes(); + + Map map = null; + // 遍历属性节点 + for (Attribute attribute : list){ + if (nodeName.equals(node.getName())){ + if (null == map){ + map = new HashMap(); + listMap.add(map); + } + // 取到的节点属性放到map中 + map.put(attribute.getName(), attribute.getValue()); + } + + } + // 遍历当前节点下的所有节点 ,nodeName 要解析的节点名称 + // 使用递归 + Iterator iterator = node.elementIterator(); + while (iterator.hasNext()){ + Element e = iterator.next(); + listMap.addAll(listNodes(e, nodeName)); + } + return listMap; + } + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java new file mode 100644 index 0000000..59023bb --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java @@ -0,0 +1,49 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +@Data +public class DeviceAlarmVo { + + /** + * 设备Id + */ + private String deviceId; + + /** + * 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级 警情- + */ + private String alarmPriorit; + + /** + * 报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警, + * 7其他报警;可以为直接组合如12为电话报警或 设备报警- + */ + private String alarmMethod; + + /** + * 报警时间 + */ + private String alarmTime; + + /** + * 报警内容描述 + */ + private String alarmDescription; + + /** + * 经度 + */ + private double longitude; + + /** + * 纬度 + */ + private double latitude; + + /** + * 报警类型 + */ + private String alarmType; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java new file mode 100644 index 0000000..4e56103 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java @@ -0,0 +1,129 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +@Data +public class DeviceChannelVo { + + /** + * 通道id + */ + private String channelId; + + /** + * 通道名 + */ + private String name; + + /** + * 生产厂商 + */ + private String manufacture; + + /** + * 型号 + */ + private String model; + + /** + * 设备归属 + */ + private String owner; + + /** + * 行政区域 + */ + private String civilCode; + + /** + * 警区 + */ + private String block; + + /** + * 安装地址 + */ + private String address; + + /** + * 是否有子设备 1有, 0没有 + */ + private int parental; + + /** + * 父级id + */ + private String parentId; + + /** + * 信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式 + */ + private int safetyWay; + + /** + * 注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式 + */ + private int registerWay; + + /** + * 证书序列号 + */ + private String certNum; + + /** + * 证书有效标识 缺省为0;证书有效标识:0:无效1: 有效 + */ + private int certifiable; + + /** + * 证书无效原因码 + */ + private int errCode; + + /** + * 证书终止有效期 + */ + private String endTime; + + /** + * 保密属性 缺省为0; 0:不涉密, 1:涉密 + */ + private String secrecy; + + /** + * IP地址 + */ + private String ipAddress; + + /** + * 端口号 + */ + private int port; + + /** + * 密码 + */ + private String password; + + /** + * 在线/离线 + * 1在线,0离线 + * 默认在线 + * 信令: + * ON + * OFF + * 遇到过NVR下的IPC下发信令可以推流, 但是 Status 响应 OFF + */ + private int status; + + /** + * 经度 + */ + private double longitude; + + /** + * 纬度 + */ + private double latitude; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java new file mode 100644 index 0000000..6e7f47b --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java @@ -0,0 +1,56 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +import java.util.Map; + +@Data +public class DeviceVo { + + /** + * 设备Id + */ + private String deviceId; + + /** + * 设备名 + */ + private String name; + + /** + * 生产厂商 + */ + private String manufacturer; + + /** + * 型号 + */ + private String model; + + /** + * 固件版本 + */ + private String firmware; + + /** + * 传输协议 + * UDP/TCP + */ + private String transport; + + /** + * wan地址 + */ + private HostVo hostVo; + + /** + * 在线 + */ + private int online; + + /** + * 通道列表 + */ + private Map channelMap; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java new file mode 100644 index 0000000..fdda095 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java @@ -0,0 +1,12 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +@Data +public class HostVo { + + private String ip; + private int port; + private String address; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java new file mode 100644 index 0000000..a9111b0 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java @@ -0,0 +1,31 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +/** + * @Description:设备录像 + * @author: + * @date: + */ +@Data +public class RecordItemVo { + + private String deviceId; + + private String name; + + private String filePath; + + private String address; + + private String startTime; + + private String endTime; + + private int secrecy; + + private String type; + + private String recorderId; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java new file mode 100644 index 0000000..f2ba518 --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java @@ -0,0 +1,23 @@ +package com.dite.znpt.monitor.sip.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @Description:设备录像信息 + * @author: + * @date: + */ +@Data +public class RecordVo { + + private String deviceId; + + private String name; + + private int sumNum; + + private List recordItemVoList; + +} diff --git a/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java b/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java new file mode 100644 index 0000000..d50f84a --- /dev/null +++ b/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java @@ -0,0 +1,33 @@ +package com.dite.znpt.monitor.utils; + +import com.dite.znpt.monitor.constant.dict.ValueAndLabel; + +import java.util.Arrays; + +/** + * 字典工具类 + * + * @author huise23 + * @since 2023-07-28 15:38:41 + */ +public class DictUtils { + + /** + * 通用方法,根据传入的枚举类和value返回对应的label值 + * + * @param enumClass 枚举类 + * @param value 值 + * @return {@link String } + * @author huise23 + * @since 2023-07-28 15:40:07 + */ + public static & ValueAndLabel> String getDictLabel(Class enumClass, String value) { + final String label = Arrays.stream(enumClass.getEnumConstants()) + .filter(enumItem -> enumItem.getValue().equals(value)) + .map(t->t.getLabel()) + .findFirst() + .orElse(null); + return label; + } + +} diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml new file mode 100644 index 0000000..c43f856 --- /dev/null +++ b/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + dvc.channel_id, dvc.channel_code, dvc.channel_name, dvc.address, dvc.camera_type, dvc.ptz_control, dvc.status, dvc.remark + + + + + + + + + + + + + + diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml new file mode 100644 index 0000000..b0820c3 --- /dev/null +++ b/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + dv.video_id, dv.video_code, dv.video_name, dv.transport, dv.stream_mode, dv.channel_count, dv.status, dv.register_time, + dv.keepalive_time, dv.channel_count, dv.ip, dv.port,dv.host_address, dv.manufacturer, dv.remark, dv.create_time + + + + + + diff --git a/sip/src/main/resources/mapper/iot/IpConfigMapper.xml b/sip/src/main/resources/mapper/iot/IpConfigMapper.xml new file mode 100644 index 0000000..339afe7 --- /dev/null +++ b/sip/src/main/resources/mapper/iot/IpConfigMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + ic.config_id, ic.ip + + + + + diff --git a/sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class b/sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..6ea1426a64cf2e57ea6ab571e6f45620f6bc926c GIT binary patch literal 1306 zcmbtTTTc@~6#k|KcPW)imCD5%cx$ULpa{ki5+orp6iftb)TiloS_XG_n(4NPKgef& z!b|iA_@j(xcMBw<;LQfjKIKwcsE82p)!mslu zm0jrs3}=>nE5?ZZl4=r} zLhe=RB*kJrhFWxhANdw-3=!v=+qRKmU~?&0I3K1t!tgNHbqn!Se!bX*JoW=wm!=!) zIOWUzxPVa$V`+?If?*(H6NQc$CPlT%Fwz|$u4FO)(#9pC!cHYQ2maho=- zQK9!_#RQIp8w@kQF0rHinyT}znyy9&L(i(NN`}Fb^5tgBt4OmgDlQ?Jl6Hh!7Dk17 z2kZ%URFh%0^lxE`lvwj*SL3uZx$Z867&)hEQQu>ap{_1O~A#GD}N+~AC_xNw~Qm#RM@xdsV2{aqsFlCx3|Wl(J~R8A|`R2-g@{Y zz{1x~@+N7VRz_=Y;Q;JIWWGf*Gy}uPkxa)9$fH17A8z9glF{LJ9lvt&E3A*`TQ7Wp z^&&IKGQ$Tr_X*hqp2yHdmbrWax_TO#I(G0qMN1-NGfr`U5!lFLf?nVZMzMl1Y?I}X lp^Z&UlO;?k<{Trlq|MQvz+K#2((gxd;Rsy>egYaOTcrR1 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/Constants.class b/sip/target/classes/com/dite/znpt/monitor/constant/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..c20e4936facf1045a85a5d306153feaa79bfae7a GIT binary patch literal 567 zcma)&OHaa35QWbOr4#pZKHuU@2L(RN<&`=?eVBbsAyw@;IP`gq-9}3o# zSZipQBWST0C2ILxuh*J}`FO4yS2tIt&L#_Nvco24LB}DK4A*yV2mQ7anpWFmrD6oO z<+ZHPjd>_$W!L3I+s1#>bHscj7=*SHhu|!~d855}8(4$N%Lj6(Vib80#+XJ>U@oS( z#5|GWGV^4Lr<-O2!~QRV?#a;1Vvt3Rd|h J9yK0p{Rez%ZZZG> literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..7546fc1e002765bd0fc75ce9d433e28dbf64c1f7 GIT binary patch literal 1077 zcmb7@TTc@~6vzJqm2P3VSSxq|5maoeuxNauhNNy6-O#j#ZW?*oYCBxKf5em7>Fqtnj)6f`}uALe(7Ge8MS9Ag%Pa~~ZGYs2)bYcWTa^q8YDvgtf z2vKbKQJ6?Cl!hHi)ANtGd8tS=%u@1R;s(4YeD3x{z@r@noY%2{n^cB(ddkCqVKZO- zJAbJ#qPi@pq!71s<BU0Hm&%kp5(&f0>i@QrULe=zlGw_9sL%=*v`|;sw~3eu@p+ zl^M|Rly-gKfIJE$Wl+R3(x~8FDoFX|z9D^hflO9E$6S%tIkKNgKY?r3@(?SB=Twqn WZH{Lxj%Tg^!P@Gx7+pnW-2Mg3<@K}x literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..fdbbc42c19f1b201a47cd2e025b44139724a9a13 GIT binary patch literal 473 zcmb7>%TB^T6o&u9wIT?jC@kHn3nyN78WY1MY0|)=wOcZj28Wa>DT52&%9V)=AHat) zo;DbbapPkC%y;f*=KbUK4Zs!J737dFqfkW=B|>8^AEk(-o{7<99tMU`x=~u0TSET$ z#4p1lh#+2wsWPE>(n}*2G5h0$t$JmoHo}fgPX(sC;T556kGyfO@7vw}*!Awbdv`n< zI`*(nXgc35U6Uw1yC&4Wa(x-CLkl$mT@X5dlo<@tIu;rna!Dw3<7r5!J4%Pc^m&#VDlOjnz4BSQ6pm2l=LMe*won0K wJEJP|&JV7$htdyV-Q@_8F;F~x0X=6aP1e*6SlDB&X7?iY(PAPTu;y_12{c)5GXMYp literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..b26f0ef9ee5098d0a01ada7193add852c59a9bfc GIT binary patch literal 4835 zcmb7|>t7Vt8OP5g8n+f}yw*!Jn%G9I32B?8m)Nw+?kr5QJF}gg#n9VyMQX4L7BOwp z8=%NVR-hn=qJoi&rmz|>iRRKCu$pON3Q&lvdZ*ooh_gHI^#%je5a}t3e-mULqT@cANxX^rb$>)QWZjf?UDJJJ3kK5e7WUKQOZmZR>*j_0P>)2mK}%K*6HmW5@lO1do$Jh{ zCusX6+Lacj-xTocrco7@%?f|a1jKyg1&O?3r^f7saeC`=cJ6XElVnpZjN6Ns{xjcY z4USlkuG03A{Loz(!UW26zZw)2UgQe2uQ}Jz^)!X;Od%Tf8?vd!BW27H?<+CGM_!W1 zZf*xuX!k6)fX;sE`EJ(}Bbm3|(cf5gw6OI3Y&2VSnF8Ytf4QmYW-KbpK{KMMios%W zP$EYQ)8;b0box5Og#~M*EjP7jwGZT*ZqxL*^>LH+PdMs6{F57Rwx;fQ{@KQ63F)#@ zUST*fan1V{LT^8w$aUNkOxj&!l0WR%Bc>ro9OwARYZ5uY{eeKh4cs2uI+M)|(B4ja zYTTL}wQep+ArO>yzP&S>Wz1O}_Xs0emWkWHLb|zN|!AUH?eB=%0o75P+ z(t?!o66-SLkSw&PEB7#i^x<|DvL@e_q<53nY=(A@NM!F5>WH5bsxkwb8dA!AYRR}x zn7c!kRVUs)@^q-uZ^AR&xf0p6QpPD3w^Vs!#BFakwgJQ zsf4HEtagii&KjW>(v5cu#whxrqlW zJ`RP^oE+~hEB^`~BWLUs>jW%uUFAKFXPvJD6-qdWp6+CeE=M$Gdjhr3J&R05Yv!8* z99^hUFKm04m5O8UNu5CIaVh9P%?+O8m?zZsM0G6~4;W@NUKUnj6`oyQAW!mg%wmt~ zYsQjjcQ2j002$UEyHlP~`#c%uj@8XNg}%gPU>4sh+!SklWHQ@NQM5E3Tlc+Zez8Zk!~(J^uT(rIk=I!b4X3T4)c>uu zD|SpV0u`onCRv$rA7a5w(m9%-&b$gp($3NB+!XD;Z(mrz2ATZ~dDWDiyDyQgypgXo z?vE1Dpu{^hUt+%LIu1^J|Dvlc6k*$Er)FvQ0G!UhfM>Cv*r}`kZfcRpc5kCxIoqEl z5@)lCGw_meoP(60os(Z;P99BX&X)^GQWQ|Ltjfz8)&%}0kt1}Wk9H(^M)0nlol6(e z{D>G*Z1bO|i|8OYypVhZiw?1XIO+G)Oo0QL|D0o6!GC-$`_W`qt|YE{OYo6ai5y&I z7BAafP(mlRIXxC~s!UdP?Q zKJ_jwdK^v@KfB4V7*^+)J#mq?4+$S{a@(}{ISzmB4k~qxKwys7!f97~igONCX8gDi`=~|g+sAcTFT+{eL zEn0VJ_)FbaaT#47t3TgRT@$Kh(p!qJv#+tsE7?!h;o?lln`9^X3RzDi@>S3?qy+pm zfj5FT3A`D+Rp4#luM4~byi4HS;5`EG1@9AhKlo*V4}iZZ@GIa$0v`q+5%^Vbslcy; zza#K>!EXxu7Wn%D{{Z~9z(>LF2>fHPU*IxuP+%EcE^r0-U4h>NM+8>EQGtI7jtOjl zD+N9Vt`hiX;9m&*ORy>MuffL!t_If#{2TBG0@s3nEAVM>oxt_r-wE6RZWQ=D`1b<; z0sN7`e**tS;J<>K1a1aj5cnealE7`?4uLztT>>Y;-2(T3|1NMJ_^QAI;A;X8fo}*r z48A4sZSbhTcffZA9s^GZJc&w@*uSFiypM`1b(oN~hi8fO&?&J`@MJ#|;v@gSv&8v( QEtw+IAc>^#e1<&uAF@?y*Z=?k literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class new file mode 100644 index 0000000000000000000000000000000000000000..50dbbfda017b1059214991cfc31e5e071a863ef1 GIT binary patch literal 1682 zcmb7EOH5OB!nXI15INPq_xO9|q^=Tt*W{u@{TV@Chegy$kG6Yu^Uo0-YTx1xGmxmJN zFp`20hmodY@%a2~Y=#S~6ey@B?4D#SzA~F&7-%@ZJofNe2%b*tf;A-6p?g%y8 zSTk)20SWgQ*r0?k`8nPFa`x%7OnMRSx{qP3l*eM|Vu_ZN5Rx!J;6oAy3H8Op%;>^-pKkslK&w%P|*o=`}OE zY^>QNnJK|qE4Q0?4KgXiP8wN@!+O|$hh~Ci!F_8H@le9ra11w>B~fn)ucZ=8oxfqa zg4EUK^m-z%;n9`GQ?}PXzOa^L$Q6L{UK=l$*+leO7MIcYYt^ASqApbzk z32ML6j^PP?E5%ue^qVo}>5rg7NM)5pj?i!d#`P;M=|@ST#ZeGfb5l(2b&~L5wVSY&o4_ z*MGpG%d9(0H!bElFi_V0ACP~+^qgy@HL(|@p0Tg>>D=#}@4Wtg`|KrvIef38N8o}} zt(co$=$dzepF*=z4ZN^gGo5Ns5A7hNS59cIxZ9rNTA>{_>PZMFI^swOsQKd3@>;$u zFjF`vPnL-^9Z4oil!}FXah0K79lGQ$<#Kyizm5UM6l<+?osEWc7#OAiPM4PoH&!iy z*_#KCAcaF1RWYpNFg_57JAO5A1xBXQh1>SFZTfbwWtKK>yH1!*VH`(P9Mv&_V*>sE z8LS443PrMQ`wh4Bqrm)B+wEoFuGh0|fECufU@P11fe9r42^}BeBxPg4qbghx7;UGD zZsyZv&cJCMAK_yPTKW|*I(@L&l#aAC^X(1S*AUlmRzOT^I4_WVv-A7wyMOHddM`z$ z7ufr>z@=_ZJJ~ytbXh}E!yNI?X!wM5yxzID`|K|bx`xjPoz;*fboaOC5*^S$8pWK3 zMYjEACko_q9m`nZ;!16GPHFmolvhPgVETRfvdpzx3N{OzB#LFvud-a-q=pzMc!67N zR5sk&n!Vu@lIxPA^uZgD%T{%4ziih$CXU#Zz^;%JCA{U4_@w1+1vGgzf+oB8?N$hy ztSvW`viA3L)J83fNU*lx_)*KnrqVRdKev%`doCPY+m-Bl-FYYV)Ez0S+Ne2h&f_!> zwJ)CYJaUWE)T!h2U4^-Vvwgv4tgGWT3Gy}lkI4=!)R>}SgtPsnW z^mLL={-l~1e2kG-IP@ny3FPTFA>Sp*ega=b_H*cwXvz?orx<$$!S+4x*k2<=Z&{%r zW9Z@GA}jXz17Z|8#g{pA^a+k<&OO4Z%$V{BllT8+GN91^VTxb`y|kx>FbZZpL3df% z*HYo0#ummZ6%-{$iM(IOH}uOMO*&a+Jo6Bz_J=zziCf{uBVvJXyI!8$fBAUl<-rus zZ{&Gi>HsFx7ZB^QCSumQ(u8WQ$D35_^+XeWR%gOBSXhfF>XFoI&xygv#Edh>xhF6m zASQts#h5kbC7?>+V%+%DxFms;1Qrs;W#g&@`krFx0R}nGtqPCIO7v2Gb?SsZ%%Y!S QPg12?dAxzL%;$Ii046t}C;$Ke literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class new file mode 100644 index 0000000000000000000000000000000000000000..14717d31b0341925405e75c1a0b4d7cb7ff5d3f0 GIT binary patch literal 1670 zcmbVMT~8B16g|`3el1IZwSpihV3lt9SdkCWR)ioXBvnWXO^Cj1%TkwYx1`@b zy-L+6R@|Crx*ly6JtJoy?^aE>c4$@KRSv8u7-SVegczi~H#-bV*)Cwx94De8DsXl; zcKEtSg^FH=a3a5+-P_DDEPv<m z=%p3JaW{-X6+^hk5c}`2>DJ4X%!%pLt?ff9G}#or;h42ry2+69s7oCtyn8J}>TDTbGw z;M;N9EqXqJC`U@En8pl03Xw*QVI`?|cNk&JG0fklNAg_hb@w34OCq)YQOg_Dcnp16 z+qK@;%LS{tYZe@`Y;~wp@2X?C&XuC+Lr(R@1i%yKw+%1|?UiSButL zn~NQ9c?stDO<9|#W{J~3i{RQYe-;3m=~~k}qw!7_GqozvKffw9!Ee1VBC!jm&=kZJ6p3{)C>=^=@MqmEN7-(3CnC@`L;EC4Yq4wZ@h2LGDSr>Hx z1HqqQ`_dVt+`fEWU!MMhqO^phCA7pP9-l)JhNP?|wWKhFub`hp c;mS4OVnU%HDHfu$l}L+*BCoJYJ^{S`3;or3Pyhe` literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class new file mode 100644 index 0000000000000000000000000000000000000000..8da45edc4c021772a86ab4f16f935a99cb06243a GIT binary patch literal 1823 zcmbVMT~E_s6n@^VTf0#Z>IZ^fs3_YMD~gH?kvUP(sU*WCM58IAVoleXt@FafKj6>s z%ETMRFQUy&Hvr=(sE7!hEmte%vg6z4 zGw+FSR;r%kS8Hau>eYSA^XXIBH;aDFwkiuX%d0=MYd5RQb^-#5ju_$s(L0yt1ttoe zF=d%b(~)4R(5=Vr94L*#bLK>B3{{sb#vBw_@I2dTf{dY!dz0tztmOAod9K{5P2O8Wqat zspU58+YbfKq?)|*u2rvRn*i#k&M!cpD$i%&^4S21RM@8g0&#F); z#ed{bBN9bt#k2fIji8Y>(c9@l`?O;FvbfEI9L`T*5tgk@mECaGqN#LA;CT}%&*fC7 z6;5ZjmE~lGe`^ddu2R7z$&sh%moZCEj%d=!RmL*!F|;||?UFc1Hx?2L zTxsh(yxDnot8;IX_xWFBt^??ge}!0#t|D4oR92xD7h|g=HPdZuwT7#>7CPS#i=6yI zzQ#z@7%@gZA@vSX2^>?5B~)WEa7WKfi#YJpcdz literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class new file mode 100644 index 0000000000000000000000000000000000000000..a6c4b8ef38ffcc10a734da8c626ef5861cbc6210 GIT binary patch literal 204 zcmY+8y$ZrW5QJyrPhu(&A3_@s!OqIYDqsu--yz%7I$}H(RgRrw?cV$W$Cz&6pOR8oj$lSlZCc1#)Nq-Z&Fz4 zDsd`mt(cHhng@`uT&=SokaKHXwf_=B1tHCS*D8H9RudL~{hM$(B@jmapFq^lO)y26 Ljf3_{5`4@)Fqkzb literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class new file mode 100644 index 0000000000000000000000000000000000000000..8ac476698f58e32744972950d9194f55b2e0c183 GIT binary patch literal 1645 zcmb7ET~pIg5Iwg|X&S;;sC)?uh|&}xpx_5Z1QC>(4m?yl)6ti-#2O||oHpgbU*V&_ zz*iMS7#$s-{U7=>9QWP^Ewm4`GtJH2?4I3ocJKZ9=gW5h^LQLZh+(SWm5d$Rw~W{B zE8i%2uI+nequ{v}-*kQYRPc?QRoO0Yc`-0ZDk5lO2`cV75tQf zI4(rdr=lMN44wZS*4=7}ir6!qs>pD++vtJ z&!}X12UgvkG^a``o}`r4yd7$5SK4;1t!gQ6m7kb-hb*g2`06c95ZB!+m`>I#+Z;0h zmRz$$_>%w9Cd#plU35*qS|-zEla$T$q+u^wzF>5AAcHxmc?4YLrGgX8OgN!u8On8_ ze7=@iqP3hlm-{KfQw&PRtCkDahRwxQgM&ZAPs++14MUv%3y7=?@>>9)l}_YyZ_{PNaEEr|wDO;_59KpDf1v9F?HKOTvrT-9k$*oH1OIu1gjLa4 z@)*58z_@?tlz)mWYRwBvqJ|JZ3FO5yK1Y};rTUUn!$%lQP9I_0c>In+R)H vwaFvs2M7zpbxE7n3}J{KW9|S7SFYBxPN7gcDW+0yW2AXak#%ecWgh(nUi@i` literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class b/sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..6b2ece23270bec16db0b0abbd79534425f0d2f34 GIT binary patch literal 254 zcmZXPF%E)25Jmr@h@gdu9s*+GHdbnEOsGsO-~uab$P(B!xL9~J3lHF-jH6acF_Za! zW-@Oc&)Xfq5@Qbz!#p!J&y|(@s!x{JMk{L?o|{@I&3EnDnmTTEW|h$%`V5m&Tm-L# zF8JYC%FHtK3Q2huM*IKXn!!(0p@nT5$>4@jnvxf8(p7hM+qD>i#I#K&V^z`q^p|Jx cJ~v<>0{RGGgy&*F+9Ty)Nb#+F1RrPg0!~sv^8f$< literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class b/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..07dea8a8d8d65e38e0d82df9f008ef39aa1b3e79 GIT binary patch literal 17318 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class b/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..2d18bd0cfe7fb1cf31607528e47efd389d6fcd34 GIT binary patch literal 13586 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class new file mode 100644 index 0000000000000000000000000000000000000000..87e0e55dfc365da8d5643f7c47adb70de96b32c1 GIT binary patch literal 1786 zcmbVMU2ofD6nVrhQ{I%YIv4a~w2SZ{fUX4?sD^INwc zn1>!MJ>P75hnC}-zI|lwMn?_L{nF{&Zny8*M*_1>pG)5!4D118Hp8I9!0DMyXAsn~ z3^H%v9C8AB%W}7lhE`8tu^1U9*wso8q;cNBd0Y^f@7Tdk5;|WjJrAy6$-qSkp0OqJ zK;~fCz$`g+tq(HeaTO8132#@6*D00j>GLL{*%R^M2}BEA0y`jg$PQe?s*7r1{i1 z5<+-V>shtLHzSbtg0Ahe)TQRtL}3Ulgulkm=Jo=s_0_J`k5iTY?B34q7V&pjJ#3p{ zk9}#3`(*dLq2IE%9hvY;Q|j@Cz5_1Gi9P@I}(8 zGiwS~v4RbrrBKE)Hn~#q5wRAL(e!^XuR(u`B@GHcogF40#hAU+BJ-1$v}OEcl9TB< zxgmL1^)SAWZ(R)Y9sN{#ujFcVbt9Bo$kn^u z37lqtJ6tKqQc5EfC}mxR@{AXtQkD>u1Rk-P61(vMN!fADW5@u-YKVC3rZvX%Q literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class new file mode 100644 index 0000000000000000000000000000000000000000..27011a981e4debe3db3523459c1090ffbe989ad1 GIT binary patch literal 2347 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class new file mode 100644 index 0000000000000000000000000000000000000000..95b38dac1a9209390d1d7a5eb6e87fd6840274c8 GIT binary patch literal 3692 zcmbtW+jAS$8UGzwt6fQJ#}RQ7L7FD5N_<5vr5DQyU_wF-wh4A{8+v0SE%qjoR#~l0 zlU@c|%FuF2Je_G79++uia32CB12{7w-1ccqP8%ss8|!{?4A2CELr8nU1a9 z?|k3y`_6Ye-`Rit_wu^{Zo_XU948<0tH*FOb;pR2~0z zfwu0RsU!>}b)-zBVG7()bSwFi-o1pE>AOea|gR_6`#}B|G8S70WxBBI`yIH({56QM9UuPR&|n zfv)bB{Z;%!Jr7CnZWCX{9)XT&+Yduf9&hXJY0(LNmP!4ZiLXoZ30vB(OC#SfakDg% zqLE=0iDY-1=#lJpX?ragDd{uO-;f+xi$_XsF_D*&By}djkYf0jiCgh)hBRZiyQS`1Re#DV&)Qn@ zQ>*fEX7Jwv*@@Yz?^M{nb%zFqt5w&xe5%$3dPZr!{-`xQZF_k(c0-aMt~q1OfBA^# z)@;u|JtUybNy7r>wZ~q#_V}Nc&ON)baDmIE*Z#2j((kXn^X$qyuL*2fo_}KLcW0Mg zesksG+eYBNskPSiYTfL07Mya`;jELpenf;vl(}{N8QWuRWi+{#ZWY)Xh}QGW02X#1 zw^Wd|^%iBN#i`EFNDE7Wn(fKW6{wY!4lJpLWvLaQv2368t>Vcss}`0*J2Ejcc8F1q z1aqoBTjumN*L!Z{*1SyTn#YB6G}pSXo@;E9nsjHqqJ7wrt-t#VPxvkJtO)G=vVLZn zcdjlxdF^lWs*6{y{CV}=`PJ7iEnoaC_Hr=AAaE}dxDlfmBR$S*CWia@{$d#KpkB zhxn9YpaVbVQ(7SaKfzD=7IOCUxnB8A=ocuAp{d*zsmz%lq1?Vvd1s_DZ-xlv&W*}9 zMJn_1h)}*^qw?-ZW!^6l%G)<8?~PRc8Garr7nq?K^OWfAdkcDWy0x-M+ppJ-YIGq#F;t$#`^;fG^ZZd? z?<>&a=lec@@dC8A^L_8b80+s{L^fEG_{w-cABFh9KatMHKg8Arm;>4PBK9^Axq?PW zu8_!T5|j84nFX|GwQQmVw6CBOw69=fbqO*;ke)SKK)r<|LA`}kHYq`=5R}ZOT0jGZ zG(iIeGn8@~aS8F7_*2DP8=9NHg05R`sb=gk<}Wa-a;Y}CDugj52ZCw&;t=$Bh=CZ(XQx1PAE6SLbl;4mZ8odG&~8P zRE(*A9J36tjXghuIZ|=l&H_G4O5rAbJN*lhT8-e1g>HWW;qCLa-DN;&Ym4 zu49tX1+4*SVB+gpAuQ1XYa%ytL$JOc+{8x+LKS0^N>eLZMn$HHU%#s2OpLsNfzh{d z+p$adZsvQ77?g$QD|0~6IZ5B4=zWqNRy1LQnS+XEXAEWz@v(?|Hjez(J90EESqx`_ RF8$@&4gV|p!5jY9{{w&b-=+Wn literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class new file mode 100644 index 0000000000000000000000000000000000000000..aa24bb023298759167a8d39fcef6439e4f3c5b3c GIT binary patch literal 7410 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 v_;@e4c{hgx7Yn7Y+Px!99>A(ITpYaSC literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class new file mode 100644 index 0000000000000000000000000000000000000000..a306c9cbd2dd55809ae63a7918f4c943e5abc772 GIT binary patch literal 2805 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 I=jr)>0pl4ljQ{`u literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class new file mode 100644 index 0000000000000000000000000000000000000000..d40246d410e2b52cd29b9c1f76d8729957d48407 GIT binary patch literal 6821 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 MJK;a+UwAS6AN+X+dH?_b literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class new file mode 100644 index 0000000000000000000000000000000000000000..0e9eb9aa8fe42ce3734f99505bd767e476a838b4 GIT binary patch literal 2830 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 l!=Lp-myR%~2Kzu)7Hq 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 QV*MWUS3Dk literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..89267cf14ebe6493a9d7841a9045c56da3709e1f GIT binary patch literal 1805 zcmb_cZBG+H5Pr5T^u?xM-pn)4&dkoAzrTJ1Sb&j14Dloq8v4-Bklp2bTyJoD zNB>aU6?KoHe_7hnTVaS7iq$kyNGFlea19#6THUd9Q+h)GYBxRIa>&wgb$ZkFxJwn_&8DzThS@G`isuN1U`7fP4C6BsUGwD! zxUT{{=)eu?Zd`;r&A^I^;Uf(N6d6*U6I6;}q;THTpaO5o9h-Y?mkRu@BZJG8-ikya z&KBNSA>_oWV-o0KMcU$h+o}n7i`N={A31g2sB%}TeR!DgzQ`8Cn;t_(i`1=iDgNiK zMd|HEJ-~ko;ZOUzcy-+Kl`|=#=NG2wTW8e&snHb@?yISZ!LUeOcKH-jwKAJd+pUW= zsXAmRn*TZVei^j4wk_P%25+?lHOg?*Bz#$zq;V9Z`5B{+=Af_9Yyv~c*UL0Kpav?P z%#fzj%G62e2<(S%GD}kZ1`V}2l3HLurjKdI2=)m{5`G+?hs6h_gXd6;9z8`RyZ&=WZP0mcpYYcQ4Qf4l$XVBK;5#FTyW` W_%S>u#28-SC9N64Ptl-XLi!(+&C}=r literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class new file mode 100644 index 0000000000000000000000000000000000000000..fd11d5a9dcf07bc4197352830f391ba2f1816238 GIT binary patch literal 3040 zcmbtWZF3V<6n<{9o1`Iqr=Q4Be!&@kgCA{wfgeSDZg!Jw({#k4FMIEvd+s^UdG0yq?(hHn zcptzR7UBpY9EFmAiikkRb$vzG^18LGU0k?sEV=@banmy0;{xHK)O-tKXo(`8z&0cV z4lUXRZOL>E?E|amY6Y8`wxccC1>Ll?6|mke8*m(Lmf#;j2)3bYiAB~!n2qi6_p zP1POFxsGWqXQhj_1lrLd&{J|9LoZCr4HLFg(A_DsL`)stwz6yHH7UtP(IqhP|IrKv zp`9w5`6a`NqZ8pcQS>CxiyZ>7Mcq2{URlo*&`NiDkpB;PnFB zK9maV@I#cOKb64K(s;y>mP^vaKmvR4j6fevP_tR!T~%}S(511#1oq)sBF*Wg+-ZA> z%<{A*qZks{(a3Nu%>4+*Fiedg2}8BhITpu$j3#gZ8e!_iqG2rwj0PF-`S#=KcF7xKnQ z%d%bFHEpXTkeV`Wt@OUWylgm{USH8p7R_lgm!EO$qT#qVvI6Rgo-dQj#QG=Su77ra z{qrBze)^aRJZCOjx?6U*biN@I$EO}I2{)Z@_Bb8(tl#-)?VC^j{P|PQjuc5{X!&?Zx5u+|y`+A9k|$K;j7=5%56OED0vWz-vt4|ahlHv4RaYU^Eu$D;tVGECZ!$- zIrF@}LaBu1Nlw&ooJ9*JagHm}=>X;OCw32=m+zwcHs@l4HzDsVUt8lSEvo775tXW; zfNFOInCDXUfeCqAQA@fCZf&oWit^AVXskail_!kEB=g8I>yinMhKVI*|wH zx{21Lnv7JHlw0%_%o8t$vmS;T7dgC&St9Jg9DgT>agdx{qAZLw<9LlTg%R$-JZCC- z--XvXi{K5~AK-^w>~FM15qpTS9nbQTjM^9rWh?t2oqknDbQ}X)Ge| b$h`_2^5Y8OoeJ|;agAe~_B+|RbhP{nny|XR literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..1350c8d3ac968c8f3524c3f8fb5bc21c1e27d9db GIT binary patch literal 1312 zcmb_cO>fjN5FKw@LO-BDffg1nh)U&xFXgldX=y>K6a?CpxO*Cm{Vn!v~`jH%sNMua1d9xA9Ew_SC3ME$P7X0~5nN%wJ>W!`T&AYt`D`MbEDKeY zWUzP&{8E(IKrz@VQPJ!3u^8;`#AiWbqq9NlJa$&n&6DP;a#HbFmTtgcc`P$6TxF5L z@g*Rh$K9-?CKpok+VI*_(m{_;V1#8cctL4A8dciKocJr{MBzJOMUD>bP;29e7NbiB z+p)137llZs$Yo%Q6Vs;-JiH>XrCO+p{wE5d4^rBF#MvifY1eNU94ggC;^Q_0zb0+^ z2X6m~n0|&G<=#gpq+&4YOysf^3Dsb*nl$>|Gbxd{(GV7deV{)WUp5BAo!{5p;t`)e z8R1cv^xVHG-Fce6+4HCoq7xPG=>_oD}H&Yf=s k=QWRa;_N*(;5J=&n6~8(S?%{Cp?r6`J+l5PqdOw8=ifdw28P#MKDD!OE0-t zJm4jY$eOu`GZMFA37QemyT|#1HX(z~R9iO;LxYy`Pc;Xtt_?~Zf9Ti`!jV+Dd0qBJ znJGoLCpt3$Udot?-LJL08isz+a2g^8OB78SP)391!74PMMW+U|p+jr0xL%`Jx3IC; PZZ5XnFT@sXm&lzDbervT literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..cf96983223b967fb84d3b604a9c1fc80847273b8 GIT binary patch literal 337 zcmb7=O-chn5QSeS(MjS)@EAgB<8H)-q98l&L)W>`E@%i=+;0k92CJL9eGt@}b^lE)1e#mQTy1q73!Ey@9#gS1(zt=lSaFozcSD~RLI2=xx!2z)g~di%%W()=VO;-*mg^&d z*ZJTuNaGBPC2ga`@i)(XmgP;Uu-v#I)cQfXWaQ#+;MLw%N~bVQb&}o&Oi<)L$0E<= E7egv)Z2$lO literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..f062871d01b38a2297ed9296191ae245efd84bdb GIT binary patch literal 360 zcmb7=u};H442J(Jh0wC_06YU;x&<*XbZW(rCvb9Bbye;hT`rO6&)zVt{wV3i1NdI;aEKo@~Ajnx$0;8fYQY_8Op zWpL&wHL4q`vTN3q*Jf?jHZssn;OM5>R25UTs><@4O{#GMeO1bFyJWbi%#D}+WKHKx zsZgg$okeS%6(&l;WP=-~;@Kz==&cx4OXUrR5?K9fgVR2M;9TL3VO0w=2r_`QUv4;5 z)!h6b7REO_xt3E{f7A;Pz)WPiaV-&gS1fe0YAk8GGJ7IT@F_Wqm+Rb6Om%PIF%ef(K zHkE@8tt(iHRIQb1z2#y21bjUR-076uv3x~{!otmICUdFpkW1i8=g7}TKz`&>AGkel z;(@~w!c@CoWP+RBo==@$r-Vjpewl`4_*p;WZPbktc#>+6k z6-NRmBxJH=PnD_09KC3m7_JW9=2*RZz$9;J_%C6K`&S1i>gpm&a+2O!w3;*h(rtx=m}qi{2Do4}AL7=tN`%i#{T z6lPNk%fTO=2)yeYxez58zi37p5N$bp5b2pXU&nO$j+Y$PB^pPF8@7&IFu_?m?h)AO zT(BxsV6+d_P@Kw&iW5N-&n=z=hPga2e$i3z#?lH`Ip)vM2y9A+Y9jq?7vcmL+HlnQ z8tw*lg8uhennOwot)Hy%XC*fWRUA_5~Ql zui3-UgL($FE;xdEZ%pq)J)6*TF})x62OtmPs~C<6IS50cyUnTZl7>{&b^M5a|xw s6;Iv^EKS8cxR3h};Gx)m6v)T$MCb*W7V;^~2>Hx=A8kIz-!7Q_4L_oBSpWb4 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class new file mode 100644 index 0000000000000000000000000000000000000000..4011910146fa257e1bf4a18af10a6dd92b133182 GIT binary patch literal 5437 zcmbuCeOJ^*6vm%HWnqniXtCNiwY37aruAJxEKsSfsC2Qk)!J=#cXl_BWR_$Wgme05 zzfXJmdiqB{KtEJZ?o6k?Sj7x8f2Epvt&3%dome#2`=E+t`; zc?@7MhrETOuo$lGBL{;ef_YDD6nH~~l0lB`Dy1TY&DVJ#?M`5UuT73;h@5pI{y^m@ z@Td_#$Z-op7>@Nkl(I2XF7qg2XlBvV3CyaeJF+Ec#KK9OV(1saqUUTf1X-l0kgOth zPRgi-(|Da>kTf()o*UH}L?#(YR8}P|*!JR_weSYsWH>5<0xyfO^0;xGAdco*+6r7M9BCTbbnpRj=Ep6QPGQDr% z62{_hXsOOUZ$Z@DAmcaP3Ct>I=R!?bxQq`NhD5L=L+a83kOw{}3MxNBh&Qw%3)j^eD3IBz(fyG};Bxi>Y5eQD7L zouz5q&*2jbGnl0XTyfSN+oRXrep*`LWwO@(DVJJ-X@)~%_#q0nF#_R9qEdIl-x+3sS&zCtr|K$-w@%dy}?U%$qg#Dvpv>c z6p?)FG#WIJR2^A&yrz0?TLi@_bw0(g)%slMr7b!ttK{K6vGh7Mc_e2=Ws|U3rlGqT zS)rd-|j-Ofe#C}G?S+{&V>%Y7M+#j;c?CpPjd>(*bQ#X&= zR95*byG~nIoF|K!rrmEJ&MKdwvk|rVrQ;B&M!>=$Jf^FAG@_4=gA>1jUH${PpXs6x zPv~zy4Ft~NDg7Ny24N9j(iIIy0Za7%XLNp?j$hI5@(ZvCU*j9Pmt%C}TRNd{48sQ2 zF`YGLWId-uJ6SJu7HtO&tP?uxs*&|wD(j`rqHUjn^_tGQYh-<&$|~wC+S(adXLQz_ zk@Z6=%h6f1aWk;q(pd{eRw*VIGqBF7VWzXtcyD9rIA%lWz}>R z?Wqi`ah=7Dta>WT)mgMtGO#|>S-z3AlFC}uS+w&pus+sVO(V-oW%)Xbb~6Un4W0F) zkrkw}gwCSfih*@UXZ>VkHBwn?I%@_Y6;oAvr|GC_Z+_xW+?%-kJJ>ID)m?l?yI}e4 z;+u~vc~THnk&Y;801~rwuJWFzqxu;f>H73*IQu07ZRz`gjCcV*Rmj$oO#o&6%Ui;ncMhWKDCL|mx}{$)q`~c;UQWGB+-yZ)MF9VXq@xYZ*Eq7ylll-!}AZi CIcwwq literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class new file mode 100644 index 0000000000000000000000000000000000000000..2748741cb857d1bd3e6973f57d34d1d3ebf5e41f GIT binary patch literal 1947 zcmcIlTW=Fb6#m9GapG()I5=%6myqUSZ_-RkS}t`61WQOrhDsP&A}`ToJ(vaWjx{?5 zg{S_cR%(L81LCWC`vB) zvp%irFoqc>33VsN-?2(k7f`@x9*%=Cj5Exg4a6`WNfR6L=k9Ci8HS~D{k3>2ct?b7 z-Z0t^+tofvqE@XmE!m`lizpIE`vl110FcUQlsqmmtR6S>bl_S>@g!o8jSLDD_Gt${ z;75i$@z#}SG2ARyPQ>jjoN576xa{C3Twxg1vLi(#8a%2Ow(i) zR~-C;Rfe&+s-DZB+YyG!YQ3&>n@3%n&zD*R@}1IecuN?;V@>WUEt4WUd{ku^Y546> zn4Ttt7w1RV=(8~`oYRs`;u)){Fft-EP0{HQSFWa7v`p0fP(JMiyHY&g?I zrqI4Ur^1|hc(m=Mp7}n0jIbMlcV-0fbEktF|dcvA5Q8z zhUw!G*y|of;jiz+`i)7nw#_{2g~ktL(~o>g&sG>JBaBbEwb>a|fV)zJ5q~K>nw5K8 z96jJ$J)_?FRGKzB4b{`0eB|2-D4m?3tG0a@+=2L!ky zSrqN?rrkx`HDKVh&tQ$@)NXYCH9pgnr#*E(eQ%PaMlUn8j=KMX74ypn82KkwT&J&{ z6Tl3um+3bFOed=N9k=L2k8m4z2#DDkmIB@;9Y%L!3E%-HK4a={5@cW@hvLiG7|ux) zQ#fYlR|>LC+F8<`bPp&>D`eG-yK;c5Urj5LAHY2Myg=qHVggGs=4|rr$izw9jlI7> z#{NOZTH_W_B`xcHkn)t=54hnL^ZQtGm-oTkm3=H*vTSVhcnX?B$^I((h)PF9r8xZ7 l^HQ9E3^r(=xM(G7M3toE9yaO52I4-g89a!;TSwA|!2gx4089V? literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class new file mode 100644 index 0000000000000000000000000000000000000000..f1cfe173a623bdbc4183a30420f828bb16f77561 GIT binary patch literal 2954 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 XpMNX96Vzijzr*-l?CJM8`on(#C3#gX literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class new file mode 100644 index 0000000000000000000000000000000000000000..9be430e6aa019a99b75cee3a02e914c8bf88cc26 GIT binary patch literal 12581 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%0AKWq1_lBEU-F6u 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

AM}m9h4?@_MfD8?RCt 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerItem.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerItem.class new file mode 100644 index 0000000000000000000000000000000000000000..4ed591e7b42d28a023afe2d0f8f2c725fe574576 GIT binary patch literal 9053 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class new file mode 100644 index 0000000000000000000000000000000000000000..7e578b0eda3a89ffae099676cfeb28e3db482548 GIT binary patch literal 3755 zcmbtWYjYD-7=E_h&2G{K+CYIQD%dK$5akte)8{!5cv^ZXxHZWdqaI##?=BLyD$KEOf z5JRh7tf?6qDi&oc;o?5rPun}PjLc30&0XDxh4Fxk2l0@B7@eBbz8Xk(-MbqxY(T=s z!vvGYJ9=bUzfr{6mf;b7N&qcoi`Ng8F zlP(^UwN>=J+^p57*#&|aS$ z?SH!asDv!#B8?r)?R2ej+8M8f!v;l6#T&5G#nYlV;)_;Q2D@DB#va-daqU*4e7$2s zF81LW$`h<=W>tf!AQK@y$RO!sF2-d`EKNvA#G?Z)4&pg(&UmF6UHGhp5gU^R z)+`)CYu;VS=B9jB&;$|=4l{ra-P0vW91!k{E{@~YXQ(Fd zvZ#1vkz_6Kb>VIBj9vB`t@f>FoeVhe6wPuVo#7e#)~izBipl3nl>t|*DWhAAW?h_A zAu1QNURI_K%8IdU-rrxDJ?<9|dB<~EH+uF6f^$5tV&x$$!?MoWE(jAf%i|7j3ZJ_GH=wIBSpPAO4OSJgzq*O zGAQ{x#nk}u9JW~5)BFRBD(v{ODptf-R?+^o63X!zQIJl|l6Ey5c@(&cV)?wP4yuyB zmg{hiT*KNb)`~b0mcb_bwJrgbH(bg$Qq2Ec`&IFlTIt@aDzB8$yNoO%VvE8D2?{ z-P8L$I(in1>v*r$kRaX!tD=%L@xl*NwDGPLNmYs>Ug%+pdhc41l(i_D3s zNICe7-w$t-isEw&;vG^kR5|DND+l9F8{DtKn9piVD&L+0=Ev;io8s+Ru2bFG|+MtqoT%k8o6#PcfYK%WA=TQ1`YkG${pi;lC zH9f<`JFUG}VE0$C|CsC#rc7ZZ%z)!aIcV12l%-g#1SRAotQu=L6;Z6nJd5?ArAAY> zVzD#=DO<7Dg(q@CyBQ?186V?3-sd4KT*L>Yni%@?xWEH8qXRSekd%p?OyEUQ7QcSB z;3HBI{?<@h5_ygX{{yi*+%Ro8hQU<8Fz!&r!n#Q|+F{iIHH_J~6~H2Oum$Ae-2iMi zf*0^1j6lR$BC;SA&Z8j1#P2Yjan`!NUB|9tf>+|9`14h~Ac?QyrTD9w-pg0~n5Kt? gKCbCep{F!GDEJektC$HN-1=G`o4+VOQB`{BA2y`ScK`qY literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class new file mode 100644 index 0000000000000000000000000000000000000000..923dfde29f429c9d6dc0e1f34d4297aea66e5b20 GIT binary patch literal 2564 zcma)7T~ixn6n@?$o82TEK7}*|6)jpw0^bL*y15{;Go?V- zlv(OBcU(sox&>l8rhRk2X4oaGBGZri@-J0vbH}XZqv)0C`viL0i<6;V(=mWSfe1sb zm5rxntv%43WtB~%!axG&bR=csIMJJyZItJp+9pfVFr;G`uak~lqrN+D6-|NQ*!Ysn zJ|yiUI^M$D>|&-wlCL?|tq4Po>Uan5(y@5bNPmYmBy>#2I8uyJZ5HYWdSyyrM#qGV z8MRMpRFM@(oHDRs*GiS0x&2bPXx5^b#E6E=M6}F#%&TcuBBpeFfGbRIRI6sCC@|rl zw;M3;A3;kF@;8YOWr*oEPj6FvUAKB_$a6rM5x4DG4YQm;X5_Rvsy-4B<1)n!9dno` zpSI;j;fz}rqgg07*d0^%a;ajj?(c1zwM}EY%)#|7TLq)MWzyQR9o^zzyF zw}nf#AS@aCbOz1F1r*EPm5UdbIYvFw1-cx)PZ4tf-uQLb?0t4S##2_f@h-rxif`CP z;hPns+H6Z%TVGmPU~NkrY|X6imu+(GOR0`}@nfU@K(V_2><#)?!8>~6TMR|mT60}n zK;FJeP@JI6lU3#3Zdm)Zg1K07rqM#xBh-GMPW=cabd>%J;s+?fqx7E;E16USLFY4-K8ET_4d|;GK60UnzY$A@o}>2= z`b09+K#zy$&nblT=fX)vV#3eScZhgWNrru(L{23rk<*f@1Zho>n$$c{=!m5SvB0M+ zSQfv?=a+8D_!yt?i^XFJw`d>0cleaL0Jpt_W$J>w(F<6i6vAipU8SVpb6m%5N?{z3 zur*35zQqs`w@BVPBW4g+wSUp2LPTC*P(?3)ns|Y8t{Cx)jLi$*B^1+q2N*$-Ov>^D zuarON0#3?TShOr($cxeqBQ6mWruW^R{7mW?=Vv(yeRa4ezf01!p7bHqi3Z+yDE0lh zkTfJiO^YT+;hGXT#W8UTj+2&D9Mf=TVz0S5o0SD|2OHRAMH)%ELn(kbYu#eCLGIFJ z5-EwjfduYSQXJ}@Ap8>N5h8U$kS)Gm5`Ov}kct5)9>BwpMZc;E3;T4Z$aXEkER+8u zE`7-IE%!wscW?gOHU-^TBHaZvd*zja?pK_D!G)jNoO?Su^PjSV^Tl@OfsW4nyrS@cUCCKa{f^0d$9S*rQUmYHzML!fOL@kX6H>lLxq<8L Q9QsE;bu#(~&WykQA7IYpcmMzZ literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class new file mode 100644 index 0000000000000000000000000000000000000000..c72200475e9e31c3a00fb7d7fc52922ca1383a2f GIT binary patch literal 2674 zcmbVNZF3V<6n<{9Z%MaMQri+JTC{50q%2?sNh#7oE5)|d7Av3v+hie&>2AqxaE9@d zf5I7mfPCSD&S;p?8Are1jK4|5=k9LWG=v$(nPm6ebDnd~bI&>V?%)6Z`a6Ir+|iK| zI9>L)tcn{t)cdrmo=9>0-=fsBrt`jZ>7u~wdJ>Hgl&i8AM?M-KKK<3T~^mQ_mab7bqfI)!_<6Ls= zio-y|3{>{4Y9nL}tL)dEct00i?nXKtG?B+40i8~(c35SYJ-OGzy6fE~)WEQbBY2%W zt9DSm;8z@h^w{{KWHl`9M@_tmx45;lE-Qa7vTkIU<82e~;9VN339Cad=OpptCMHl2 zP~Es1{atDyag!#F!D92aBjUL>SVCLJ34x*AV#VsYhFfEGvN(>T2Bui4vQOf^uDoH^2GWKrwlA>`i{IDvgJ1cXHCR5TADR)+psWotB zY-=qukujc{Y;1}bz3ZV}{%YCYPBx*gt}QOllgT3MPMRd8L`Q6A8a40)@hd*otV{VxcA&ft+^v2yY4sYWoN;S8nI`NkIBm6C=ZIk zTQZH5JcX1}@^n!kR` z@CU?laiWQIw45kBfgVdum@7p-O3LJ4=*cTjao`cm$-L4;UklM+QVHoVX?ay*w5P~D zLT_HpYi*#Rl1|W2$;j&xWF#OxZ?r(lV^T}wGM|z#(2I}x{351|B`kAA@>szY+6VA0 zR;iO)b@2&xX?{P-SfiwHy?}K}Dn7$`T&1Mp0W0_^B^}@3Fg7R|v;sx+>c&6Vr$c0( zVNk~b{tWR92V*hQE;2ShFL6O}hVK+3sIrohe(DAKgE3%-zDm-PzK}O?97dcVMx*z& zzUi|QPjGmKoiJC1`=+Zby3tp71bwoJH*QOPe@T&sypmW9*^1aSR8k`oyAU}Uc{MT( zcQ5R@IA_8v&C*=Mbuu!@@CKz+)PT>)HqCK6$wtV+&SD5(Qj&!QzJ~T3hoG=@LagdA0Xo$=hknB|s z&)^HrKV$UA4(I-^&iur8aUSb*KG@ZnpXe^m#ZKqpuFf}cD{(HdJ#zB2iNY@!?Y`-F z^t7GP)1q5L*6KFwZgIw5HBNl%2yF7aMOO><@F~7(9C=AeKK$|}ac*)~vX@i8;rR6@ rIGKB|iTCB$H*qF+HkM5(pNr)ozH;aJXkxCjhV8AN+G%|y>ap`53qAjk literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class new file mode 100644 index 0000000000000000000000000000000000000000..15cf82e6672b3ff97089f12c103ab53f7d6227ea GIT binary patch literal 3010 zcmbtWYjYE26n@@hH@gknlBTpJT#Ht1l9tFtfuu#C7K!u*yqEKw%ln-3o_GKJ`PgcZUy$6eXH#BYT$hC>G4vhcRxPyEMRFx`&0sfqJAK;O4;M4%Bu7o<*Coa&ZS&F1BR$1Ili2V`U2uC33O z^Nv@P*)ZZbCUUKh7EW16Bg6Wwcu9%2h1>8Ws2K~V@ez+(YZS^*8?I4y83CTPa8Ati zd$*<;je(C9Mq6j~EuY&g6!T6sj9F+VK2g}!Sv?aH(u|0+7CyyAy06U#> zDfs54pMIlD-^qn!$WP(U`9jHA+}v1os#omQB9j`OFX!yyHM?4nbz@VjvR5di-=NLB z>d{><)OfVA_-K*aph-b5yX(?!b_i~~SsIqNyS?o5gno5}eNm&-JV6JQ3PV1kYqx*J zwR86u>`LQs`ts%M!W<*ZvL<-Y&7w=9w_WPvzK4PFE;|u6pM~~o!nV9p-mK=F^95mY zsFQ-ja%LQ2S V2qGX?g|mQM25)4obCeE$12>7g#nlq!isSxgP&c0Fh0i@Tq$W%zHv26<9*!wHktSy zy7oBvJJfg3gO8KHK`l(u)n0FzNIu0ue^$r%;w1ml+SDJ|5!0Sy@DZ%3m{!L`6Ol~o zge23Um@b&mb3`AZKc>e*ZJ<=zASjhKV}^jt2FQq+O_27Op#>qw3V9q@-f?dGA>&K$ zI1CkPOedb==nOM4zPK-vStsdcB>4!&R2?7Qk^N*^6G2RCNK8qEFG{6# zPsA*EN@h&=MEiOZd)oKeh%AV!xQF|U$iy;=oCR1>7qP);gM6EgqQseovlvC0Gu@-^ zD}-KR4>VGz6xrhNlJM3#AREKbn}8-p>)dL$Y%4)s*#L)}Apx?6d)r!rsM9?ECBmG|~k=0{LN zIm7fwZuiJ?mGh|avWA!&kQh%X=i zr3K2BmUJF}hFP}2x#;;iE=c8bh|c@-@j4cxm;8B3_E-2<$JO3ENJo?}b-#ruJm4yT F>OU)JY0m%v literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class new file mode 100644 index 0000000000000000000000000000000000000000..75b57e401aa7de7d8725239d263362df858ff8a7 GIT binary patch literal 909 zcma))%Wl&^6o&utC3aG`h0v5sxnHCt1}p?ZLaA7Qic~2DL{Jy(CeEmFaXhU(sYD)y z2Vj*2Y^cNn!Io!2h%@%6LR6}{8T*_$=llONGr#_P`wrj{?s%{m9>j7IjS?lIS+=L5 ziOdou^JpSQ36Ewe?I{_F1Cgodb;>`y5&I1=I00PL82p%L8~an9GPK(LU4Fo$lxI89 ztKqJQRj>1|0Uvb_jQ|U}{_*M6p7BC#XkC(Is0po7Xxw6eB`lNnm>1*cawHh+c4t#> zoej{$IjUYyXpE=j#63MKMhkb#BsxN)A+>WIGHi?an`# zDogyvKu+^myhybD!06uBdbmN?-7qQi?~D)0kMY5wBI6`E0nWvm9h(PJpVVA zJg_<({c4PlC-k+bz|{t{f^|$`wJJDLaEYrGn0^2T(=!;adx&6t?Ie(AKrUggk$nxK v=VCxn8IvCZo%!;gpP-yLpb~wY)x?aB_@-&TXPWKi%I6bW?W5LPW!3G!jjE(p literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class new file mode 100644 index 0000000000000000000000000000000000000000..921632ea02a5a30a345dd6212a10c11655c36707 GIT binary patch literal 921 zcma))&2G~`6ot>kcI>8ZQ$kaI%6~yhVqi8E5=zAaRHRBNAcDGJH*rR_i(|L;xQjdr z55Ou5*ieZDf-TR45O-{=K~$=`8T;P3_dDm#%&$M+z603A0~oc%KgU_4}gO#X2rVL9%CHxP&;;<5|r!vbUMV&h|r%Hw@4dZ==)lT;x zOqnHqW0>TrFJFdwg63TMv6jSLx-W+=9du<(Ujwac6ircsL0`}7eS&4qyq{nnVHq>; z2iWez-d7k!*z-Ao%Ewds)~LYJ2DC!$jKW%3aH?PtS1U065-Lo;!q~kNxLfPzf$R!o5%xCO y*C2W~6^Iux`61BCm;d~@#l$X^=;JIWW^}~&s^&*kv(Z}pd`_!z+PYCx-Tw>6jHzY- literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class new file mode 100644 index 0000000000000000000000000000000000000000..6a1ee5ddf6fbdc2c7563e9df072d5fbedb20edb7 GIT binary patch literal 7678 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class new file mode 100644 index 0000000000000000000000000000000000000000..1bfc27b5bc5508b41e543846173b020e5a84c789 GIT binary patch literal 2689 zcmb7FZBrXn6n<{9n{2`YX(FU)QPH9W0<5jHwV~8P1*Jk-LrY)O(j{5T)?}9^n>u#< zO9y>dpQF9&JbL&RUs@SISxJsSp8rCDr@r;t!*jZ?L+a>E^5(0`26)^#= zY&uI1n`TvDXngg7`N%Y?rgPu8y7j;+dvgsnDG;+{ zl!lDmuVVm%0;&6!x7KWUMR&<5*T3HJB!`I(5{s@|wM=I&i6fFjnkL;0rN38n3}KkL z&|k?it2K%a_*wVrwsW6u1di&+No*gnHyT#GXx1#5;&B}#c$Gf3&Bpd+w_*uI$0t@~ zv8fWg6zrj^$JYraPM+ z#_w#wfiSG#4BnG2&Uab1$K_BmA;CEfb4+Gx)X#ce!#rCsHQG*&g7*c)g!I3lW6|%X z=LW$Aa;2u@*)?m!ZrEE@Yr%0`&-859X$a(3NSb_AaTQ;j3X5E(i zP^fs@HhG-$dHnCQNKV3)p7%Q&){-OQdfQf=N*Q77Kr;n0zOq}I^r7Ks^#zb{*YB&^ z6&Dx?wEKeobt$=%mMuwj%=?V2A&)72@{WumB2OlF zm$~cX`vd-$8d#=+N07pZJY$CeANpuscT{}@h|2^f2>&iW`2$qtY5q@$@1aJY=Kp|L zo0@DP>Tf6WyNCy?7WCp29|dLlFZAVoNW`XPLatCU4} z)NEX%EXvPG8J}>a@VSf6_o1prAOW$j-7sjCb9{t)Q_Ak3Ag zAA^UCf5wR)yNokEjroo4VSKXNINQ^hAMGB-`EKKpp2nZ!ZfIO!d*tNBCiB1GMDL`7 z(TnYkUM##u1U7N6m!Fd_>qp)?vgT%QKlzvS6Wm%tekVgdcbS#!T4`La@%t^+i5fxYS+4&eqTFwSLR*arr;3&Im#P literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class new file mode 100644 index 0000000000000000000000000000000000000000..a97dbc6238bec5d0443cc89d8e911d00ec384696 GIT binary patch literal 2548 zcmbVOYf~Fl7=BK&n+;*Pg#ry=Edn(pK&r*kCV-Zf3T?Oum0G-Y2`i+ABqkdi`&0Y@ z@`Vp}MuTH#9Q{&f{1g5WD?Vp;b0OpdI54~CocH#;&-=b-^Vh$>{sv$QDGeTho2lG> zY$t7*vFF*m72D5c(^jq!+c$U8M(lZpGAkD|56r9;Teph&J0)vx-7Mw<5Kwfe@Co>4 z(lnYA@P@}WrNFPF1p$FT(X=*7sgzkP3M9f~$@9mWH;U$hj4FdA0?^T>pzT0w_3G%uWipX6vJ2mojEq1}eUR1dXJ*PujBN$bj{yyXI^K}_)Blqp7QvKZ ziZaVLbzH>|v)nzEWe*F`jFw>uU__v^CUoFQU)OZJjj%uqeXSYA;R6Jz`>mX#!wxT2Mk#)w zQL0azL?}*SI+E$Exl-ESHVco8?F>s5Oy*KXX45F7<=#D13YF8GE!eJ8+jMGy0*TwyuiRq ztSz%BWh~xE_3pHhifs$;gEhAulTFKi{<&;OKd_N26;kH?w4}JJUN|Yqzz|!#pZBqc zf1C?@#lGh|z)SQ29#WpiAwEc!;);8uC??lp{v#HiC@x4(O`3WrX0s^ zcrW7E!lw-D=T-R`S00x9I;oQMTw`WmaHZH(Jb-c{Z(vd(1hePsgi5u&M;`P*tteD< zl+#C4V?2KL-DG2Y%eGXR>Ew$B&f2QoM+FzOkl&Lt#y=reYhkA$x|eG!#h28cbdg8l z0a#@L8!E9tu;rN$;*4!o5tS;zX2$2tIp2RS{`vdsHvo@u-$sSuiJwG#94N`>@l^3B zi363SJd)!;@OemYD&g{2#)=PAHXTS2Mgw_N1B2T!)$#uz`9frJM~jmrLse>(OykyE)X^aAiO41|ld)tl+MQkf zwCnflG912ncqW&RYcrS8$aq0%8l-=)FZU*U4AG4f3wSw4Gn5 z+h8j&^-omR@r>>Y1z5TOtx!3muvrA0Dp>=I-V_9m6D xLG<^OAfDS)4}mUx{;M80@7SdfJRA#8s@HWlLm7I#&}(eas%J5-@l6QihS6*2lMbek zC(oAbwQl=OC6F$aS9H{*J})?U8}AU_yhjNaqtmSsf_&G(MZ8C$ni0aA{}-QyO9InJ z&^E)s>+CG`y>?RtSC_yPQ_xG$5y?LTJP^}tKb{C z-KOvptA0baw`AaHJJ~eCme&(lJd?g}>S$IKzAkVCC*dYw`e9220wcQ6)%Z5E(OzPV zvY{G3tjTVI$ozU^Wo?-mSEx8UuHO!sC2_WTuY0y$IuqnmTDH6;klpnAK||g3v@p{r zFMn1u!6i1L&EH-irMr-M_KZa8)7z5-Y4`ZJR)A)p=E(17xb@a;<6~bq@L5n5v zId1ZNisLQrr7%l?bF|X*EuhYofq8o7VOjQboG0{=7sy)}=V!A|^b3>_xy3m}UsE&C z08%Fai2|-qzUXlNioe~-#Uzh}-%UNq` z65WL-Lp(<#p`F+v!65Wgc_R2JioXm6kDVI)6_%3VIfB;;XDZcSQ9QkLEOF*g;!MBz;;F^|sfbs+z>)HUb!`O}!D;^TN9Wl7`FR?pof&c&j literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class new file mode 100644 index 0000000000000000000000000000000000000000..25588ba8eddd7f168d1c04ff7ece5496f36b5205 GIT binary patch literal 2081 zcmbVMZBrXn6n<{9n{2{{mr$T-(Y6+ANPw+MTS)*dEhrcQ1&gCIj$V>0S={W>?5582 zr}zWp3m2_DehCpYV@Z@!Z`_!b?7M9KyY4&+BuabMF1?-{1ZKFpEcVL>TT> zoVrmpJz+ev4?Lsp*rw++jJl|r+<0b@&2tR#RM?)eT@#j7a`sGnOFT(}LD8Wi#-LTW zz5JxfEryY7X`eskhQ;kYV`Fz;RJ`Kkmq}{V*~wGYx4njG?-i36lC{$egXfXSJePEg$UJ?N=dmjqWnLE& z?wF3t$k5qp+^s!us)8Y!om`dK#-x2*#~XN)AkCY^*rIRUNl?P;I&R=CG8}}c(ibsF zzX=_0OFyj{R*mBwhOsWj0RK|cw5p&ZEJ*v5j%mzLWqxoVY~o}3 zbTdLaE;1BWC~CM(G)!G@<5|$~9s`?{sb_WEkt}JR6XapYY&C7qtcxAfHFqs>-?kl( zd!}Q%4Ed7mFt^NIzRQhox$Et_j&1OckFmDBQC=~HRV~sO*~B?@QWpL?kd=V(fs$#9 zajbDhAF>8rQ+30sygRa{U5VT7?>k-cgYV&mqB&BnrIL)vc^Qa zr@F80e5QP3n>dF4z}!`&wmn|?Zk->5h}F%l)%9g6yGre92)Ai@4Dn9B#6&kV;dTf7 z%5h-#Q<4;)iZv)FxB`W!V2n;r+X*>!zavsH0=4bX_922! ztH_P&(L)&?)}URsPo71n9n?NtPPM=bCmvOD9!o3Tja$xWY}28jr-z9A_8% z8{F{&*iA1$f>dG>f*X+dO~81L?WSp#i%Hh;IX>_EJ|BM1`TM_Le*^Fywhg2N)>?kg zZo8qhpLqSy?)jb@`hne(ZP&4%bh#J$wtOtT&^`zQ>GZZbj(05E`|?o^0-6OK83D89 zc-xPLPFG-QW%r@;*s;5evp+w2C|hBp@^ua-vIcS%=2ZOMmw^rBpl>%7lYPzvGEyN7 z6z;r*OSmkMJ(l6VJaz}60~)vU+>dq-vt;m^h1c;0H-ZHI$_#J=*9ESg`wH&n=*7T&@Nft-F{dToLFq``5;#-#EKAk@E%swz>N$~^lu6SOa8 zny3qiiYj1RcpLA~rO=OK1Qsv2ozP%I#2#MWbv?N^>>bJAOXsLdR|~s-%jq6EfveWZ zM=k8Q1A+D3muZLDUDzN;UzI<1IZ-B{`(Z~00&@!H*4dA;qOarS{6XlnzHK`Fgp>Zo z{!Vk7Rd=GFI~aD^TgEs%J2>yS;^dz=Yq-jxK<>aF1}*u(RmzuW&V_@ss;J^Ro5_Tjr-S2NuAcF`&Udp`{QLqQ2d=#ObuwWYRa#S#Y#fv~)1`!b6#|K;y5+C9t?k{n?$8RaD zlHeLwX~ve&;7r3hBa1K$^B-Iy_3XbW8d%_CvJKR=kO;ZQcZ#vPQlJQ=ULa761I7e& z!YTraLNO`x9b+_R-^e%CtEafKK?kh8a=y`_STkRH3Zp*4)o(V+vqe_p>;xlCK^wTw z+9nV9$DE}wPqa@WkxJT4q@Ht2qckC?im&I?f4)u$MUb~cLeS=0d8(7$wV$SR&PPUD zaX`XBs5|V1n8`%@J-Zn@6Y=*jTqmSe@oJDXcsewiPM(?0^2_K=uFt literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class new file mode 100644 index 0000000000000000000000000000000000000000..a5944d9e03a08e4fdf09e55c39a19eff31ed8fae GIT binary patch literal 957 zcma))%Wl&^6o&utC3aJ{h0v5jfpV3S81M!mp%jonMXHn*sX<+^n>eG!#rCxJq>DTX z55Ou5*ieZDf-TR45NB+wLNuzn8T;J6|D2ig>(96E0G{B11B2mtD3f3qDG^N4Llq=4 zjg-uSL<}PyOk#>D8Hi(%s-Ukj!IK@Cie15nBHI;5bud^SY}6Rskf)nRV;(a!TfGB* z%!8Px`@!46fe2N%{k{$ta}Mer=5_wliz~n4x!BY_kR(G*Xq8;!7CbCsiL^&NAH9}C z!CvLjzYRdn2NeUKD{n7ftGJ#vrXW4N?M@dQmEN#>qfr@Ax1lWTPiT9`Eri z(st#v)F{dsUiL0N#thvq1Cv_e%zZJ~QjJ8$u+UdL{IJarE9F`y@^P%Fa*HNclCV*_ z&#>HT|AQ&L#IN_|I19y_NRP5Qqld>@8+Yg_U0Mv#Ycl;pbgqy!fdP}gzTf!-+nV}6 z!9Kz^r~VJH?T4MOFblKepTH^ptSP0NxJsvnfMBb1-Yzk?hU;Vz5No(W@g~XKB%gs> z6&;=5JxqpH|!EPpeG!#qqTExQjdr z55Ou5*ieZDf-TR45N8~#LPV;%8T;J6|D2ig>(96E0G{HZiwZ+GRAWAjwB(cISo5(; zBCS$BmcvN!NlY=VxIC4K=6#(?G2T~tN9D=ztvsoL!S>;x%HV|}**?id%+P4{j>M_p zu}BX2o57I`b+`S#1`i7^YCaZC{8Lsc4;%;1)MEMtYVM!tu~D@D_`kFiQLb}1DU=PgP4Hzo(e^LAkxU# zrPJ1t+ Cy0nS_ literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class new file mode 100644 index 0000000000000000000000000000000000000000..15c3b68237c0e90e6791be11e31e02a5b69bf35c GIT binary patch literal 1469 zcmb7ET~8ZF6g{)v^)6-s;{qv-TbhQn{=nI$O`3v%NdxSSNURbaD zz^~|Ye?aoW1C<&hHBywkBvO7;TY6@9F^2F`3Fc$x+;h*lbI0%h{p%Hg+xQ^^4Ji}4 z4FhR`>{Itw*J-<*9p~ZpQ`raw(#u}Q3s(hFh2qu-ER2}Q*cgQ^;57VQr|E^#Iq2+# z&aO|SA2_?R>AB89n`fc#1ajZG=XT{|xlgvPYy^_Dx!PH(dKh?}ooa^U<2ELc6|fp^ zXMMltwgsjOL(o`NwfK_)=WKk0DS?q48P*ftsX}oGK48``W8;cqPD@4GRmNv+e1fY? z)^fY8HNPn%lN%;J6}WOy-o2jJZpt8oJW>`u7nn#)6=F*(>f{R>*D=o|?%tm4GzBWd z;uAF=3QV}G7QPe^Ma5LGQB>Zn(2v7Rlm(_DRi5wEW#GAO@4($|Q?(w8pQw2q`JlJE zErTcVL9XUE-1e4BFoDTOJ#2Yhfm^lzd3#k>x_egXbN6y;ZHxN-^S7H^nSkMkEg1-m zs{He(jbKM#2iviF=r(@YboUam#-qm@o9krVU{wRz?X}rF<^Z0l`@Ntc?|Z5Yc5)*( zRh4j!9il;?#D7ioD?8rgnvKqJfjft@;B1tRA^zY(LxrO{2H`iOF#-_!HFrYw8^`m( zf5JTC;c)QerNOuGO%l9Bw8ofpsr&-w<*8?4M3P#`QXZ6I_Hn{L+z3)W*B4*iLBa)A!rFgoY4E(UK2_k-)^GrzQQmt l{}TBhkMUV2PGQUmK4G%Xu+tyHP)5S=P*S96m?V@TrGadyGq z*xi1>xaq}^SSk%^+HOGNH!;|AY&T6pFOaO`b9~7uih+c{?W)(b zYi=OzXRW=!Zh9>@@O--|Yp!EIYj7{{Y+vr%%MGtBw*p@}%|~)S4FS!9j+B5|by_R? z9j75MJ-hzI`NgptPHWfxe&>m-29?53X_y!>khU|x0=X;wN*dz|c0wRCOiD4DvM`M->(rfgec7wAPI9)ern08ge$K+@ z_=3=jE2HpyDH0bEWx>t1?+m7$5b^K8a>TX-$&ibb| z!k|kP^7B;bV|!y&JQFXdOJ5+ZATGxTG#Y+9T8(W5PW9=Avlp|`A3j>!SYgdIy6ww$ zrx9>+6m7P9U6$=XfuklXY!htD>#z@3U8Q((knEfyi3@BSlebPFp?ZfigLB>nj<>ja z#qT=b8>Qm!(6xiozYxDcPac&1f!MfS>>?R1i={&t(X0z=^E!tGt^5X~IqfyZpTjEW zv@SAXgm%D!Nqoss!GLh{9Ook-e1+Rw5fWeH4)>=y-sQIh=16dXt0ZG{sBorXk&#&# zhWQSsNPXl#WDSh-F?smvHxLWC%XfmYx>BGBBt9aLjRJZEbiyhEib6In^DARCW?#%y z7K?|NT%rTkW>XOJ%>^5;>^!W`IAK!qwE+XNkL1v$J!>Z^f#O(Fh;a*Ly=0_ zB_uv@OQSR)sEV%-)PKBA2t|>9j(lttcSoAkQiG4FF+XO&fyg8VDY{CJ3q6PLQUqHOM> XFu}&U(#6~`w|-&yp0MRm!FT@y(&sp^ literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class new file mode 100644 index 0000000000000000000000000000000000000000..bd3d3b3f9d1a24355e44050170179bbc9de330b0 GIT binary patch literal 4123 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class new file mode 100644 index 0000000000000000000000000000000000000000..3910987684f8e6ac0a393fb26e9ff7c438c60f6c GIT binary patch literal 1572 zcma)6U2oe|7=BJ-$FApgY1(Eh1iCLEA5G0StZ4^ybW)_WLo2ETSGbAQc%*UbI9%*+ zaK{f|H@yG}Qi(|jZb0HU0podXlcw1&CPnAV?|Ht?Ir;0~Uw#GfF18J16zc8Z$m#fz z=RE2kN6t~u_oEi5UZyjZ0GRyeQL_JMhS*kn;q7Af&T4=5Sd-KlGwzN1;%z zOi;Fh{$azyywDXC^3!5O$)b%V6e+vw4!U=Pj;D|pJDXDXnvK`-2J778 zW3NxD`eb$qY-7^f1tyv-p&}5~sh$6)J|X<#P7|vNsv-buHXOXkD54;#QCPf?XDUNt zTj7BxX60!7;Bi+qXG;!gZbfPObVqbnUeE zJJfg3v!}J+pmtWPBV^-gwRQ$08I54?uCiIz>VM+Wvi1k&AH%LMYa`_23hk7DS-itm zXaJiJRvv9kg!k}1XQadj_>kY1*xu$^25VTsI%iqdE~CMbh7DF0VHoD$n4|QWe^4|q z&!5S&mA9N4xy?SqT3sB7fXp)jib=s(fKFNwAQFlx%(tx3xcf%Fu~9w4!X^{2cT4$3 zmuAg;?JRQ$82spzWj})u8YRw$jb(xi!;1hxG};lNos_0p~mqD^=WMhdZMi~)^=^IO|lVf Y7Grz-&*w3f`0j$s+y8r+H literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class new file mode 100644 index 0000000000000000000000000000000000000000..8caf4c4a66cca0bb9eb92c083f2e621215df3b1a GIT binary patch literal 1508 zcma)5T~FIq7=BJ-$Ho{40Rn7kfwo)oL2$QqTiXEJm|6)H=u|4C?rJ7EB8Cuy<4jur z#_sk5)*CK1sSDDOruL?j_M5tP&#}Ff0vDB%^YQw9-{<3;^Uv!){{nCm-xx>AQ?YoCvwjtogf zV7yp5g}E69UVEozVN@aJ1hQxOC^F+VCXgrdrrT+L>o=r8x>#CORpSE$nYQr(K4frD zA>_{YH*iT{@@?xFcBSjJ8Zxj@z>JMq%#r4zM!k6D0vrQk^O`=9M*O=*MMB>I}~*RyeZewdF>4e_IBR-0c=M z=hpnX+uCviPwkVS7B;<(z>T%{J*8MrjV%0ky-LnsK=;F@3=}c8z7}~p5QXCP&}Qh? z_txEmgn|Cu!`1b>?6*o+0@>-dLW+oUGo9qv-??f3yR;=>ZTj7yF7J6tVB+NdA(Bp6}om*c>(bY^z>2XImG&WxrcPLEmw|V#H$|c zjd>1twCdj&oYr1q^eOD>wAMp5%FvG3Fb#*Jf&pyY;CM3z!YBBYJ3`_!#`t`23!gKV zBB2?4!C0FAX?)31<2N7=!!TcAnA8XUMc%+DeBGBq|On@#|eD` zI$;$7MIoQG`I$KytFL5hi{)dCEztpcqmZpNDb~zZp2Dd1F!{q$;bM{HxH`c|Q_yYP zVQ-V}*SJbyh-izENG0tmQg8T4qckC?iqjkFf4ff!MUbyQA?R>cp6cainELIE&aud7 zJ5ESA2rOYaDOUK(q)fT;2c~{MQ#}+_$1Y|1E@h&7qd@u2l0Ns?MUg0+pz!z@mvdKo wxTc)qlq+)Rp?sEG+&$)2=yRLxb6ZZhS+u=+A-~~M{H#7dtIzMNNYB^*0X!QFb^rhX literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class new file mode 100644 index 0000000000000000000000000000000000000000..22de6b2b8384159d244a8a07fc372847da7ab8b2 GIT binary patch literal 2680 zcmb7F+j84f6kW%bEX7rB4sq%>K%jvpaT3usT#I#x=9Z*k$iQ*r z1o~;1uh)F9;@r1O>z2Pyrz4rj&vEydNXJP7!+4Rs*tcr?^InOpl4IjblEX=9A2IL> zUS%B@9QO8NVBPLwwowDG;dM6C4@w#6P>6($85qZeKu`C zKhtq$CXtW_lTt#SJZk4D zALH{q{x8(9NCS`9vxfHr6mL43J^;i#fnD_dEK9)Yx+-UKNRgJPHXD+vPzuJZTOkTO2RGT%rZD_Es{5Z_{rx&%*}gLUeX z{E8Iu5haDci`bx~;u4L6x19^b?5F&xU{&eU+poeIak@FpM}uOp4yu`(`gpJi>`N zPQq9n?wj3b)Ahdm187qXymVXY2MUTbEF=hVP7+_|wA!<-Sb zBpY%K*U3m{GjC8zpqsXvWSiu2oy8}V6kNs-M)p*vV2BLqaX@~olv8RwsI z>c^OKrlT{z$sL?e$DM~dI`d24!8spy9`5M;8E!?+1&&8+b>@?Q-Z< literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class new file mode 100644 index 0000000000000000000000000000000000000000..23d1788cb0423ff95fab7f5d1caa10f0354ee9cb GIT binary patch literal 3128 zcma)8ZF3V<6n<{9Z%H?O32h;OP^3uS+O=3w5{gi4wa^!6u>vBnO_z2{vKx|Zonids zpJ2uxAYb@^Gm<(wVS?U4lrnSuV$H*xpjtQ2w=sl+0I5Wjv)-IIH=oHn`MTfu>I27mR0hKncKX$r*yo>l@*I?*16NPjtsJt>4xQ9^Qj(6cTY5rQ!2(7 z`rAASa1LYWc%Q@Q1T)ht1>ZQM;{!}G^w0(c9#ms+kB?S8A~>t#BYaHhY?}4W%kH}6 z_tIP(d7M>IWH{LNF3hI4?ee-+i=%+32I{?JxPj8VeWv*4MIDzgO}U%Zs^w5ejD=}x zavCbv9(Zb&0zTysGaZ&qg8$P}!)L@xex%i*QyS)oko-tJ;DZ*fGO!Hyv7lp-^QC#N z2!J8AyzO{)#agxNHud-=$8kN=vt6gokelbn$}HP!=9+0dFzen{-E|DJrDI%KSz4U6 zt@1jNCpl(?7>$ci?s=suog5LxJ)02XVDdDX1h{wWiS zlDBD72xt8e-eyjO3q#TD=~IzxF|$fUxOX^{pOJ#UarnG_{@4`z44vbh&fv-uZDWXE2h z|3@GH3wjQd1u#OIClI5_(~FY?K8jUZ%?f*biJSCANPc9@mw0SE-a$W@sPFlB;CX@U zqO{kOjsA?mTz(ga+Yb5I0!|~2wC`j@sJ5K+1Znf6d7cp;`c?ov?GpsVvl55i#XFtI zIZ7k%BM6Q)9d!lgfBONy%JCd5PpxBvNup2`Nn!R8pEK zXepH|X@QcO(wa)rGYTyVUMGbD1`>W^cSOjo#Gc?bzM}mhe1|(!s|dzn<7--r(yxFL z?vfcYbiZ6#CCJbcD)3IW3=$W9^aoBhS})W082Q6)|< z9_=q~66soh?kUu<2F~5*>*EE9Z=|GPN8_asTN4G@-=Zq`Mp{btw~lrv_JZ&kM8=6< zheZ)-bod^S6rloK#Rf$ir5-wiO_C(KLJkt$oLElXH&9;VFeIXmF=7jhy(abccZ4qt zL2fEEb)>yZftnIhYio9{k}`!!_r9PH2EBQ|$l0HuKJTc)px;D%w2(rOE919)7vn^y zajL5^{UYdM+}~+@tgG=B9tOq*Vwg9N;*YEL$rjDu>syQNQCi)j1Vf3@!0U>Wcv~DX zZW$_QPMbaPgofsu;}O%D@oPWG>n>%**`E9rg!GfsXWUG4g`+i>mXzX{U-q*DNj^7~ezcY?W?*IS* literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class new file mode 100644 index 0000000000000000000000000000000000000000..12dc3cab8094008cbc738fdbec2ebf36479d4ff1 GIT binary patch literal 4840 zcmb_f>u(%a75`m(AG71Jyv4%Buy+`&kI@hsc*89-@u_36(Da@ev^*AtXNWiN64e5`Jgy>?7+b7zxSVIrp63 z@0@$jJ@?F=-~a2EzXosuKS-lX;rM2GCtvUbFMqjI3GzGTk{^_-`5mv|yZOsS+JbVv z>RrmOdZofjP+9RVnNUbrNFt?RY`UfMm+Ed&;lR=Pi|&(dzUY>=@=F^Rz0F{H>=6?N zGHI9=dIW#hzQYAo&)s1(g_I`&Y7(~BLLd4S%q=fCR|}TQ)j$G|wMCvQ1>Tldoi;Hb zfpZGk&S{CKS6Mh9o(y`LtF09(qC9BfwubxF>ZZ6C_3aj3E$Sq(%c15q7GB$6uhqQe zaB_z&+#yPfu%%M*sWbJ0Ul#uBER5hzg)|MTwdy9L-!kRZpz4>lIAev^TR1Av453`$ zTD2$%9JermNltd#t!!~Af>9k(VAH*-VHmVz3S zwfYt=O34^OSqD?FSL&s}-|;T^HGiY%ohg;dfgAYcQcYoEUXGw!^f%lMH~+X>3oh2m zrM%n3xBw+TtGv|39nZe#+13P zyK)5RMb~WqykGJb>pL4>^+A{OQpnAhH{Id|x9ZC{QYM0JpB_$x6aC*>6KAX#uf5Kr zJz-+Y!M0ar9>x7gv#xtXb!%*f=5T`)dbBYbX=b!rY)0DH9H&EOg&oPz77?|(a2uQM zqETOnZ|+XfnS1_&B;a`u3LauI02&NV=ZYuuY| z)cGr!1}r?u-;WF(9)HI%^t_#Q15xkGOZk$lVct52C9>7g}fKn0< z;U9R0Qi|UGj1N*u6a7bgh?0S?<3)U!QU>3}kMR*oCL?|hAEnfT8+abiQnK(jR_1e* zdhvI7_!y-=WnvZ|r_`^qIE_zG%BnnT`*}(O>TX_GK1nHuPjT9t7)~4iL|+;z^D>6g z7~r3wUdC-&%={ljE}IuZU8Fe4XBPt}r8*_EU3)S+qydf0lKeF1%N`{+9qp$3PGWk< z{%dyn)cAFb&9J(y#o_GqHVfIvPFzKLY8O+FiGI*Yh`~-o7DLKgn}(cZXkulDB*RWN zOtzB>O{u1d^{!dNPC7KP)FW29VLId(p~+~PcmOo(h?5CTto?|UX_!VGGc=h^6Hf$L z!||n8(MyjK)Q!L3)A$S%W8hEtETt}%!yi~IQhKBK1wKzHfiw6PzCbC7M_Eu`q?DqE zZG4GRnwAB8nUaAY;W)lRDTCkPAYPzkN~x%yA$t?IBf(Npiq*l#O$KO3AII>`rP$^4XyA)o9d566=E^%g^(=_KC~OXgQz4Eb~?c{G;HZ^0Py*-r9! zESaB;G341!az2*K&&wF{TqpTNEcvVWT10l(JfuCR#wT9H@%Spy{aKnv_~v69k-L%< z*Ohob_w3h?zH2GI{k{=5pOgFbqpxNP-;DP&vtK{@Ca2gqW9M^vzkc+^PvP6~e$MXK zkK7X_&)}H#g~B^Z)<= literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class new file mode 100644 index 0000000000000000000000000000000000000000..f06cf109050ada3cb2e7a48878c33da9c0e4414e GIT binary patch literal 2631 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class new file mode 100644 index 0000000000000000000000000000000000000000..c78c116db0da518760abcb2260b807c9c96f8c27 GIT binary patch literal 3257 zcmbVOTT>fl7=Av;W;bCer$QS_?LlmTK-X4nZGcKoSSnBo6m31wCE3E#Bnz8O$9B9| zZ~Osz<&DfZz0et@GwL{cQ)m25*7|(;He?BLraA-J_xs-GJs)=e{QIY00lbc~jwXSz ztXHsdZs1stiW`Ad@QQBW`BuTnxwiEvPhQ|zzO!j91ioVz=E|it$Di}Pj~~uEn@I@7 zOlXJ;7+Je`b+c^e1-b{O*X;+kmA8wl){T{QCmW0o-bunhLPyd>i^QM)Z-!}2Anr&5 zC26+R#6Gm~x#|S-PT)Vh?3Igwv^^LxK2;2yRmUGqqC?v56lkyaOe))NqFX9UN@c;u z;=>I`ULP=V5GiG2(JeS$IaqMA0$saoOy)g1pap?LCi-w#AVD=(O2I9kx!Au8%OtwR zRe}v1F>w^fn71{%w07CcIRecCgHzJeBa+{5;uV}=%wsM~a-qUqO3=!Hi9rmJkqb?9 zMgk5ENZhcA5u9RBek46z5o|R%68x%((-N%vDtvkOn#nGCg9?I3>>UvWDsmm?n5tS@ zl?#{3Za(MuNt{K$fs8<3qXrsKF^o&tn2B*P&bYm?;S_TMBhfYr1B(`Sm!VMu6Rgzm z(OR?>t(TZ!JAx9H543oDMlXwwsc&S@`e z=a+2XmFMs>7Oc5+?Lx)1|GN(8t?;CQS~G;17SOzai$kDI8tShVi4$4j?7A`)NF|?% z4-wU~(ow6$j*jS6OGQU@MogumdTdH{uG^CXiaIUcm&jw(Fy9w7%5$X zj1Z)!j0mVVlOU)!lT0NfC>eqhsbm!tdrbeEaf`n)D!{}Ne>YTIco*;S#0YU4cgXL? z7T)Jw6Z7^3KHyz5Q}r1>Bo)I=+{Z_xG|D+xCKbm6OyVvn9iLzVHYo#Nv1%)%68IX2 zkR_Ewj#kd0T{r&1J{=8qrg*qryU z#z2~Jfa|+hZP4c1}S`|>mFxAnk z5EhTz)sXeKAz0rHuHhRnD8d-|^`OcEi%;368f)_M_jT26t@N&`0AZr|w#MN-!av~T zcXh&D4Tbq()<8I2FMP0}Fh9f^2wU~ShZ_p>bFG2!nR?;l4TbY4gu)p%h8&0ZQ2Ixl zY@9JQ5AmIOh=-e0pa`##p7e|AQHxiwSsUuHUR00T(*m3D8~JnQMfIq)F61{(sArwo zkqtHRGtS-BYs_Tt1&FP17z G7yJVnyL=P? literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class new file mode 100644 index 0000000000000000000000000000000000000000..bdc5df6acbca89d5e9f365fd1f48890d77694535 GIT binary patch literal 2782 zcmbVNTXPd-7=FHFH@iu<&;xB*4pOjSo20B96iuj>B8O^QkYW)$u}xPJNRyCkxnR6k zZ~Osz<&B+jxX>9bGwL{cgERgn5ubN=lh$;d={S@5_Wj<&^B%u9fByZ`uK-TNGmua? zQL3*xD;3{!9@ZMZvs$lJ{Cd+_^;Rmb^RP;pUw4|`eP_{cdhY5q?|udfngtyx1+(PV zF5F*ps|rKob9dbbu2XeucbqHBcfFEdoVb;NiL`-?g&xs&cIs`$ZF%&ikn#k+B~E)S z?80t^^c~M%ES0@gS7Fci#1^-Vu~NHJ%%ESK4k+|>ha@31`y6ap5H0Mnmo|S~w9R1yLC|#rQWf4XZG- zR;jLd%?wWBh>4dK`a2yQ4Iib2)$_HEK89e4Pu=# z!F*HsQDTvvW~=g}tsq8TXB5Ls_jWYuCx?R&FyrWI++(4LtRies}+qZ>s|NDUQ?k*(8t1Nd%N`ZN7<1u^s$BwK9piBvU9;8@vnVCY~a%nZ^2Av*cZ@NUL^rs(f6k zi^H5$lbc3ELI$5yLIykda-4%N$C%$@Tej#JA*f7)}&)k}bM{ zcNwh7qTeKy;BbD7TTCR0V@&8hQX0;2i@i@u=Q)B8NTq^Oe+%;&_CaH*m11@Ic}By{ zdqNmP(Ax@a9hQ14D^g2s;caSmb0cNr-^!c%F#?(}NB&KPZGpqDjH%9^9R9wmyS>5e zTA@NzD86>=-e&v*j(*o=JQ!=tzuy?+iEiVOSY!T8#~A0kjrYeI^AA17*y%Pt6l?q; zK8lQs91M95MmF~&j%K^f!;*y$!st8*BUpn{>D%!@6FUZyJt{zMJWzheK(dGhXgMCp z*)fo8aslE$J5TO$++~GisHT6$$(xUHdf=rEoRRm=&p0zN?4{2NIb38V1 RKEAl&JWhA!u@ns6%0IR!-~0do literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class new file mode 100644 index 0000000000000000000000000000000000000000..2c3282b517bb7a8f43a0b979a423e12be4eddb3a GIT binary patch literal 5567 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 a>B(s+&r)vVo!;|yGo3wS`e}#KkN*Q$3%Qm6 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.class new file mode 100644 index 0000000000000000000000000000000000000000..f2d3fdb16e6da28d4ce33772f36a747b92a1b4d9 GIT binary patch literal 6433 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class new file mode 100644 index 0000000000000000000000000000000000000000..72168db5a09170206811aa466265b234c1d56b64 GIT binary patch literal 2215 zcmbVNU2hvj6g^|_+H1#Y6Sw&=7)T(r{z$q7QfTcYK--k2*lDn1}Y$ENBeqz=wLx0lbo@47Bv)k6o?ahi=vpe;BR@1C-ML=yEPNU15B{yl$v6_0x z>N-W4}bJYXUQLt_)~h4*bW7g|M2y z>v)5?8b-Hq$F7^MgnLoEDX=uu*(>FC&uZ4qP8@3pYsd&JpHnR3>a{H)xdif9Cpn|t zHd}RpjnRsIas0AIX!%Jf+ZwLP5c-5?pw)zW5f1L)e~{CqY>KL^z%0}B) zSv{!im3NtRk5`WE+-u5rAqW>+8+yj8cCS-2Ws_5kb65D9y!KdSFNOI0g!sp21Oo55 zvzwf=>1oHf#`lQhEzWd)1;1+UDa7|Kw7^krgYHFlbOG4HHfQWFEHl`+^ACuA$ITFi z&ht~8JuW*8!e-|<8Dw@c$ikE$0`KDkpFxRVS#Bhk{}EBiKRiOg*>5bl&(W6oa^i-yn^n`rv{V;#h zPo;NZuDGRayK<%HiVcdT&E-!K-RNWGbGe=_C~_mE_&b`EkXz~L(rkKB{oG+*hBEe< zQ^gHDq!mIO*Kt5TVRBi*C$tn-h6hkya6zFALa=lQ@q(b?JR}zupay^dql_;R#(aF| y{Yon`6f4dAjI~dn;!5&rA6Z#&9~;T*o}K0=`8J0>HYb~Bw0$#vT>=$X`Rcze$f}qC literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class new file mode 100644 index 0000000000000000000000000000000000000000..e9eca6c111348d21713d98f7f2cb756f35b8efc3 GIT binary patch literal 3501 zcmb7GYjYE26n@@hv%5()Z3(m`f(X)TdSev?C85YgioxD&u?k*bn=I{?bQ6*-D&L%O z97n(CCujTt@&#vf)H0)vgMPpn{{TNge};(X?7L~U>CRYZVE61f&vV{$dr$MnKR^Bg z;5pn%A%?gH#Xth8K+lSG(=w};yJXHRuGnQyKt18Oj(1WZo*!CBLPt_V%0L>1z>#uo z)vP$4ZQgS0p1E2hWUXPY+7-t#Z&k_W)y#(7teZ0pXUTErYvt<#DW_t)o^#Ey8v@zM z_L1{m!*Q32d`OppZazV)*2-43RA=1|16k}8Ncy_jT7#n78KRe5&t9?{KEKyMAM@3^ zZ8s!+w}BkfbyhJuMLzc!*o((WS+?ABH`c7GKyNk0>+Z$f^ zhTi;8h|!9ID|^tu0DD($cHLwjPZ@ZceWc09Y$%W+1H%{*$dJAis?V-X&VvfEqcH=A zn2>4(Q>wH283WI{N2yVaRc={tR&r!tK0mlHs)OH_6F>3i1kihvm6ET#-hbJ29KCVdFx=GJIN zSM3F-=`2?5)2>_dEYGRAO@Wa~o_nk6ELw|}dCh8iE6ti~S{oSi!u-tigkx7LMFGXN zR;k{)pW_v$P6Z0AaXi*q^UwH5qtcJtifl~37 z9g6FyAJ_l9j}&31xq0R`-GEjP7btGR`Nx+i38VGF#iSVt_q}xohKQ6T91l8k(t#`~ zqPF?^2OSki)VyWh4PBhpfL|=h==Kd^O~!|C;UuCAJCp!+Hn#RRvGPsILu7w z7(eWdL;S?sNBH1*&njP^vg$!E60>uqDH>Km#t$1Eif4hFG;^MjG$uaHpgjQk4yOC;iVM(#nM8XaE8 zWBw-z`=&?fQBcNyM>?n6$Bx@D#&XI!o@^lo3kiY@7SvpVG3tF}ZzGdSe1c_?R8(;t4oMms zgkK>^$LE+JZ5c^?fm4JiBZYOk6{{qr@iX?oCCNaIVmpnjrvHsD4f;d$X^7E3T|C5Y zDJK70q`>I6T`;A`>Fw`HZX@R&UNbUxd1+cZinmpTqTx$Jzn!ET@fY!QVt?9GJfV#H zt>4>IT&BkBJtMcFjjiMGRn`v{6gK3Pz@qawNK?L$@J%!cK1t6dTBgy0>YLOJ6U~QY znFY-^(P#uL%{T3hZseQ{GiYQSAES;Nltcm_QA2J}8Yz5$CM6ihL28*tl7f@ez%`P% z2#0Z#B$X`vc$Xy2Z_A%ZJtBpoK^KBr0U;idi}rVn6}?Eb04t)COQ} zGq{b9Fa#8R3#HA9wh@uaL_Y^*$EgUEBXxZ8Cmg$U7cXRwucJr}&eJRVqLk^b6|<+M myl)+6vlCJ_S^u(>2U&lC4wQ$YMA zF+ONweAXvlTlI#6cGZ#H zG^8Ebpeoz8SXhI#+;-Lpj^A*rfo$6q+jr3SOOEaJXR%JUZPU=&=#MSDUb1Xr-|1oqKDnW2h@Z82cvpWvRf*ceaI5y7dH#7))`BG9KTJR>HJ zl4N73EWDzHeo@baJkd9BSVKp>0BWzn1-CTgRI(VrZWBl7POQ21gs~hJ;h=?Mc%E+C z<+9_=Xy}V~SmbxS_{+>Q;{!M$CSGXJto7!KBt(w&n;2pgz1vi}4x4z1ouZZ!6&WKe zV(+#ncCJscHKKKdIIThJ5*H>coROlNfv^12kRM<00(ah-bgS-E$vNtIeqaZ#?^RjT zVVMxS3MVH{jh=9w(o8?c(6i^+E{1q|!DVGLAyp3B*$n*) z*;z#@eoFP&+F{poMi=I%oXQ!SZb(~5F(>VcE9;1v3g%q;bujen{~i@|QS+DgTam2-_I% z>)Hv{HOXocGZxM4vg5VZ{KVuUjEaAmsoKDbsVre(d1Y^_wopph34ft7?VNC>30h;r zxK~CO+d11NFAW_{a^8??lJkVzmr3XNo#g-7Dqf+02gpjnISP1OtQ4H5fM>=^!K+wH zCa(E(y_nAHf=S;;+ikSu^?W)8>L?lnbrj9KAs{mX8F@1X z>MUjm>MUmS83AP@P$r*^fwmTN1Z^!^`J8~P2t=v|O5I_Q&3K)^5;|bv4gP+hg2x41 z*NV?Ey9^GV|Xg zJ>%O!6&8p1ZK7RWDk{M@tq6Xj0xSiuGh_)~lWS9%(f%Svdi0al{(*Db1hAK13%{ERCkI8vHz@iTb)p7#pD105uHj5oblPbc|O=HgY4du^e2- zCkP@HbA?J>D_KTGripJMRdf{il^M}l@m=3E^iE4SIF~<3nqC^!ba-J%mEOe7Bs+UoYe!u;8s6f$6N?Z#Zn8gzR%=Jyeww@yqqwdy%hJ`uKVsnAT|C?N+#-(3akhx#Z7(Xilb^Peif$MF gu%fpLe^k*O!XG2Oi1Ef+$A@EhX*k{sr{Mj60fj@TNdN!< literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class new file mode 100644 index 0000000000000000000000000000000000000000..4e5eefc855043243b3074d3ae6e861d2ba5e894e GIT binary patch literal 2110 zcmb7F+j84f6kW%bY}rv#H*GEk0|^AMd5)1tl9ZQpyetDJEE%;U-Cxo1Dqa&9qdQB83cETI;;gh7=5@S|H&|N3 z>@@DXbt|B-lEj+=GXvbA$GxuItXp0h3y5pTlbR96@{+GLsa@1j#1iW=+ilAsG0Ven zqx8d|M&gsR1zeLMjB}oSqK4=g_0;eVp)bvKBIIit-V+c78S#dWo01vLcS9$E?0(nr z?Ur?5ckIKab=PrR-}G(Q=?E0JWZ#%g`_Mczjjzm(f822$!#uMwHmkck8@AP~m)R?h z*&=tTF!2{QF)JaRm$q!j+Ud3qE$>s4No1F}HM4nOdbT`Amx|x8ne|qX_5XJ(OGtM5 z4KqE=cE4W=2V{mO#2z)pNDqdTl%{!UT|jmHhUF2ZtaTxrj&yJr9mWGi$bp=P ziBLJX7_a(f?dxr`9idkD_AA@#Oj%*Ga0a_g4xAcAODzl>(^a?Y)vOIWAaJDZuE{pV zJbORJ=OV@*j(s3;JR$HtgcSkZ>(iWpEeV)x{?eKLmcOT%}t2t#Q>u z1Khy}JaI5E%XQTGMndLcTknn;!|kfLXDpme}lHYwAjPt z;7DO=XNgNmS^gbkS>+inpFm&EDm`TT7P*p2lUym0Ri#bh875CKo>jAnzL9duT=5~Y z!!PwPtlTlvHdJ(I%w?K4$zm{u|N$ z#zYd@b4(`@T31oN@WEM-1HNF8Nj^bXneTFNEcVA4EMXPi0ZEJRu+9D9oSq zQ|VpGlvkCtfUaDo+#p$6rg(znau0J~%KKbNk&3JmX*5Y8Rk@3)SqY;?x#Jv*Ey9(P za05G(Vo2jUc3DrHwaj3Tk`mCc3FQSZ6w)9Bp+krlG#Z>^@?r{V-=J@!j9$@<`S=D$ yNcUwZBF+DTh0mVgt;x50C`iCPEKgn!( literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class new file mode 100644 index 0000000000000000000000000000000000000000..8ed801ec4bfa4abe2d2bf89813b2b029b3b43aeb GIT binary patch literal 3939 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class new file mode 100644 index 0000000000000000000000000000000000000000..1126ef354544ce12d72557aa3ee5cd0dd6e7db34 GIT binary patch literal 1942 zcmbVM+in|G6kW%jvB%D&b=)|qNuWs^z?ZmFpoP{>T4{0CEc#J(k zqMyPCke57w1g-=Uf|pj}8~6+!Tguuqa@I@3ejACCjkSAIFcr&U@Ba%yZct7;cU0S+5Yu{aFCz5aW!AIn2{|&++aCi88tT zi1jd);LnR*TR~aq-REmm(Sd|c^ zG0!0*Bd||<8n6g)bx9~*H}H;v%1gBOOt!`~BK6$BL1Fe3dtps{oq&h4)mF!Oc(A|g z^d8x}Z8DRtx^=s~WA|Ee4lgyY+3G8ltN*ucDy*r0{GxNCGz}j#ze7m0kyj%gS4uf~ zoRAW>pX)W9of_>OGb?A`#f3P6?eVx z6zWIc>;tZ%2Fz<>HAPMRgNr(`*>yzV5|JOJ|q{QKFwm21xlw3bPMaxsV8neG2$j};ub5+U>hIu^&(ioU3|p5C<@fwrljFxHp?AKI%-&; z{uY_qVEiS1o{bkc6Nm8Vu3(e(L~)5d`hb$=)9?V=D_&@%K`BCqQm<%qa*oJF2Kvxo zXrrCJq8an?V;Cacl2AmN`xO^Ie~Oj#n*+QpfCnh1F9-61$X6&2@b37Cj1Ffm#HH|w H&wTY?seM?? literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Track.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Track.class new file mode 100644 index 0000000000000000000000000000000000000000..dd64cdc08007a6940f506f00815f1a7ed9f53168 GIT binary patch literal 5811 zcmcIoS$G>)6+YM2GLlBNEHCLap-rety+%zTkc^Y2b#NMIaY7ti5|(sqO{_^}$(6=! zld`u!*uzqmvTqGbfEF5u7Ct_BpnM??@wM+USMvvo+_Q^Z#e= zJ@=e*uk@$?zVurndK0~rrXK1|Qp}_{B?RTpIgdKUic?)F9$Px+F8hKKd%UXW-z%th zbZjw22BngeHYr1-QtDnnqOS40a>dTSKX556faa@^J~Sr+gK}}tUJpO z3o@3=PPOV*8iEFowB9vW_1zV>KF#j?OzLOf$>mzfU7jnkZos5G4GPL=-Mq8v3d)B( zEckV=x*{D6n>4}>QWAXf{F=)yZZXNCTLs1Iu2VYS{`#3(t>QXW$=+hp>m@y@dTXU^tB7W)}~!3#Wq_?0jf%+nEL}V;?8C z%FLcC?KKFC>1&QT5YVk)Q?-uw6dDh!pWG@lA0yNu?9Kd!W)=GsXn32Ts$qGPTank0 zAHmK{ZdEyrA&M8?WIkiGE=Y{=k{&bZao!ojuc=uJvQDg5eQ(uW^cvn$#l62;t@)1c z)v9nYafF+PQ}LFZC8v1SY53}tH!7^&8XX;oPJnfe$(0|0My7TL+OK$z7gSl}#sVzH|MW^oZSSw?G z*~4V-mXqzi(_zM$Mz~@}!Wj}2?ARjDw3)})%GN+7bz5Ty5(_Ld0P+SSvhuLUNQiL5)wznsR`bhl9S%8Cg`iHb7O4*@ zOa)LK2zYG|#(gcbT2y}spfqU-(G5JK%zC8Q&74NvDsxyP*-D|-oC{-=%8($WJp!Su zQqD-VssMyiS%RUOmaGSCyRzv~PV!`C&Xv@b4k$pIF1z64cs%N?>8y(%KQVW77D1oG z#^C&1uON+6p;#IP%|`+$QAH?G(D6tYLMzYcfm&j$AeWRZ1oKZ6^lZ(*tD0$gp|)OM zb`N-59ckGIw{yRwZD`ItxIb`r#XSI051-j2=se^Mo)_@{M1$T70}k#R4ex^ihxCnx z_rrj5TDrtJd?Vlk0N^OT(eObSa2QJ_4q^Gk$&052Fm5;a{18S(JO!Td@oOZWm#`1x zlg&K$C-KSN0idVoBY2|vX$L;r$uCgyIT(AWMb1T%arQ=#vz_GONHUJP2y(8Id}|~b z$9n{MsFQqqBpFwL2=b;*@*R<6TnQq`n>)#)kz`yOBFMLOlBXicxLHJyw{?`cWNB(4}ZU+q(6`4UgCLxoAIyZvAk>WIvye_H$Raez@VXAAASFCpu>D5OQ@B zn&_p8@nyE5^6GM=G$@0E$)k#Tf#e1pd25W@EPNqpF`sXtQ2ioHw&m&u&6VjFZ% zfY@or0oiFMtTU6hPB<+Db7ftwAX( z9RlsMGXU+gO)JA7Q-dIdKr?n0pc%W*$}*@=gR)j%2sCT=12k*rtbPXNG^pRog+K@G z0e}wLd24_{c?}w{@*&V+dk~<*_K-Empdk$!w1z^Ud3zY3d3(efX3&TR4O=4tD0T%s zrZ;qWsgv&?YOjLMA}-Mv=!@9NVete#jnlA)3Zg<^g07dw#aa3?q!>LQ=IASs;&fE( zr>{avP(>8z8AwU0i`(dHkPKw$b^1D_6nOulZ$L`Z2K|M;2`NLrp+D2NAer=6x=P=M zl%>DZ&*?jm`fwm$qVGcL7YX#H??K9mJLzHiKBNILK`#9OQeGUQ1N1DUL2;b!qsx$n zL=88VA3_=y>$I7E1ZjkRjP*ZG+mgnAs4q#zD>Ra%9{d^N6}m-B$;eGy zrsUKHop^}#JM9=7teCbKTw=RPPo2^b@**SjI(`ehR6F(!!vhABm?PHrWYWk=nwc2<0_;y{f+KHx^t@k8)bG4lF4b9WCD)!dfUkjm~WM17#%g;?f+Lig5u3Fx1j?)gaH*?tX*%cISkIet@zgbXNB-0Xy^|Zo2A#<-DS0Q$B_+?}kw2^CU92xFd79;OO5VqEMaeTP mSCu@=@|uzlvRqg4VU~T!8}w-B)j0g+>tgfE*RNzpeDQzmI}IuT literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class new file mode 100644 index 0000000000000000000000000000000000000000..d99fcc0e56118aa8909659b834996afd6cd5c107 GIT binary patch literal 1895 zcmbVNO?TTw6uo2FmaM9cQ9d9aZbRz^e-Mkd2??fg!IpEN zYYzW`EgQDQrD+Zvdb;Lc@Gn>u-Ww~_O}dKDu}1IBoBQs&^Jetd%io^^n87_25rNry z)3>(Wz_A`R_5#aqHr$}uvV3RTwXH{I1yp1t%|JpT`Fk^LpD|!a`@Yv^`<#IRX}1Dtzh%J0pn#gL-YDN$sR+#9J7szu z!x&L9Xy9$UBM_^5&4wc|l*yJK*!#BS*^OOmW9xxa4~ja*Fs@?4KnmxH)vJIN(unBn z+g``n*db9feXEx}yWKAKIVwTRZR{5NGcbU}pEU3;E(*j;E^Wl3z(_w-xNq_d5aeWD=d?G6u59QJm!07Fft+Pp_B2`v#^_pay8z{t2x@iaI{P6%|(v zT*Hh&@|9M-0Ak~O+p#@jGu&TcD0TKO6aUb_94AWbIzdI&sNo|4XozVjk-y-%`%Z!S zkE0h^x{s;ce!L^aPAZeFYDj4K1Gr?qKsdE~kE1~S=G_9}01vu=A;yX7)^m?9e7cS*)X z#ocY#L8nDoUz0SHAX^ofdLx_TdsC!yAPW;XTM6v?!*zQv%%zp;Uf7sQh7s5LgykkK zowBw?N~%|yomSmhby>KfV>eELSuR~6^~dP;iZ6}woxF_ax5HD#jY2m5lg> ztcTyYA_ZTPH-fK--yA9-zaPmHBY)u#@0Ih6m zef)zWe);!rbDnEZWDO&7b()mAOf078nMR)UI^r=%DsB=FuAo4tpR2n=f8zZT2^GUa zjQ>Lz^c|r2p2il9ta2>(8!jD}DaTjCUrhl;o@1D3P`DcLe!Kllu9kyg<7e_ zy3{DOc$a$f=5oyZRGPXpSL5bq q(mZ>JwI@jOM)jJbC)5Caj|Op`z8TXPM+rK~-`kdNP@~ug?*0deoSb(6 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..8b44e9ae408457820ed45ccfc4641af78240afe1 GIT binary patch literal 13644 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 MvpPQJfgC6Le@c?IWB>pF literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class new file mode 100644 index 0000000000000000000000000000000000000000..16706a2655f866aaed42ff0a0735e66a18ae53a1 GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class b/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class new file mode 100644 index 0000000000000000000000000000000000000000..6eac1d9285624c5f6a81464031bef63ff163f23d GIT binary patch literal 2000 zcmb_dQBM;=5S~S}6j6~1q9`h$(iitZjSnRxAT>5=0%;8ozHNKkvSe?!-0d}5i;QLj?+&TyPm%RjhsOd0bE{DaY@D1iQsBL3jD{<*NQs!0v zHk;`Mstqr5?y4&4^PEoZal?cp(3&8#$*Ht75?JD>;ynI7Wzk~woR!MtP<4c8@snEh zkide+T|MNxVRA1Tj!%FlSb-6eMm-*<%T$v)=TB^9v~9E9E{st|wlNRwpsp{$EmuaE zFh`_yyMY2-A9pu*!}w{i&}$<^SL0ev*&xs<{HZ{KMcGCdYI-19NZ?}@Ys}3V*L+*o z0Sgm#%?N*ANuiM8#k{DW5!5$&FlHO|GOv5RC_qA4!y!<~MzXz*gjI>jwh1&;Pe(E$ zfI9i7YCV2J(<4@+quiVSjZx4V4G7aS1<;FIWLwyguN%RdN- zeOw)VERtdLDw;Mp$Ov4+?>bJ)IUIH+m_e(I))dU5eG}$V`xe@_;SSiL2zTwe0F`wA x9_}x~lJ(z*<<$QG{SRTq`X9k#yRO0$yFP_yc3p$@^#2XSjx%@;FKi|+{{RRjjI#g$ literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class b/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class new file mode 100644 index 0000000000000000000000000000000000000000..e543c59d57ec5e383ef1879c773cbb4fe68878b3 GIT binary patch literal 1402 zcmcIkT~E|N6upB=1yn#>@cZL!d2vki$t5PPV%%7j(1b+ay6vS7X=j#p+EAbT75*3> z`~m(brDM=5FeL^@$rpuY@UHLwQVDb}WHOlMX5By9QmnF2NWK*&xQ#`b>H&kf zKqNBMWsVF!|1X`5P9ZAMXp4ul&&vt%8bEAzuVvxy!54| zWw40!vmLJ)ymtHdm2vr~fm85r66rSX57u``A;(NrIIL}IMll2an?kpR){?{jvzlOA zZ74PwnoeLQ)EP#}J!tW|eGSc-;T9 zEhnm27Ce{;6SmW{yr`9mlrrj5Yzeu;VABqh)^D+MLe z6}3?@&3$sFve^brg8p$6{AFBD^w*5ae4xra!WSYXYu222w_E1E*(9`~7@VQ!9PPga z+F~A@r_&srW?-Jq3vdCO58dS>(;6^ZWy zSQapt$hpK)>H@FRiOM*DRRM<`Q7TPExoNRlq>`zbmTiOTo|SIM=ug&nIsyI6(VynI zfa78OyO`Wmk~G$8hF4yn7iFhz)GQj^3J5(yWp+ZY;Yb9Xs z$A_^WaHbNjNf*(H9eVr%d#{nx_)nkXzl|x)#EXwxpS#xW4-?bYnYy6Ts^0w;#zE)N jUS7bGtrZ(;&!!W=8gwc3A++dvhr)&}|JsBthitzAOq`&Y literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class b/sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class new file mode 100644 index 0000000000000000000000000000000000000000..2e0f5082e3d7375b7d8116dd282b12a37cb97585 GIT binary patch literal 371 zcmbV|Jx;?w5QX1{ACu5<0j|IlAQ~geNJv2xKEc>KiYD^zMC-K$lpKqK18^vWV-N)q z4aLk9PxI-$_x|zv2H*;(1!fM{jRo?Wg`VR!Q?RJn5_OUWZG@_vgu}gf<)x*-x%v_c z96FqBcwlNduIZuPNRta3J6!IFHCs?`J%y*5vv%9I??@iA#7-^#;P1Y14)aRak#nEK z;brw3T(15By_uf&vv~`wkp`ndz1V)n^0stXRMw|PmfDVv&j0G+V&`-W?Qk&8(O4`n MLow|W%%{8f1XpT!iU0rr literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class b/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b3363d7a8ec0f4f308dfb84534a8deb3f8dc5cde GIT binary patch literal 15903 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class b/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..bf82c73fcd187028bc7ce1fdb8d9efafb009a157 GIT binary patch literal 14013 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 Ms(;H98L`q@tiM~g%~T?qPHD!)wh>R6 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 EzjrHuH~;_u literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/config/SipConfig.class b/sip/target/classes/com/dite/znpt/monitor/sip/config/SipConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..b739329a395eb31f25bad8fa43387446259fcd8c GIT binary patch literal 5196 zcmb_gTXP&&5&mYcv%4c{wUX>i?AS7Fh^}4;aX=$Ej^)U2ynLZyCJ23h3NFbs5|Tf@jwtx{TcT)T9!T6as88Y#6#sp-^9OSS4bXQj00 z)Q@&#YNd&O={3T&@|L1CqrR?Cg1?TYSo z23{|^)N-v-cB-Pf-M|}^^JSS185owSUN1MBkJTE>St>^jjA5M0rE+!Vk&W`YhJm5b zvMQjH!w(6#WZ;c>6W3j_-BaEh4h#*4z`;Ap`MlZSNzrl27OzdA-)-P6c&nnHWB@eu zZ=w646sTojQlLq$G+P(VK?C=QCQHo`wQW(~Yv8b`GgRN_?Oe1+4BXeEd;2_U;FxG~ z^6H`e&lX*iJ=}F^b?G3xyj7fph_-ISJZ;b6dgvD z3;IE&VvXS(8*J4JH5JCu*QhX3SJR*k%jO?3(2z*$ZcV)e^It`^XU?hGCpRi*?Z)Zy z*>$h-YD?wyGv$UOb6=ToSDmJYvAONn^CW}B!ckecCE{#Z zOlX!+KPwq0PE;=XK6s!x>VmvucsOfi8)FkpRd5&>1}A*U_~%7;HFwo+a0%IRQQZ<* zPv=jRK@y8Er3`A4_81Pgqbs$DhNtuoSwokywB|X_tj?TZWeujjL+&kbNU=-3m!AvV znc@V=L4^lsGn-_p=~*YGHPMhOwJv9X0Ic#yW4% zq#u@KQAHtM^deAfZ82R8_CpglkSVs`HCqh5m7ylV>ePS|0w@P}yl)naZ zVWa9g75j|SbeN}ytJRuYcAZ+4X?piut+7&S)}?KnYw)0W6|YIdaqSCksoa8=ROi`f zctj@bOeFDat>(7a^+v63H(bYVZe^cp>FFm`Z`kLY3zD=>eOz@q?BkUeV|UH)KU)-^ zkj~_dY)Rh8p5u+|Gv3JN;*IPo-pHovjck1!cY@(Ziq9rzN9bMS*gNtPw2?yk8Zsk= zo@?m+DU~s}e0C$wr-20a@@0zH@MazfkK!@TH0d9{!xBfaB}aaS{-01#PGmi<5+WyC zWOkGY^3G0jUnH50FM@n)CwU-}%+3`--qT6m8A)b;iy-goB%6_Bw!sK;v6H+jlFW`7 zLB6Atd|M=$Z8d_N=_K!sB(wEKkb67H;UsCF^94NalPzY2WOZs}^cwoxsiv~T@Rr`8 z5Pp^r>*c>B*TrZ*JGbjc>PP&%A5TQR&#l|_BlRbKJ`nvrd$#LG>R0@HFxt<)?fQ}W z7e7x%`zdbMkK7;P=R?tc?%1v$xqrmZhok*uw(CdkFY)t{Xg{H=>gM?)_n-LT@4tNV z_KW?IIX1xiYi)GoGLng_qrXM=c_iakM}LFt{Mg7QM!YG7{U^uxuoC0HN6t*VjNU6S z#?8bg?hFtItRx`^tdyA)OzLG6uAs|InyCLO^`>NdLs)a`@1%$&L0?PZK z9y1>T9k+T3I&KxrUI7(+P_J1CflgR`1f8(@%{~G3`=CCvKL91Jvh3qtUkM-9b#)9u zv1@C13YU0D1KJsUlszVfqIL`)qb`mS?Jz!0DS=~J5l>S}VqV*WXDFqxjvM#{r8Iwe z{TDt-NyoGJ6Fx;LgRkH^K20f$OP9+X{rLa3cxynM&^P^Xg9^b^thedzDN{GQs_!eEtLzyP5q-SDfcqH9S2Bs-1 z<(X0~6YE8>4q0i>#8UBD>A*B?>7Ge%nOH!IHDhHw6Klt3WdhT2E9;rEEfXtBu})Yy z&%|Q#Svk+NJ33)6s*v~z8^=HJRXoptCGmHBjZ%y$_BVW;!Ho0!|2n=wDZwx0pW_8e zNq+mifNxStu@s)dwAB^@tf9^avq!S8SK`xi3Hkfg%|N~@S zrBD143lF}8(}lNh;vG_y918DJ@`T9mQS$yxysvOp$y1_VR`MZ{&nbCYuMV+{3PeyPOpeeWi^j4K>__|`w*_(Nh|Y~n}%1(IEsod5s; literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class b/sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class new file mode 100644 index 0000000000000000000000000000000000000000..cbe9958bd1f4f8be9236a4e835627b649b459e4a GIT binary patch literal 1201 zcmbW0ZEF)j5Xb+U#KtD4jcskMwOXHQlZuBTBBT^0AihWxOo{a6=DMa^bGygho==}j zL0eD|U;ClN*}J0#O(6JYZ)b1jH~*R4`T6VXcL4XXRY3v8GD;p!VTPf0$lq{($ko7q z-aiz9WtiEPO4=QU;%2>9#%YF))G4uY=m%N_i7`T1zjd;G%Hx9$k18mmIEyO0GR}B7 zi#dh|fe!tBX@&nmMb-~Bp|$a28Tqk@W2u$jwMOu;n^_&M_&^wjO8%R;44dug6f~WL za~|fgK=Px6s(F~lj+EHUXrm|fe~%pMyoV($6KWs`wJ`=YCa{bZhE*r{U0P>rD5+h$ zhO3wdmMUhL?aG1THZg)>Z_3)XMb*v*8)Xoqgc>f>&Z9{3#}%y8mpV$hGFFFJMLMfCKBKaA`v|p{ ze`6L1x0qtqGuIqLLAZwNDY}XqxJgMFO~pozenhsD;ic#!EdIcSk7O6%B)VdN<&?XW U`JHgRoLj)H)PEE8JfZ>o1_>@XH2?qr literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class new file mode 100644 index 0000000000000000000000000000000000000000..f990895a791feb0ffef462564545f8a5367030ac GIT binary patch literal 185 zcmZvWO$x#=5QSgrPt=tg7hb~I2;QI|2nszxj6tTfNl8XgkLJPycqlP-?P6x&J-&~5 zf1WP@YfLo?g^dj@omd<_d?(Zf&k`af?nt8Xsb!&xyF(1tr4(XmZ0_${jiJK4HdjN9 z@n_l}YiC7ctgz_Q+fR|n9Vc<#MTJ=vF44M@8>g`RCtdYqHYg18jPjevSLa<|@&(+1 BHQ@jN literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d31e0f6229c1f5c66014aec302f580308dda8e8b GIT binary patch literal 5027 zcmb_g>w6T{9ez)46E+h93AY4-f(i)EW7!Av80XLQ zq%ui?I@>srH5@lL+oxv)YI;2gS=UTz9Eet7IcgNFP_YuV0@ZV72`ZB%#>bodRUzQf z`6JEqhon8LRIHZ9tg;O!W2GG<3`h#BRk05BB*!&VhLz0&7U<|*0t3M^t!KDkeN<{+ zuVMolX-U#b2-Nmkc0zNKV>>6bUMrC>?5Ki!1lHyqGvwN4IT0BGB06EA$0Z^tzrfv|ySlAB3jhAr(9DFpY|(wehTLSxIfevC`VXp@IIV z>3D%cJ= z6}{-A@uzehGK4+RaH&JL$2;-oh~bGc*U(p!B+`8 zziQmjnPFPjka42h`&tQ|SWcd##7g#?n)O(_b_b&fCKaZc}4f|1`k^X8SA^HX85xl65xjt}D|k`GH}Ddpr7&BAuHt*bFPZ`mgoC#$sXGpfM&U}<*0an* z>2l5MI58_7%i1<8sMeMH+O0d|Y(){gEL-I(0=t&rtzvDD2#3r>no(ynZsL9}&33x> zP-+F0W+}~Ov80c7L4Qijo zEa+T{U5omTt;;jc=RKF_0!RLD>lSsPw6AMvs2A1aJEicbLq?jGqI}`AlEk+>U^sBO zfErL3w2O6~TV^|nce?b88bLYpn<5WQ>;bXkOl~hK75rk(5!m-E8~mYcS^^s}9g`8< znNC}*d?wF|0z3Sol96Y!FE`@>QNG^WuUBKz}SCqduhOP<2x1h-fqqA*<-U+-}#5;3jnNI;DJp=ns$Bc~RR^Xm+lM2n`H&|}WN(WnnjhVNC zwg%e_%gYJxBHU)!uu~>WvcdClb9lp|GWo3=ybDgDjsV7%5T}diVJ`~+?K5>A|HD}B z4`V5u&cj$8FIX8M*c3ugd^LlhJ;n(2?skzOD{IG$1E#Fk8y2Xy56YS+u&sE+yM}F8 z?wO3i&Y9vpiaj)nO}yZgK;T;_Lxa5M@YWfTcSnwWo8L?D9lrDWm3x1c@4Rhsu8L#4 zl=Aa6zG-|4KFhb=fVk!@eVw0j8WjI7Kcx~1;Cpz3Pl0oIlb>>NKT7#WiR(~WTBlK6 zio+L7M>p^(Iu2y zho6$@Qv8gPjDye6t>EVh?-}oMK>GX=p8}VW^34;6DXehp644*(Bg7-ToHwq-KQ1HE zxKgzGkGC$NTME>EZ5pG}tYd9u^<~o-<4+mo*HKqr9+;bGtEjK|1S_P$rW}^WNICLA&{)VEV-w{bUlV@;@!=7?O=rMA#G2P zxK6ZTFM80$nB9kGupiHoz!(WU$)oVQ9F-Jy(^lS~@g9CjGTYGX5m(N24R{|H$Pk&x z5qt?(@GG)aPExPp*JMm(^!^6F4G3P3iqFuX;HaqhTwaThd0Z#{i%3mV0pY*H@2N<} z)1&;Cp*b%Xhe9DKau@{ufIo7nzz6v7ZYqu}pyC>?dnzXJ(cM%$w}6U2(HRoO4cxq& ziqQpBOyd@pR^sDaZQAWI0W{WD-o*2hGQnPEf_-xmO72^oOcdcI%5w4!td+n0pq3@E P1h+jh|C}S6KhFIR1N?{F literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class new file mode 100644 index 0000000000000000000000000000000000000000..b090313aea7b7442d92a4d8d6e9214a4eb5525e9 GIT binary patch literal 502 zcmbVJu};G<5Iq;#Kq(XkBtD^C@WMpL0#c+(43Rpp9q|#litXTBDutE5V&DV#s0t^o zL?t2ymOJVB>AmN7Uz?9l0Jwp11U&(_sWVb(Ci!Lymd07l&dX94l0DkeXqKr_GEQ`H zM{AwZ+!=#bk&oa|!1)T-D08%#e0*L}$^u5O75RFOjJeB#!(`Fzp`1Z&C0W*7%dPlQ zD{}WOGMhdL7`Iy6x7fZo0T+8n!pK!A;IzoGPS_Kgxlsb%|7*GU`Av}1Hk{Io4HH-Slpb_W0H%S4Rf&c&j literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..5053b5ce245eb066801383f790b3b68b01b0d395 GIT binary patch literal 7088 zcmc&&d3;<|75;7}$;(V$wn>}z(U!KMfplY(oun-dX+l$yHgu9;0fpDeOFA^ObmpZC zqIJUsTtGx+aYt}L1&g6W0To3N(IW0EC@Lt5iVKQL{qDQ(&Aitcu<9TFe#yM|?sD$A z=X~Ee=iUdNyYn6ZCyC=Cs6t3XwT>Fp3N&AA?lfalW_mKVY3s#S!WO7ql}sn?H3Ff| zrDI{#A*>;yqaM1z8Hr3PHlDPt*d^(#9ZO|6GLwttli8S^Gt>E0(vBrkxY7wLGhwBxcPpDIv8qYq@IgcEg~gp&m{whU)-#QN-j#|F~2HEHFz z+Nn5A!|6J@&@Is7*vH|BJ3^o?nYPEwscCwhG#QY1TCHP^R8E3oM3N!PCF-#jJsQr` z(TjBgN0(e&$yfqS%FJU)Q&~}9w1STZ%AH)^;&;2dSW#?uJ^FE$hV?oIWEeQAOt0cl z?lo`Oo29)ZD9+X~h#~Hp5S8}xt*Zh^_tNtuZZ_!{#yJA@()#JVZKe~n)!YDH=-(3M zk4Id`h%}(%uyN_IF&*d1mN12^bI2$uvqi^wIA5S45C8;DQp%`s;xULk>GoT~YwuBk zfreO%m+E*KE@UuN0{e5BlxO|HN;18T_j+H9s7{3Ey& zq0rt#hYrcNSL=8UUd!l_wssTJ+;KJ6A@wiA>ovSV#~WpDV<}h+nf5kGl&$#)F2@xb z-mK#-cxzzHU?$C2sO^-YWYYx0Z0820x{B$to8jnkT&d$Kyq!##VoNFTY|!uy0i$I3 z6jPx&X~o>^TZea2`cPjy-g8!;G~T;)T#M_9Q16XfJ3OnM(7EA=09~3x%^Gooj`!fb z#dJKR6ewnhU^@2H3yva^-j5Gx_@Ist;l@BBtURH}eRrDzPgP=%aU|3Lxane1>`^x@U`q>fMFR$1g( zw!50Z>B==~4L3)Wo2pE??xkaO_%tKbz{atGkv0dk$r2Tt##n7w=1VopVbhngr&tU?*45!@bR0IJ%NQiy-oQ}`S zq*Z5URHt;s7j%3P_Z7=1xmy;&o*PzILa&!){5bGgzc}5o{FimykFPL3Fu!?H=li9) zGgY5s+piKZ9r><~{0iq+7Cm2+0qX0l%e?@qj8v+NCh?GtZ{T5Ccp{TanGAvf_qrB7 z-)ErbwHftZi*M=pHojA|OMKcngm^n}GrHeZfn@G(Dlm&q{GQ~-@bKV3Z_miUrj2#@ z0mE>7-7q8N=4qDhDOU0MM(PP+x@N$ZW<>Si}C2f%?rf7i*Tk@4GJkGhG@aMq_>y#%Xd0!DA zDif(o))O5)V?lqeDp$Vbz%}$lL!3!q`;eJ+q-Y|-15&A!^E{_~tO;Jf_zFF**L8^| z8tM1aWY-fVUuvQ`F#j-DX@VCm3(DsEokKJC?M_%(S#IPtG22x(X0sfQ4V$^VRqWQp z9D(+dw1G53U~;@CH#wbR1>zfL1jY?pR&F%SE1~3+jD*E;#r!})ynHG~ut)yi5lp$= zR|q^`Yz)+leyaxZS$TY^RhLg>Ut$~6i{%`ls`L3AkC63l?2-Az7Y`&?8;EfhhDE+M z86M+P;OF=SSK#ET#}Vcw55!i{ zRlDqVXftS7K7&^N8wJb{p-Ve}_APf{Nmrff?%-qT3|6Yg2{Sl_V^^&#;EWn{g^h3l zePm>v5uU+@bN6E-1*)N&)ninNji@doQou{9&{gkzb{O?WbpaP}S)HTHm64)ktI?pQ zHLC9pqtU1-;3CdzijGTtW-xIrn%KL&fQ-P+kn*OT_pWAlQgeR+ySa9Y`+WeHa-*+| z?w!G__TzOep(n;K+mAQR;BC=s3V2sFx}s|2^@bL`#%MO8hHf-*t1Sh*FAUFq9nlX* zZ!X}YRHoIaU178q@QDzN+FNP)YCOu{jcDcXDRkp$FnAf)j&9ytt-=siV-#ob{$VZl zq6b&(Pr%Vid#TLY(7x_yOfb*TeKDeu>AW*ZKAY zenoG~w_o!uh?0Jbr-&Lu4B&V8Jv6k7wfF;`Cb0X(eEboAB382e z{xf?c)bKI<13{TSc<2w8U|3nk@--YLJ2+iza zc_Ns!xR=$UN`!bJK8glWEo#szYH1ybSZ95qp-$AXWi_e}(R|JP)-X%Mr0?%)P4GIu zT|>Wo5%rpA@LrmL^_plA(&TmA<}A@B=5p<$#5_fTP#?E7m!>!{9pR|KdxbV&eLo|+S6zzbtpazNr&qTQ#Bi`@pJSrNd)uF)bC{#}T6 zc;IeTGCE!W+_x!k&r&0=HzLv72K_hHFfPJLQXVllq8O%iQ z9SO0=`rQC9xy=fOa>kwuDy1w^SQid`peHM0`ta zXg?l|@5jLczDc^a8DXO>F!Q_7?<>B|F~Td2If`##$+wWhxAV}(_fdYG%eO69$cxr> zI3H)@0>pVon!$xcv&pNd1a8DQZij{Yu#HE!?L_O8SimbglVM~hc8Hsi6SpES?&aO! zgP3->_q2jfk$VTp7R9}ToU6EZ&|#tE-a&_jl6wcq2+2M9CRs?_6NE?eO>^2LS0rQ~ zbeI`Nn<$8d4)+#P2g%HO-o9VqFjJ>~7l}m<_x6fmhnbDIO0031*~I&&t?h%KXQSS6vhmWmX@gawgv$*55SWE`b=AJu6yEumH-|KR8PLZRICgf=SVFarZ POK9^d^4m>=;#lBc?kN;b literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..08edb4b6b7e24999dd245c1288957faf37299533 GIT binary patch literal 9484 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..0f8843bd1423ab13c182014189b5d57508d3e137 GIT binary patch literal 212 zcmZurI|{-;6r2}7Q7c>V0^0Z*I}0lXK~N0X$90hn$!^@;1o3DV9>7D1iLta92Il*E zKb`>Q=!XahOJOoTD=+!3bI+O4${Wj07 z;xgtm))(HL5-B_(%o_(`JlWRr?c4c_uS%)?VtOPDB2!o)*D95S(Z7XRo$e9{t?D;G O)nEtRnjx$(K<@)C-aYjI literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class new file mode 100644 index 0000000000000000000000000000000000000000..52cf25d7824a15cd919949cb9c6eb770581967f8 GIT binary patch literal 9865 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 E2_e5*=Kufz literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..0bc3a8b6a6d78f8828d829d9a4abe70fcabce2bb GIT binary patch literal 2919 zcmbVOS$h*z7=BNZcG7fM3~O1m>}{YOps3Iw*bQ3R0@4}8;k%~o6)oRz<&_!f`Nq(gRXP*QPrFW5dYbIxs$X zs$U>EGG)%1M!~f6#+dI~c0R3yuGH}qk^-w}N=4ga)YNh31P+fphTSx`{-%zot79Mb3#_bHL?C9_ zla9cyM>(S!bEhVzWY#CT8V(3Nop)vp+hVpoLpQ9vhLlzVcfI3e9~mY!%vFZwj} z>lnZ>LQvJ=fg78$t~7ngETm~|Cu$|tsYyJ0F{on*Cj>N4+PU!362YS|8=!!nhKu_0&5--B+9&ti_(l0W#C#?mVC>xHJAchtB?=b zvu44{^|<*N70xwuS%HlzI)nJ_ce0BK5|EhGkk@fpRrFO=G%Gv=R+Ly7{V|^yjpp`fD(n=Yu2{z|1(NgZUSz>ZoY`wFJ#g_*S|fi;u__Lmtdq4`PIEXu2nJ8euz zb`)bWD8j}N+XbtIb)7W5Jkh|gJo*^Lbg3#Qu&mFqJ>Rtbj9HkG%&aprwr>?>#`3I* zg6y$v$2XM&Ji;0Vr&-x#Ve_0BH!IUBPn{eYtQfIu8Klj)Ne-&zI9aohFs!(rlPu0!Dd@e_{=e&8MxY_bJfo;X|h7wn73e^c)j67xsyudj};u>=JZg zIZj8-QV4DQaJCRWE)rv9?;Nv~A2zYXgd!@9T6O47l>!2(pt;lqp+`uiw=kQoULr;Bg*-#*c3bu6?c>InHp5apY5q|5>gMkw$QA zPThk@CAA;WbeGEruJW%$fXrjqglnAX0V(EiohyMGHEg0GoA0qAsio$zs-Dd@vfKVh zHgDi2FH;+lqNql)mb>TCGRogGC%?tE>3pxmMC!3VPF1VL>yLfvaE@D4&e5@*r1_}F4&fmmaG^Pu? z@HXBdhl~7f;a%?0ybwV(dk^o^_y%0U2c(No&Ut)@+tlDAQnn!S4@JZ@Bs6T$a8P5{ t5*lP9;`q1%|CTcNKvOdDBdqVRO@S}UHYi5}>&f{OjuCuX35L&re*sC~DD?mU literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d53111a265079d4b1173788181e7d7c6a4eadaeb GIT binary patch literal 3412 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..860549941298a491fc18a16b08947847a82163c3 GIT binary patch literal 270 zcmZvXy-ou`41~u4azI7FLqLNYy0nBJDF`V@>6bk#a&)_U>^djl(I|KT9tyFSbcn_p zS>u_{-#?#U0IqS;U_!X_DR8SM{1JQOkfK`3T(oD)E|#FiSzfnNj5YKf2Pws^g&!XG z;@-u!lic8taJF%SiQ^3_RLUM&9aYEy6;S)!@E^NkGZWu>j8`ED~? yjHz!sq~)GuK2-DUaz!|OPTTC|Ry!e_|6#fs52pmeLH!t@ig<+SsL<3o!SOG~C{wcl literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..95a4f14369ebe2c9147a3e544ebcbc3c5a2284c8 GIT binary patch literal 9256 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 Yi-K1K_bhp6FVBBQS{*(wJN^scZ`M0{M*si- literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f664228b4668c5580d18b08fe1758178585f2c80 GIT binary patch literal 3125 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 M7sFr6_dc>|;FSLUMQ9ok4sw3m?FT5)*$qn`MXD znQtG@+a16ZU4e)&Pffu`6(nD^4O|$lf^qDX<=_(S3l-Q&Z;kenSFy6Yuh=@1O7D#m zXcGEaQYM@y`ox<cI!%%_3AmC>9kfy=S*+P2JrrNvha?g*OF#^;ggiX}Z5NJ>3i=<2z6S_;LD)j=5jxMyn5U3p< z4I``x^iq@4NP9)|qV$v-){P~nOY&A0F4vx{a-}JpqTWE44@+`yO{$zTwwpNaOnrn{ z;MCX&xzg%lGPW{Tuf{%8qIeLExyRTy>al~CnVxgcB`Xn{0^OCLArM}fkrHV2b)jx& zd7|v2Ofs(Q^i3+Wp|rZ<%VOxCv=g}Luk8G{fOCO(U}iQ|*SfMj_;+0=RXX85A`UIU tIyN{%!H1(`++;=z4%Cl7Al|tUV2iPmffy~u=HgyQ8{5qIr;Gu1e*pu1nmqsj literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..05a660468d63144d35bf3297856e1223fe098f7f GIT binary patch literal 5488 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 Z@Dws6(Z$&`UNAO>8AinLvQ~~)z;AoYz+C_U literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class b/sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..872ec257226a30d4f0a71870e67d0947ee6be116 GIT binary patch literal 5212 zcmb_gX^>o175;87^LlyR^U{z&X9EHWvn5SPLSQC|nJrAhOcG`blab|3_sevLo_?L~ z*C7drAe$m6$RdJ*MiG~wtdk6hQBgrz+;K&%qRO9E`NyJ4h4|gK^z@L4P^DGL?fdR> z&UeoF&N(-E<=q#K16Yl}MBsy8K|nxJ>uwz1tt+7hT+mn-C~4Fdj# z#$g2^fsJW%B9+NmM(RMJXr(4h?wh4lIaf?otX#gF>dK89Woy7F?KMj66)S5LtXx{R za%Q2&$QO-L2oZ|w>sk|mikO19ih5`Q3vBIWBV8%wto^Azqg>X<4M&h@w9-GRF5NOBSPZ`$mZ&%v=LsmZZZJ1N%joAV z3YK}I?JNCyA!ANNuvA`JibfSp@=~Z^?6Z2!!nlGKfivFgkd8_&pD{`iG|L#LJP>wx z<*f)-V5Nk5p+KNvOXILySgm3WE~0G9bPN(Wy}|XYebaTelzOp>OVCP==*6N@$OtSy zbyRBZy13e;h}F_x>s4&Php3ZI=-6)=Wr?S8v_tZvT}1~vsUu^vij#)X4tq~Qw~9@; zl+>_;;=!FK51h=75H|C&!=@-ML$8896H&`L*}fv+d{aUM4|ZnL=*!UR4}As7&`=(orG#u2?A=_u(sPB_nS>7$ zzURt?4)z&-bN1R~A{7Kqn`U|UzO+%4WhH_l_9!T+D1#+y$+)>URmhdCRN5>Vsm%qt zrJ(1#OC__^!%WIcFV$!5SyhI>nYDhauG@O|3Y<4>Le}Akqynuy;8r%tn-EwUVly_P zIDqRF+@RtkxKSWEEoRyi^lh2A!=%6Gh*M|MY`%%2f}2#_Y$qCtx-IH)e0UIm^vy1n<(ZT*`Ed-?c$5_L9zCv=wy^8~#J>7lXEKHqdhU@jcxq`8^GBIY92KBK#R}#HuTF(#b zrJVeB7Xwx{M_3)b|7*`|6NpqfSyph!tq-Ycx7%tCRMOdYF9WNG>G>T0GMs{m>l^K0 ziz%7}CDJr^z|zy#_UT0%uOd5KAj8~e_i?;a?N|g5u=`BAJGIr}g!n8d0{td(E$g4NGSw6!Wt&tXndnZ&wDY-|lBLr2i%0F$OI z;fn^ig5wAw?ZiBcViB>l;YvF7Dh%Qp+q@pz1v_2WhtN+)PZDnoeK?FG#6ORLn!*co z!y>H5QLY6k;dC4$85GK?!*}SA5bqqvcU?>WL01K-f4Di(GleZaNb3^YmrtSJ56-S2 zId*y+eXYU;s-X(hFy=)2K*2|vNaCl zCA>_J$hFI9z26Ra7{0gBr(mLvhklHoI4ZjK9HT@Fj$j0dMa%uGMkxF ztznxLA(s`AWQ43}jZ)fYDNS|7B*WGFb?((zQhf=Fz5Q5qU-kA+-imr#wn|>HiRh|~ zQ{}@{S)Yt2>nHJrL-d-HbXT!#0M|2OHz2|1<9ysmw%){8-OM!OyAHSU-%Yo(MBKsh za2F$YHzRisPu|Pj`?zvHWA^|K;Xy{@A-u(>)!*?j-o_(1fk*AQ9&}vq#gN(f3SN~l z}Upv;;;A_cZ0<63+By1vSR}S`g49M#PJAz$+ZyCJcM6y z7AB@UZT3fq>=yi*Yf<969&d1_63I3A4QDZ8)9_o);zSrCiw^R?24u15MeyH9D5$)H zq+}F}qkrwx` zAU?{H_&AHovn(qwu#CLO;QxuVeT$Xi9lRpW#H(T%UK7jlx>!Rx%8ql$30#%D>#O8l zk3Wz)B(GTMkyo7SkykA6$V-xY$P1&&tk58qzLi_&7gGe3d literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class b/sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..ff2a46e1d11298183863cf81943aa7e9536da321 GIT binary patch literal 3274 zcmbVOYjYD-7=BKYc9V1qr8g+|JH0_bK%l8esZo=?ix^ru5!pF#RFB&Ni9NbD zs9Rwu2uqX-fx5<62`8@uEfBDXDzMl^ zqHbO>+7v4xY%=57l%BSu3Tg#rj9=J164!_Aq?rz(9#a)eQ_+Cw0!!j%Dl(X~^~mY; zupLR6^w6{-ndERJYbT9Nq(5csXie&;*N>D{ZMK3@snSkPdfi73E z0#6Aj_zs|0Esu?%vg!?Ltfv1G;$V3<1RE(-*iSxaL^S#M*kx4Uv8bl^D!8&zz=X6{i!D5%h# zAuZGGxWmdnAT744*oN&a&h!Lc=KF=ExPxAnV%t%0MLO7}qPq~OZY`yUu?xEu>`~E! z-Z9;m?;3WWemtug48xe7a`$RFpkN;}Sz^CU%M5jC!(r@|5shNMiUShauMG}Xpc7s4 z@w|!`B#R*PwNEp$dIb(cQ!t<+4mMq736EGb9?mkTYrPfW67VFsKxw>4I(|e&LZ)i6 zTVRDKhuN1&6-RMQAY?Fk-R7W7`kF>hn->b$16>#@dC}O)NU2D}Wa#K~hru3haG5)5 z8%@LDT;oiLHXR7#I4lJj6*jU0Qy*>FEn1vabc);_~*r!=Z`Rxh=_E3_JH^m-vG;xFAux4d+jw%5`*jb*C z6((bG08-sQA~mbWN0CT_?j&XFPJlvVUq&`l-u98n&(%;y8_CaSfoUE9?}(>bWsj}J zkFlm)pVvK6mYq|{O*{$dDfXFXuR@j3QCs884i$$8o5!P9Y)BFcq@5H6<&W$~HoYuD zr|PR7tu3m{MdGJqS4{S-(|~BT9!a6VDXx#1-gKWDE~I>`M_&%EcF#8v-A}LEc?Hk$ z99_>po@XA*JkkUM$kANw(R}kBEF zPssv~*hLPjRoryvk`bm zxPXFP3Kl9*6zQUZn#$m2h4>*J^6$DHo}sm$HgiPtHI#|#&7|GrLzifE-Du4rBHe&X zzuF zV=e9yK%vT2m&qNhWSm!bHRtfOK(}ZMEX^?yXe(^iZOwk z*m(&nL_^>j>h54KA^O?^tui_NKJ+yN8p?Ax$diOWhXitX(T~2-hdP-@tfukp3q6yM-0GjVbNK8tkAXCQoZ#3%YR# zyJ4XhS@bcf{Y=7sT;Q?(Jr3duS7kBoVR@|KdH(^+2^!wrerdt{>7sH7e)Oqi~5(SFEbTk**qj# zIdkO{67NI&e^{ZPcz`wqo%d09AHD~&zB(4+D;oLmHR*p-Y`%Fc0QoOeU4I+HKch}I Qpzt(cHNU>4%!kYW0`KB9T>t<8 literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class b/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class new file mode 100644 index 0000000000000000000000000000000000000000..b84803c7ad1ff8514675e6294731a1c0c7fe1472 GIT binary patch literal 4487 zcmb7HYjYe&6+N@BnceM`R&pd~i2^cFV!fQjL6BtD7RXu0NJx%j8$-e?>(wBQz1m%` zMur4J$P1DX9^si6`IN$6T$QA-p;k6tRNSa6~q>(XDJXgC|D>rJ*weo#u&pCC^K<1F!biH{4$;qiR zSy;%L$SLHZ3{2Ns8|78kbIOl2+g^F2MP#c}-gMjLi>-3ix#-rNg+{Hjai(R!TJ`&j zs|JRbyYD&Wb=>A!MJf*{3`$v5lbjPBx7Bey2@EL=OCawDRvd4=wJQD_6h_3K_5G*a z4M)6t6>b!7(f3xJ&3eaedv2>K!4D|hgfXTxTFo`r+gf!D7*&aUP~k%ou^Khc4~TQ0 z!iOVoc)0E4=$%lw6}J&uuQiWe*s3)Qj7&!6q`9k1Jt*Kwg(*yPR%?#8+{nY`XB!-vNrv0C4z2WLwK}yZ1@BP!s1(dg!CcDian|XauKD5|UT)QEjWe~5EB(Nk^4480)9mu@&xQ)ex9NCY&Gu}jkZ&&9AW>0W zlF`tkDdoIEhww=*!)}C34T@|OEMvy&$Xib0GJvDt# z;gnaapI@o9gY{0IIJvlTlmsnu!*ra@tp+cR+{BJh8Cl|SI}yrH>@G`%iQc&@-4ExO z(_KBAA>HX2a0u{+mOItj>eQWkT{$_2wVW38^>e!%2-wFnC&7zPp1i2bZwtTW-Qc&p4%m)>D~}AH7uYMaHQ1)7ufcfBhjsXrFrC=sQw6q%E%ppK zsrl?pz5?@21{3He=VOz3NXH}>`jd;X$vnkll8gPxqp`_6=VOxh^e5jGo6Nf)CV8|! zc|10mcj!)Xf|js-1*JFo2)i{lnfGN(^3DCp)3M3CqIQzQb-se}{$ZD6lP}_{L9)$- z74c=JXRgAGSIMYGK&wO)Br=tkel5OEVYhWe=2GY3_&UYi){$)@bsmYYvuC$;WSdEy zugBLJ-EAG&rc&n{c$Ciz22KNcWLaO<^Q)a^OA(w zKgj;UNPq4)9dmZ-z#ow>rQX5NC8z_X)Hd!4D^%<>Ar(7QN((0Q4u&tGP)e6F5zxGC z5;SjHB~w6F05VHf1himh30kmorL2H*0VrF_ML<-II~yQ=h#rYTm+KWsKolc$}<`7$%d!;RX^{$D0X&fg|l zGq{_roH=O`i;xq&TQoWP$VrFfaJo-$Xd*p+UF$N5*Xb=V``u#YQ0lM<>}@O^87o%S z_Z7z<-S^}(4~dfsTe>qX-qAGOqv^muXPe>_kyyoA@rD?g-mLKGLX#^OcO=HhY20WV4XjZ6Om z`AFk0T>KZvWC4G|kMR?V<`(=4Kc$t%U3d*YBY*rALP7nUmW3wP@gl7(WwL^oXyx!a z?!e2m^7tM0;uTs-#9-J^?^8P&6P975QWO9T<9)7a)RPd`2+S_1i|ca+P^$;pMPKg^ z68IxO9Do*KHzzg}q~&7Lx|#ni8YJiAle_u<1Hcko8~$?9iY2#6T0r|ZIQhUeoF4wn zHa<&@&aoN(ytXT1e^J}>Vt-lN3u4!_T@|~o?fu(uhS#-yQ0#NsJ|>t3AKPg5e-uPN P{@Q_-47}>^#9#aeDDE`a literal 0 HcmV?d00001 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class b/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class new file mode 100644 index 0000000000000000000000000000000000000000..3a0162a06b7221ed2966d14f7511b8fb9b1a77b9 GIT binary patch literal 9902 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 literal 0 HcmV?d00001 diff --git a/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml b/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml new file mode 100644 index 0000000..c43f856 --- /dev/null +++ b/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + dvc.channel_id, dvc.channel_code, dvc.channel_name, dvc.address, dvc.camera_type, dvc.ptz_control, dvc.status, dvc.remark + + + + + + + + + + + + + + diff --git a/sip/target/classes/mapper/iot/DeviceVideoMapper.xml b/sip/target/classes/mapper/iot/DeviceVideoMapper.xml new file mode 100644 index 0000000..b0820c3 --- /dev/null +++ b/sip/target/classes/mapper/iot/DeviceVideoMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + dv.video_id, dv.video_code, dv.video_name, dv.transport, dv.stream_mode, dv.channel_count, dv.status, dv.register_time, + dv.keepalive_time, dv.channel_count, dv.ip, dv.port,dv.host_address, dv.manufacturer, dv.remark, dv.create_time + + + + + + diff --git a/sip/target/classes/mapper/iot/IpConfigMapper.xml b/sip/target/classes/mapper/iot/IpConfigMapper.xml new file mode 100644 index 0000000..339afe7 --- /dev/null +++ b/sip/target/classes/mapper/iot/IpConfigMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + ic.config_id, ic.ip + + + + + diff --git a/web/pom.xml b/web/pom.xml new file mode 100644 index 0000000..5d1f8d1 --- /dev/null +++ b/web/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + web + 1.0.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + com.dite.znpt + sip + 1.0.0-SNAPSHOT + + + com.dite.znpt + core + 1.0.0-SNAPSHOT + + + \ No newline at end of file diff --git a/demo/src/main/java/com/dite/znpt/DiteApplication.java b/web/src/main/java/com/dite/znpt/web/DiteApplication.java similarity index 81% rename from demo/src/main/java/com/dite/znpt/DiteApplication.java rename to web/src/main/java/com/dite/znpt/web/DiteApplication.java index 1ec3ff9..389c47b 100644 --- a/demo/src/main/java/com/dite/znpt/DiteApplication.java +++ b/web/src/main/java/com/dite/znpt/web/DiteApplication.java @@ -1,4 +1,4 @@ -package com.dite.znpt; +package com.dite.znpt.web; import cn.hutool.extra.spring.EnableSpringUtil; import org.mybatis.spring.annotation.MapperScan; @@ -7,7 +7,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@MapperScan("com.dite.znpt.mapper") +@MapperScan("com.dite.**.mapper") +@ComponentScan(basePackages = {"com.dite"}) @EnableSpringUtil public class DiteApplication { diff --git a/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java b/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java rename to web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java index a6d62ec..ce423da 100644 --- a/demo/src/main/java/com/dite/znpt/controller/CombinedDictController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/CrewController.java b/web/src/main/java/com/dite/znpt/web/controller/CrewController.java similarity index 95% rename from demo/src/main/java/com/dite/znpt/controller/CrewController.java rename to web/src/main/java/com/dite/znpt/web/controller/CrewController.java index c680255..1c0cd48 100644 --- a/demo/src/main/java/com/dite/znpt/controller/CrewController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CrewController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/DefectController.java rename to web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 0084607..57c4ee5 100644 --- a/demo/src/main/java/com/dite/znpt/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/FileInfoController.java rename to web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java index e4e4895..fa40594 100644 --- a/demo/src/main/java/com/dite/znpt/controller/FileInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/PartController.java b/web/src/main/java/com/dite/znpt/web/controller/PartController.java similarity index 95% rename from demo/src/main/java/com/dite/znpt/controller/PartController.java rename to web/src/main/java/com/dite/znpt/web/controller/PartController.java index a184d3a..03c77c0 100644 --- a/demo/src/main/java/com/dite/znpt/controller/PartController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PartController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java b/web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/PersonnelController.java rename to web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java index 08d8e6d..6b83171 100644 --- a/demo/src/main/java/com/dite/znpt/controller/PersonnelController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java rename to web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java index 0e87f7d..1cbbc4e 100644 --- a/demo/src/main/java/com/dite/znpt/controller/ProjectCompanyController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/ProjectController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/ProjectController.java rename to web/src/main/java/com/dite/znpt/web/controller/ProjectController.java index 732fb54..801ecf4 100644 --- a/demo/src/main/java/com/dite/znpt/controller/ProjectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java b/web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/TCompanyController.java rename to web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java index 93cebab..b2f89af 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TCompanyController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/TConstructionController.java rename to web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java index 6c34d6e..75b240d 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TConstructionController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/java/com/dite/znpt/controller/TurbineController.java b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/TurbineController.java rename to web/src/main/java/com/dite/znpt/web/controller/TurbineController.java index 11365b0..b35f20f 100644 --- a/demo/src/main/java/com/dite/znpt/controller/TurbineController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java new file mode 100644 index 0000000..b732b96 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java @@ -0,0 +1,189 @@ +package com.dite.znpt.web.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.monitor.constant.IotRespMessage; +import com.dite.znpt.monitor.constant.dict.DeviceStatus; +import com.dite.znpt.monitor.constant.dict.SipTransferMode; +import com.dite.znpt.monitor.constant.dict.StreamTransferMode; +import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; +import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; +import com.dite.znpt.monitor.domain.resp.DeviceVideoResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; +import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; +import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; +import com.dite.znpt.monitor.service.DeviceVideoChannelService; +import com.dite.znpt.monitor.service.DeviceVideoService; +import com.dite.znpt.monitor.service.IpConfigService; +import com.dite.znpt.monitor.sip.config.SipConfig; +import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; +import com.dite.znpt.monitor.utils.DictUtils; +import com.dite.znpt.util.PageUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * @Author: huise23 + * @Date: 2022/8/8 10:39 + * @Description: + */ +@Api(tags = "视频管理") +@RestController +@RequestMapping("/monitoring/video") +public class VideoController { + + @Resource + private SipConfig sipConfig; + + @Resource + private StreamMediaServerConfig streamMediaServerConfigService; + + @Resource + private DeviceVideoService deviceVideoService; + + @Resource + private IpConfigService ipConfigService; + + @Resource + private DeviceVideoChannelService deviceVideoChannelService; + + @Resource + private ISipDeviceCommander sipDeviceCommander; + + @ApiOperation(value = "获取信令服务器配置信息", notes = "iot:video:sip:view", httpMethod = "GET") + @GetMapping("/sipServerConfig") + public Result getSipServerConfig(){ + return Result.ok(sipConfig); + } + + @ApiOperation(value = "获取流媒体服务配置信息", notes = "iot:video:media:view", httpMethod = "GET") + @GetMapping("/streamMediaServerConfig") + public Result getStreamMediaServerConfig(){ + //streamMediaServerConfigService.getStreamMediaServerConfig() + return Result.ok(streamMediaServerConfigService); + } + + @ApiOperation(value = "查询监控IP配置列表", notes = "iot:config:list", httpMethod = "GET") + @GetMapping("/config/list") + public Result> configList(){ + PageUtil.startPage(); + return Result.ok(ipConfigService.configList()); + } + + @ApiOperation(value = "配置监控IP列表,每次全量传ip列表", notes = "iot:config:add", httpMethod = "POST") + @PostMapping("/config/add") + public Result configAdd(@RequestBody MonitorConfigAddReq req){ + ipConfigService.configAdd(req); + return Result.ok(); + } + + @ApiOperation(value = "分页查询视频设备列表", notes = "iot:video:list", httpMethod = "GET") + @GetMapping("/device/page") + public PageResult pageDevice( + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "hostAddress", required = false) String hostAddress){ + PageUtil.startPage(); + return deviceVideoService.selectDeviceVideoList(status, keyword,hostAddress); + } + + @ApiOperation(value = "查看视频设备数量", notes = "iot:video:list", httpMethod = "GET") + @GetMapping("/device/count") + public Result countDevice(){ + return Result.ok(deviceVideoService.countDeviceVideoNum()); + } + + @ApiOperation(value = "查看视频设备详情", notes = "iot:video:view", httpMethod = "GET") + @GetMapping("/device/{videoId}") + public Result viewDevice(@PathVariable("videoId") Long videoId){ + final DeviceVideoEntity entity = deviceVideoService.getById(videoId); + final DeviceVideoResp resp = BeanUtil.copyProperties(entity, DeviceVideoResp.class); + resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); + resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); + resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); + return Result.ok(resp); + } + + @ApiOperation(value = "编辑视频设备", notes = "iot:video:edit", httpMethod = "PUT") + @PutMapping("/device/{videoId}") + public Result editDevice(@PathVariable("videoId") Long videoId, @RequestBody DeviceVideoEditReq req){ + deviceVideoService.editDeviceVideo(videoId, req); + return Result.ok(); + } + + @ApiOperation(value = "更新视频设备", notes = "iot:video:sync", httpMethod = "PUT") + @PutMapping("/device/sync/{videoId}") + public Result syncDevice(@PathVariable("videoId") Long videoId){ + DeviceVideoEntity entity = deviceVideoService.getById(videoId); + if(DeviceStatus.ONLINE.getValue().equals(entity.getStatus())){ + sipDeviceCommander.queryCatalog(entity); + return Result.ok(); + }else { + return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_SYNC); + } + } + + @ApiOperation(value = "删除视频设备", notes = "iot:video:delete", httpMethod = "DELETE") + @DeleteMapping("/device/{videoId}") + public Result deleteDevice(@PathVariable("videoId") Long videoId){ + return deviceVideoService.removeByVideoId(videoId); + } + + @ApiOperation(value = "分页查询视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") + @GetMapping("/channel/page/{videoId}") + public PageResult pageChannel(@PathVariable("videoId") Long videoId, @RequestParam(value = "keyword", required = false) String keyword){ + return deviceVideoChannelService.selectDeviceVideoChannel(videoId, keyword); + } + + @ApiOperation(value = "分页查询所有视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") + @GetMapping("/channel/page") + public PageResult pageAllChannel(@RequestParam(value = "keyword", required = false) String keyword){ + return deviceVideoChannelService.selectAllDeviceVideoChannel(keyword); + } + + @ApiOperation(value = "查看视频通道", notes = "iot:video:channel:view", httpMethod = "GET") + @GetMapping("/channel/{channelCode}") + public Result viewChannel(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.getDeviceVideoChannelDetail(channelCode)); + } + + @ApiOperation(value = "编辑视频通道", notes = "iot:video:channel:edit", httpMethod = "PUT") + @PutMapping("/channel/{channelId}") + public Result editChannel(@PathVariable("channelId") Long channelId, @RequestBody DeviceVideoChannelEditReq req){ + deviceVideoChannelService.editDeviceVideoChannel(channelId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除视频通道", notes = "iot:video:channel:delete", httpMethod = "DELETE") + @DeleteMapping("/channel/{channelId}") + public Result deleteChannel(@PathVariable("channelId") Long channelId){ + return deviceVideoChannelService.removeByChannelIds(Arrays.asList(channelId)); + } + + @ApiOperation(value = "播放直播视频", notes = "iot:video:play", httpMethod = "GET") + @GetMapping("/play/live/{channelCode}") + public Result play(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.play(channelCode)); + } + + @ApiOperation(value = "查询视频设备是否在线", notes = "iot:video:isOnline", httpMethod = "GET") + @GetMapping("/channel/isOnline/{channelCode}") + public Result isOnline(@PathVariable("channelCode") String channelCode){ + return Result.ok(deviceVideoChannelService.isOnline(channelCode)); + } + + @ApiOperation(value = "停止播放直播", notes = "iot:video:stop", httpMethod = "GET") + @GetMapping("/stop/live/{channelCode}") + public Result stop(@PathVariable("channelCode") String channelCode){ + deviceVideoChannelService.stop(channelCode); + return Result.ok(); + } +} diff --git a/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java similarity index 98% rename from demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java rename to web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java index 21e8b41..448b17d 100644 --- a/demo/src/main/java/com/dite/znpt/controller/WeatherTypeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java @@ -1,4 +1,4 @@ -package com.dite.znpt.controller; +package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; diff --git a/demo/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml similarity index 68% rename from demo/src/main/resources/application-dev.yml rename to web/src/main/resources/application-dev.yml index 260c407..adf1b31 100644 --- a/demo/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -52,28 +52,18 @@ spring: config: multi-statement-allow: true # redis 配置 -# redis: -# # 地址 -# host: 10.20.32.11 -# # 端口,默认为6379 -# port: 1179 -# # 数据库索引 -# database: 3 -# # 密码 -# password: 123456 -# # 连接超时时间 -# timeout: 10s -# lettuce: -# pool: -# # 连接池中的最小空闲连接 -# min-idle: 0 -# # 连接池中的最大空闲连接 -# max-idle: 8 -# # 连接池的最大数据库连接数 -# max-active: 8 -# # #连接池最大阻塞等待时间(使用负值表示没有限制) -# max-wait: -1ms -# + redis: + pool: + max-active: 3000 + max-idle: 1000 + max-wait: 3000 + host: 39.99.201.243 + port: 6379 + password: yfeng@123 + timeout: 3000 +# 0 gaea系统,3 gaea-dev/gaea-test系统,4 znpt开发,5 znpt测试 6 znpt生产 + database: 4 + ## MINIO配置 #minio: # url: http://10.20.32.11:9000 @@ -87,3 +77,37 @@ spring: # bucket: pub # domain: # prefix: /minio/ + +sip-config: + name: 信令服务 + ip: 10.17.12.203 + port: 1074 + charset: gb2312 + domain: 3402000000 + id: 34020000002000000001 + password: 123456 + mediaType: mp4 + +zlm-config: + # 流媒体名称 + mediaName: 媒体服务 + # 流媒体服务商 + mediaService: ZLMdia + # 公网ip + publicHost: + # 接口ip + apiHost: 10.17.12.203 + # 接口端口 + apiPort: 30186 + # 密钥 + secretKey: JvVotkdN01y4qZHlrJsdq4gD7n9rK6wV + # 流id前缀 + streamPrefix: + # rtp ip + rtpHost: 10.17.12.203 + # rtp 端口 + rtpPort: 30186 + # 动态端口起始值 + dynamicPortStart: 30150 + # 动态端口结束值 + dynamicPortEnd: 30185 diff --git a/demo/src/main/resources/application.yml b/web/src/main/resources/application.yml similarity index 82% rename from demo/src/main/resources/application.yml rename to web/src/main/resources/application.yml index a3a9199..83993b1 100644 --- a/demo/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -18,3 +18,6 @@ spring: mvc: pathmatch: matching-strategy: ant_path_matcher + main: + allow-circular-references: true + allow-bean-definition-overriding: true \ No newline at end of file diff --git a/web/src/main/resources/logback.xml b/web/src/main/resources/logback.xml new file mode 100644 index 0000000..5f99223 --- /dev/null +++ b/web/src/main/resources/logback.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.%i.log + + 7 + 10mb + 200mb + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.%i.log + + 7 + 10mb + 300mb + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.%i.log + + 7 + 10mb + 500mb + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + From 2031d81029253927c901a547f0a407b68a964d12 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Apr 2025 09:19:27 +0800 Subject: [PATCH 005/143] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=BB=93=E6=9E=84=202.=E8=A7=86=E9=A2=91=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + {demo => core}/pom.xml | 6 ++ .../com/dite/znpt/aspect/HttpLogAspect.java | 0 .../znpt/config/BeanPostProcessorConfig.java | 0 .../config/FastJson2JsonRedisSerializer.java | 52 +++++++++++++++ .../dite/znpt/config/GlobalCorsConfig.java | 0 .../com/dite/znpt/config/JacksonConfig.java | 0 .../com/dite/znpt/config/RedisConfig.java | 63 ++++++++++++++++++ .../dite/znpt/config/SaTokenConfigure.java | 0 .../com/dite/znpt/config/SwaggerConfig.java | 0 .../com/dite/znpt/config/WebMvcConfig.java | 0 .../com/dite/znpt/domain/AuditableEntity.java | 0 .../java/com/dite/znpt/domain/Constants.java | 0 .../java/com/dite/znpt/domain/PageResult.java | 0 .../java/com/dite/znpt/domain/Result.java | 0 .../domain/entity/CombinedDictEntity.java | 0 .../dite/znpt/domain/entity/CrewEntity.java | 0 .../dite/znpt/domain/entity/DefectEntity.java | 0 .../znpt/domain/entity/FileInfoEntity.java | 0 .../dite/znpt/domain/entity/PartEntity.java | 0 .../znpt/domain/entity/PersonnelEntity.java | 0 .../domain/entity/ProjectCompanyEntity.java | 0 .../znpt/domain/entity/ProjectEntity.java | 0 .../znpt/domain/entity/TCompanyEntity.java | 0 .../domain/entity/TConstructionEntity.java | 0 .../znpt/domain/entity/TurbineEntity.java | 0 .../znpt/domain/entity/WeatherTypeEntity.java | 0 .../com/dite/znpt/domain/page/PageDomain.java | 0 .../dite/znpt/domain/page/TableSupport.java | 0 .../znpt/domain/vo/CombinedDictListReq.java | 0 .../dite/znpt/domain/vo/CombinedDictResp.java | 0 .../com/dite/znpt/domain/vo/CrewListReq.java | 0 .../com/dite/znpt/domain/vo/CrewResp.java | 0 .../dite/znpt/domain/vo/DefectListReq.java | 0 .../com/dite/znpt/domain/vo/DefectResp.java | 0 .../dite/znpt/domain/vo/FileInfoListReq.java | 0 .../com/dite/znpt/domain/vo/FileInfoResp.java | 0 .../com/dite/znpt/domain/vo/PartListReq.java | 0 .../com/dite/znpt/domain/vo/PartResp.java | 0 .../dite/znpt/domain/vo/PersonnelListReq.java | 0 .../dite/znpt/domain/vo/PersonnelResp.java | 0 .../znpt/domain/vo/ProjectCompanyListReq.java | 0 .../znpt/domain/vo/ProjectCompanyResp.java | 0 .../dite/znpt/domain/vo/ProjectListReq.java | 0 .../com/dite/znpt/domain/vo/ProjectResp.java | 0 .../dite/znpt/domain/vo/TCompanyListReq.java | 0 .../com/dite/znpt/domain/vo/TCompanyResp.java | 0 .../znpt/domain/vo/TConstructionListReq.java | 0 .../znpt/domain/vo/TConstructionResp.java | 0 .../dite/znpt/domain/vo/TurbineListReq.java | 0 .../com/dite/znpt/domain/vo/TurbineResp.java | 0 .../znpt/domain/vo/WeatherTypeListReq.java | 0 .../dite/znpt/domain/vo/WeatherTypeResp.java | 0 .../RestResponseEntityExceptionHandler.java | 0 .../dite/znpt/exception/ServiceException.java | 0 .../dite/znpt/mapper/CombinedDictMapper.java | 0 .../java/com/dite/znpt/mapper/CrewMapper.java | 0 .../com/dite/znpt/mapper/DefectMapper.java | 0 .../com/dite/znpt/mapper/FileInfoMapper.java | 0 .../java/com/dite/znpt/mapper/PartMapper.java | 0 .../com/dite/znpt/mapper/PersonnelMapper.java | 0 .../znpt/mapper/ProjectCompanyMapper.java | 0 .../com/dite/znpt/mapper/ProjectMapper.java | 0 .../com/dite/znpt/mapper/TCompanyMapper.java | 0 .../dite/znpt/mapper/TConstructionMapper.java | 0 .../com/dite/znpt/mapper/TurbineMapper.java | 0 .../dite/znpt/mapper/WeatherTypeMapper.java | 0 .../znpt/service/CombinedDictService.java | 0 .../com/dite/znpt/service/CrewService.java | 0 .../com/dite/znpt/service/DefectService.java | 0 .../dite/znpt/service/FileInfoService.java | 0 .../com/dite/znpt/service/PartService.java | 0 .../dite/znpt/service/PersonnelService.java | 0 .../znpt/service/ProjectCompanyService.java | 0 .../com/dite/znpt/service/ProjectService.java | 0 .../com/dite/znpt/service/RedisService.java | 7 ++ .../dite/znpt/service/TCompanyService.java | 0 .../znpt/service/TConstructionService.java | 0 .../com/dite/znpt/service/TurbineService.java | 0 .../dite/znpt/service/WeatherTypeService.java | 0 .../service/impl/CombinedDictServiceImpl.java | 0 .../znpt/service/impl/CrewServiceImpl.java | 0 .../znpt/service/impl/DefectServiceImpl.java | 0 .../service/impl/FileInfoServiceImpl.java | 0 .../znpt/service/impl/PartServiceImpl.java | 0 .../service/impl/PersonnelServiceImpl.java | 0 .../impl/ProjectCompanyServiceImpl.java | 0 .../znpt/service/impl/ProjectServiceImpl.java | 0 .../service/impl/TCompanyServiceImpl.java | 0 .../impl/TConstructionServiceImpl.java | 0 .../znpt/service/impl/TurbineServiceImpl.java | 0 .../service/impl/WeatherTypeServiceImpl.java | 0 .../java/com/dite/znpt/util/PageUtil.java | 0 .../java/com/dite/znpt/util/PasswordUtil.java | 0 .../main/java/com/dite/znpt/util/SqlUtil.java | 0 .../resources/mapper/CombinedDictMapper.xml | 0 .../src/main/resources/mapper/CrewMapper.xml | 0 .../main/resources/mapper/DefectMapper.xml | 0 .../main/resources/mapper/FileInfoMapper.xml | 0 .../src/main/resources/mapper/PartMapper.xml | 0 .../main/resources/mapper/PersonnelMapper.xml | 0 .../resources/mapper/ProjectCompanyMapper.xml | 0 .../main/resources/mapper/ProjectMapper.xml | 0 .../main/resources/mapper/TCompanyMapper.xml | 0 .../resources/mapper/TConstructionMapper.xml | 0 .../main/resources/mapper/TurbineMapper.xml | 0 .../resources/mapper/WeatherTypeMapper.xml | 0 .../example/demo/DiteApplicationTests.java | 13 ---- pom.xml | 2 +- sip/pom.xml | 5 -- .../media/zlm/cache/MediaServerCache.java | 2 - .../znpt/monitor/media/zlm/dto/MediaItem.java | 1 + .../monitor/media/zlm/dto/ServerItem.java | 2 + .../monitor/media/zlm/dto/resp/MediaResp.java | 5 +- .../media/zlm/dto/resp/OriginSock.java | 6 +- .../monitor/media/zlm/dto/resp/Track.java | 5 +- .../monitor/media/zlm/impl/ZlmApiImpl.java | 10 ++- .../com/dite/znpt/monitor/sip/SipLayer.java | 10 +-- .../media/zlm/cache/MediaServerCache.class | Bin 1947 -> 0 bytes .../monitor/media/zlm/dto/MediaItem.class | Bin 12581 -> 0 bytes .../monitor/media/zlm/dto/ServerItem.class | Bin 9053 -> 0 bytes .../media/zlm/dto/resp/MediaResp.class | Bin 6433 -> 0 bytes .../media/zlm/dto/resp/OriginSock.class | Bin 3501 -> 0 bytes .../monitor/media/zlm/dto/resp/Track.class | Bin 5811 -> 0 bytes .../monitor/media/zlm/impl/ZlmApiImpl.class | Bin 13644 -> 0 bytes .../com/dite/znpt/monitor/sip/SipLayer.class | Bin 4231 -> 0 bytes .../znpt/web/controller/VideoController.java | 5 +- 127 files changed, 153 insertions(+), 42 deletions(-) rename {demo => core}/pom.xml (96%) rename {demo => core}/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java (100%) create mode 100644 core/src/main/java/com/dite/znpt/config/FastJson2JsonRedisSerializer.java rename {demo => core}/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/config/JacksonConfig.java (100%) create mode 100644 core/src/main/java/com/dite/znpt/config/RedisConfig.java rename {demo => core}/src/main/java/com/dite/znpt/config/SaTokenConfigure.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/config/SwaggerConfig.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/config/WebMvcConfig.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/AuditableEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/Constants.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/PageResult.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/Result.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/PartEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/page/PageDomain.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/page/TableSupport.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/CrewResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/DefectResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/PartListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/PartResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/exception/ServiceException.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/CrewMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/DefectMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/PartMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/ProjectMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/TurbineMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/CombinedDictService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/CrewService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/DefectService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/FileInfoService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/PartService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/PersonnelService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/ProjectCompanyService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/ProjectService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/RedisService.java (95%) rename {demo => core}/src/main/java/com/dite/znpt/service/TCompanyService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/TConstructionService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/TurbineService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/WeatherTypeService.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/util/PageUtil.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/util/PasswordUtil.java (100%) rename {demo => core}/src/main/java/com/dite/znpt/util/SqlUtil.java (100%) rename {demo => core}/src/main/resources/mapper/CombinedDictMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/CrewMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/DefectMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/FileInfoMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/PartMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/PersonnelMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/ProjectCompanyMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/ProjectMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/TCompanyMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/TConstructionMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/TurbineMapper.xml (100%) rename {demo => core}/src/main/resources/mapper/WeatherTypeMapper.xml (100%) delete mode 100644 demo/src/test/java/com/example/demo/DiteApplicationTests.java delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerItem.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Track.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/SipLayer.class diff --git a/.gitignore b/.gitignore index 38c0237..0180830 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ build/ ### VS Code ### .vscode/ +target/ \ No newline at end of file diff --git a/demo/pom.xml b/core/pom.xml similarity index 96% rename from demo/pom.xml rename to core/pom.xml index 37d8c80..0442ebb 100644 --- a/demo/pom.xml +++ b/core/pom.xml @@ -129,6 +129,12 @@ redisson 3.16.0 + + + com.alibaba + fastjson + 1.2.83 + diff --git a/demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java b/core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java rename to core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java diff --git a/demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java b/core/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java rename to core/src/main/java/com/dite/znpt/config/BeanPostProcessorConfig.java diff --git a/core/src/main/java/com/dite/znpt/config/FastJson2JsonRedisSerializer.java b/core/src/main/java/com/dite/znpt/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..2f97761 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,52 @@ +package com.dite.znpt.config; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import org.springframework.util.Assert; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class FastJson2JsonRedisSerializer implements RedisSerializer { + private ObjectMapper objectMapper = new ObjectMapper(); + public static final Charset DEFAULT_CHARSET; + private Class clazz; + + public FastJson2JsonRedisSerializer(Class clazz) { + this.clazz = clazz; + } + + public byte[] serialize(T t) throws SerializationException { + return t == null ? new byte[0] : JSON.toJSONString(t, new SerializerFeature[]{SerializerFeature.WriteClassName}).getBytes(DEFAULT_CHARSET); + } + + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes != null && bytes.length > 0) { + String str = new String(bytes, DEFAULT_CHARSET); + return JSON.parseObject(str, this.clazz); + } else { + return null; + } + } + + public void setObjectMapper(ObjectMapper objectMapper) { + Assert.notNull(objectMapper, "'objectMapper' must not be null"); + this.objectMapper = objectMapper; + } + + protected JavaType getJavaType(Class clazz) { + return TypeFactory.defaultInstance().constructType(clazz); + } + + static { + DEFAULT_CHARSET = StandardCharsets.UTF_8; + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } +} \ No newline at end of file diff --git a/demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java b/core/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java rename to core/src/main/java/com/dite/znpt/config/GlobalCorsConfig.java diff --git a/demo/src/main/java/com/dite/znpt/config/JacksonConfig.java b/core/src/main/java/com/dite/znpt/config/JacksonConfig.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/JacksonConfig.java rename to core/src/main/java/com/dite/znpt/config/JacksonConfig.java diff --git a/core/src/main/java/com/dite/znpt/config/RedisConfig.java b/core/src/main/java/com/dite/znpt/config/RedisConfig.java new file mode 100644 index 0000000..11d1cbf --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/RedisConfig.java @@ -0,0 +1,63 @@ +package com.dite.znpt.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + public RedisConfig() { + } + + @Bean + @Primary + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(connectionFactory); + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + serializer.setObjectMapper(mapper); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() { + DefaultRedisScript redisScript = new DefaultRedisScript(); + redisScript.setScriptText(this.limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + private String limitScriptText() { + return "local key = KEYS[1]\nlocal count = tonumber(ARGV[1])\nlocal time = tonumber(ARGV[2])\nlocal current = redis.call('get', key);\nif current and tonumber(current) > count then\n return tonumber(current);\nend\ncurrent = redis.call('incr', key)\nif tonumber(current) == 1 then\n redis.call('expire', key, time)\nend\nreturn tonumber(current);"; + } +} diff --git a/demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java b/core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/SaTokenConfigure.java rename to core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java diff --git a/demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java b/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/SwaggerConfig.java rename to core/src/main/java/com/dite/znpt/config/SwaggerConfig.java diff --git a/demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/config/WebMvcConfig.java rename to core/src/main/java/com/dite/znpt/config/WebMvcConfig.java diff --git a/demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/AuditableEntity.java rename to core/src/main/java/com/dite/znpt/domain/AuditableEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/Constants.java b/core/src/main/java/com/dite/znpt/domain/Constants.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/Constants.java rename to core/src/main/java/com/dite/znpt/domain/Constants.java diff --git a/demo/src/main/java/com/dite/znpt/domain/PageResult.java b/core/src/main/java/com/dite/znpt/domain/PageResult.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/PageResult.java rename to core/src/main/java/com/dite/znpt/domain/PageResult.java diff --git a/demo/src/main/java/com/dite/znpt/domain/Result.java b/core/src/main/java/com/dite/znpt/domain/Result.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/Result.java rename to core/src/main/java/com/dite/znpt/domain/Result.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/PartEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java diff --git a/demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java b/core/src/main/java/com/dite/znpt/domain/page/PageDomain.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/page/PageDomain.java rename to core/src/main/java/com/dite/znpt/domain/page/PageDomain.java diff --git a/demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java b/core/src/main/java/com/dite/znpt/domain/page/TableSupport.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/page/TableSupport.java rename to core/src/main/java/com/dite/znpt/domain/page/TableSupport.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/CombinedDictListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/CombinedDictResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/CrewResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/DefectResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/PartListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PartResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/PartResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/PartResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/TConstructionResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/WeatherTypeListReq.java diff --git a/demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java b/core/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/WeatherTypeResp.java diff --git a/demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java b/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java rename to core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java diff --git a/demo/src/main/java/com/dite/znpt/exception/ServiceException.java b/core/src/main/java/com/dite/znpt/exception/ServiceException.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/exception/ServiceException.java rename to core/src/main/java/com/dite/znpt/exception/ServiceException.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java b/core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java rename to core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java b/core/src/main/java/com/dite/znpt/mapper/CrewMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/CrewMapper.java rename to core/src/main/java/com/dite/znpt/mapper/CrewMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java b/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/DefectMapper.java rename to core/src/main/java/com/dite/znpt/mapper/DefectMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java rename to core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/PartMapper.java b/core/src/main/java/com/dite/znpt/mapper/PartMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/PartMapper.java rename to core/src/main/java/com/dite/znpt/mapper/PartMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java b/core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java rename to core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java rename to core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/ProjectMapper.java rename to core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java b/core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java rename to core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java b/core/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java rename to core/src/main/java/com/dite/znpt/mapper/TConstructionMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java b/core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/TurbineMapper.java rename to core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java diff --git a/demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java rename to core/src/main/java/com/dite/znpt/mapper/WeatherTypeMapper.java diff --git a/demo/src/main/java/com/dite/znpt/service/CombinedDictService.java b/core/src/main/java/com/dite/znpt/service/CombinedDictService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/CombinedDictService.java rename to core/src/main/java/com/dite/znpt/service/CombinedDictService.java diff --git a/demo/src/main/java/com/dite/znpt/service/CrewService.java b/core/src/main/java/com/dite/znpt/service/CrewService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/CrewService.java rename to core/src/main/java/com/dite/znpt/service/CrewService.java diff --git a/demo/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/DefectService.java rename to core/src/main/java/com/dite/znpt/service/DefectService.java diff --git a/demo/src/main/java/com/dite/znpt/service/FileInfoService.java b/core/src/main/java/com/dite/znpt/service/FileInfoService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/FileInfoService.java rename to core/src/main/java/com/dite/znpt/service/FileInfoService.java diff --git a/demo/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/PartService.java rename to core/src/main/java/com/dite/znpt/service/PartService.java diff --git a/demo/src/main/java/com/dite/znpt/service/PersonnelService.java b/core/src/main/java/com/dite/znpt/service/PersonnelService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/PersonnelService.java rename to core/src/main/java/com/dite/znpt/service/PersonnelService.java diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java b/core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/ProjectCompanyService.java rename to core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java diff --git a/demo/src/main/java/com/dite/znpt/service/ProjectService.java b/core/src/main/java/com/dite/znpt/service/ProjectService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/ProjectService.java rename to core/src/main/java/com/dite/znpt/service/ProjectService.java diff --git a/demo/src/main/java/com/dite/znpt/service/RedisService.java b/core/src/main/java/com/dite/znpt/service/RedisService.java similarity index 95% rename from demo/src/main/java/com/dite/znpt/service/RedisService.java rename to core/src/main/java/com/dite/znpt/service/RedisService.java index 35aba12..485ba3d 100644 --- a/demo/src/main/java/com/dite/znpt/service/RedisService.java +++ b/core/src/main/java/com/dite/znpt/service/RedisService.java @@ -1,10 +1,17 @@ package com.dite.znpt.service; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; import java.util.*; diff --git a/demo/src/main/java/com/dite/znpt/service/TCompanyService.java b/core/src/main/java/com/dite/znpt/service/TCompanyService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/TCompanyService.java rename to core/src/main/java/com/dite/znpt/service/TCompanyService.java diff --git a/demo/src/main/java/com/dite/znpt/service/TConstructionService.java b/core/src/main/java/com/dite/znpt/service/TConstructionService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/TConstructionService.java rename to core/src/main/java/com/dite/znpt/service/TConstructionService.java diff --git a/demo/src/main/java/com/dite/znpt/service/TurbineService.java b/core/src/main/java/com/dite/znpt/service/TurbineService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/TurbineService.java rename to core/src/main/java/com/dite/znpt/service/TurbineService.java diff --git a/demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java b/core/src/main/java/com/dite/znpt/service/WeatherTypeService.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/WeatherTypeService.java rename to core/src/main/java/com/dite/znpt/service/WeatherTypeService.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java diff --git a/demo/src/main/java/com/dite/znpt/util/PageUtil.java b/core/src/main/java/com/dite/znpt/util/PageUtil.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/util/PageUtil.java rename to core/src/main/java/com/dite/znpt/util/PageUtil.java diff --git a/demo/src/main/java/com/dite/znpt/util/PasswordUtil.java b/core/src/main/java/com/dite/znpt/util/PasswordUtil.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/util/PasswordUtil.java rename to core/src/main/java/com/dite/znpt/util/PasswordUtil.java diff --git a/demo/src/main/java/com/dite/znpt/util/SqlUtil.java b/core/src/main/java/com/dite/znpt/util/SqlUtil.java similarity index 100% rename from demo/src/main/java/com/dite/znpt/util/SqlUtil.java rename to core/src/main/java/com/dite/znpt/util/SqlUtil.java diff --git a/demo/src/main/resources/mapper/CombinedDictMapper.xml b/core/src/main/resources/mapper/CombinedDictMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/CombinedDictMapper.xml rename to core/src/main/resources/mapper/CombinedDictMapper.xml diff --git a/demo/src/main/resources/mapper/CrewMapper.xml b/core/src/main/resources/mapper/CrewMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/CrewMapper.xml rename to core/src/main/resources/mapper/CrewMapper.xml diff --git a/demo/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/DefectMapper.xml rename to core/src/main/resources/mapper/DefectMapper.xml diff --git a/demo/src/main/resources/mapper/FileInfoMapper.xml b/core/src/main/resources/mapper/FileInfoMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/FileInfoMapper.xml rename to core/src/main/resources/mapper/FileInfoMapper.xml diff --git a/demo/src/main/resources/mapper/PartMapper.xml b/core/src/main/resources/mapper/PartMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/PartMapper.xml rename to core/src/main/resources/mapper/PartMapper.xml diff --git a/demo/src/main/resources/mapper/PersonnelMapper.xml b/core/src/main/resources/mapper/PersonnelMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/PersonnelMapper.xml rename to core/src/main/resources/mapper/PersonnelMapper.xml diff --git a/demo/src/main/resources/mapper/ProjectCompanyMapper.xml b/core/src/main/resources/mapper/ProjectCompanyMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/ProjectCompanyMapper.xml rename to core/src/main/resources/mapper/ProjectCompanyMapper.xml diff --git a/demo/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/ProjectMapper.xml rename to core/src/main/resources/mapper/ProjectMapper.xml diff --git a/demo/src/main/resources/mapper/TCompanyMapper.xml b/core/src/main/resources/mapper/TCompanyMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/TCompanyMapper.xml rename to core/src/main/resources/mapper/TCompanyMapper.xml diff --git a/demo/src/main/resources/mapper/TConstructionMapper.xml b/core/src/main/resources/mapper/TConstructionMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/TConstructionMapper.xml rename to core/src/main/resources/mapper/TConstructionMapper.xml diff --git a/demo/src/main/resources/mapper/TurbineMapper.xml b/core/src/main/resources/mapper/TurbineMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/TurbineMapper.xml rename to core/src/main/resources/mapper/TurbineMapper.xml diff --git a/demo/src/main/resources/mapper/WeatherTypeMapper.xml b/core/src/main/resources/mapper/WeatherTypeMapper.xml similarity index 100% rename from demo/src/main/resources/mapper/WeatherTypeMapper.xml rename to core/src/main/resources/mapper/WeatherTypeMapper.xml diff --git a/demo/src/test/java/com/example/demo/DiteApplicationTests.java b/demo/src/test/java/com/example/demo/DiteApplicationTests.java deleted file mode 100644 index 5ef0a95..0000000 --- a/demo/src/test/java/com/example/demo/DiteApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DiteApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/pom.xml b/pom.xml index 514a2ed..2eb257b 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 17 - demo + core sip web diff --git a/sip/pom.xml b/sip/pom.xml index 55a957b..5072c7a 100644 --- a/sip/pom.xml +++ b/sip/pom.xml @@ -43,11 +43,6 @@ dom4j 2.1.3 - - com.alibaba - fastjson - 1.2.83 - org.slf4j log4j-over-slf4j diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java index 430a48b..f4b8237 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java @@ -16,8 +16,6 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MediaServerCache { private final RedisService redisService; - public final RedisTemplate redisTemplate; - private final String zlm_key = "zlm_media_server"; diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java index c422090..a39c8c4 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java @@ -19,6 +19,7 @@ import java.util.List; @NoArgsConstructor @Accessors(chain = true) public class MediaItem implements Serializable { + private static final long serialVersionUID = -6679610697837602559L; /** * 设备编码 */ diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java index 96bf6d6..d590d3f 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java @@ -23,6 +23,8 @@ import java.util.Set; @Data @NoArgsConstructor public class ServerItem implements Serializable { + + private static final long serialVersionUID = 2460404295026548536L; /** * 播流最大并发个数 */ diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java index a425cf0..942b099 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java @@ -4,6 +4,7 @@ import com.dite.znpt.monitor.media.zlm.dto.event.BaseEventReq; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; import java.util.List; /** @@ -13,7 +14,9 @@ import java.util.List; */ @EqualsAndHashCode(callSuper = true) @Data -public class MediaResp extends BaseEventReq { +public class MediaResp extends BaseEventReq implements Serializable { + private static final long serialVersionUID = -8710934021370904914L; + /** * 本协议观看人数 */ diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java index 37168cc..5ca64f3 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java @@ -3,13 +3,17 @@ package com.dite.znpt.monitor.media.zlm.dto.resp; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; +import java.io.Serializable; + /** * @Author: huise23 * @Date: 2022/8/29 11:20 * @Description: */ @Data -public class OriginSock { +public class OriginSock implements Serializable { + private static final long serialVersionUID = 5628294142872524316L; + private String identifier; @JSONField(name = "local_ip") private String localIp; diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java index 3cdd362..e7307aa 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java @@ -3,13 +3,16 @@ package com.dite.znpt.monitor.media.zlm.dto.resp; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; +import java.io.Serializable; + /** * @Author: huise23 * @Date: 2022/8/29 11:25 * @Description: */ @Data -public class Track { +public class Track implements Serializable { + private static final long serialVersionUID = 5317048895056912057L; /** * 音频通道数 */ diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java index 8fb1977..f1e20ce 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java @@ -1,12 +1,10 @@ package com.dite.znpt.monitor.media.zlm.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Dict; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import com.dite.znpt.monitor.media.zlm.ZlmApi; import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; @@ -37,8 +35,8 @@ public class ZlmApiImpl implements ZlmApi { log.info("ZLM:" + url); log.info("REQ:" + req); req.setSecret(server.getSecretKey()); - String respStr = HttpUtil.post(url, JSONUtil.toJsonStr(req)); - V resp = JSONUtil.toBean(respStr, clazz); + String respStr = HttpUtil.post(url, JSON.toJSONString(req)); + V resp = JSON.parseObject(respStr, clazz); if (resp.isSuccess()) { return resp; } @@ -173,7 +171,7 @@ public class ZlmApiImpl implements ZlmApi { public void getSnap(ServerInfo server, SnapReq req) throws IOException { String url = StrUtil.format("http://{}:{}/index/api/getSnap", server.getApiHost(), server.getApiPort()); req.setSecret(server.getSecretKey()); - url += "?" + HttpUtil.toParams(BeanUtil.beanToMap(req)); + url += "?" + HttpUtil.toParams(JSON.parseObject(JSON.toJSONString(req))); HttpUtil.download(url, response.getOutputStream(), true); } diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java index f2786fe..ed5874e 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java @@ -34,12 +34,6 @@ public class SipLayer { private SipFactory sipFactory; - @PostConstruct - public void initLogging() { - SLF4JBridgeHandler.removeHandlersForRootLogger(); - SLF4JBridgeHandler.install(); - } - @Bean("sipFactory") SipFactory createSipFactory() { sipFactory = SipFactory.getInstance(); @@ -52,7 +46,6 @@ public class SipLayer { SipStack createSipStack() throws PeerUnavailableException { Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); - properties.setProperty("gov.nist.javax.sip.PATH_NAME", "gov.nist"); properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getIp()); /** * 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码 @@ -78,8 +71,7 @@ public class SipLayer { if (log.isDebugEnabled()) { properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); } - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); -// properties.setProperty("gov.nist.javax.sip.STACK_LOGGER", "gov.nist.core.CommonLoggerSlf4j"); // 通过 SLF4J 桥接 + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "WARN"); sipStack = sipFactory.createSipStack(properties); return sipStack; diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.class deleted file mode 100644 index 2748741cb857d1bd3e6973f57d34d1d3ebf5e41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1947 zcmcIlTW=Fb6#m9GapG()I5=%6myqUSZ_-RkS}t`61WQOrhDsP&A}`ToJ(vaWjx{?5 zg{S_cR%(L81LCWC`vB) zvp%irFoqc>33VsN-?2(k7f`@x9*%=Cj5Exg4a6`WNfR6L=k9Ci8HS~D{k3>2ct?b7 z-Z0t^+tofvqE@XmE!m`lizpIE`vl110FcUQlsqmmtR6S>bl_S>@g!o8jSLDD_Gt${ z;75i$@z#}SG2ARyPQ>jjoN576xa{C3Twxg1vLi(#8a%2Ow(i) zR~-C;Rfe&+s-DZB+YyG!YQ3&>n@3%n&zD*R@}1IecuN?;V@>WUEt4WUd{ku^Y546> zn4Ttt7w1RV=(8~`oYRs`;u)){Fft-EP0{HQSFWa7v`p0fP(JMiyHY&g?I zrqI4Ur^1|hc(m=Mp7}n0jIbMlcV-0fbEktF|dcvA5Q8z zhUw!G*y|of;jiz+`i)7nw#_{2g~ktL(~o>g&sG>JBaBbEwb>a|fV)zJ5q~K>nw5K8 z96jJ$J)_?FRGKzB4b{`0eB|2-D4m?3tG0a@+=2L!ky zSrqN?rrkx`HDKVh&tQ$@)NXYCH9pgnr#*E(eQ%PaMlUn8j=KMX74ypn82KkwT&J&{ z6Tl3um+3bFOed=N9k=L2k8m4z2#DDkmIB@;9Y%L!3E%-HK4a={5@cW@hvLiG7|ux) zQ#fYlR|>LC+F8<`bPp&>D`eG-yK;c5Urj5LAHY2Myg=qHVggGs=4|rr$izw9jlI7> z#{NOZTH_W_B`xcHkn)t=54hnL^ZQtGm-oTkm3=H*vTSVhcnX?B$^I((h)PF9r8xZ7 l^HQ9E3^r(=xM(G7M3toE9yaO52I4-g89a!;TSwA|!2gx4089V? diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/MediaItem.class deleted file mode 100644 index 9be430e6aa019a99b75cee3a02e914c8bf88cc26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12581 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.class deleted file mode 100644 index e9eca6c111348d21713d98f7f2cb756f35b8efc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3501 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.class deleted file mode 100644 index 8b44e9ae408457820ed45ccfc4641af78240afe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13644 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 MvpPQJfgC6Le@c?IWB>pF diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/SipLayer.class b/sip/target/classes/com/dite/znpt/monitor/sip/SipLayer.class deleted file mode 100644 index 2f7b7aa34fb670fc2519de6af691453687b62638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4231 zcma)A`Fj)B6+L52B#U8Fz$7N5h9tyb@BkrfBDAtJHVU#NB-xZu5Mya92BaBvX5^Sq zn(j?$OX=P;ZPUH!l4iv$>GpH~5BgX1>(}#Uw4+k^VCKzx_uY5Txy!rapZ~f0Hvs$b z_YelKB7i{|EAfbgbr-coO{r*RSxL`d)Qhf!M~)h%;U1H)Vr<7;2tf=55R$PGxWw}YKT-I%&aJ7sz zLR-Kv9apPVLRg3O0fc2diVYGr2%DA^$EYbeqc)`#UCX{KVO3do6Jmo|)FnJNwjh(T>9%X= zP6%7EB8X?2xF=}KL@pnVohYQDGinge@`UNheTViQ+FQsaGD3cbjGY*7oa}2NL5KRB z+{c!VDc|LhAa+Z5q6uxnqt!Db6U`rQSfO;;m&g>N@px9vj9|4n?+lM&AKr6VCcj{^Z5lyL}$CG33otrAv>u&B|xMnH5CFRY8mIEoh-&J~Mx zg_G?N_9HT~3LnQO0*K0(M2soXD3#r*;vJg*1X-yC_5+?d6$f`*-no|o|bxO^ushFB8A~ls3$#zD@r*M|8DB8N_>WrP7s}(OX&>B(S zlU9+Q^598(#i1bMJT&GqqqU)9LwCyivLYypGD=`l2N+}-%Vu@l*cE08)74qj7{Fy* z2*8kW5wvN2yQ(%Mc${Inb6TZNZ7i&bAgUbXW0_U3Pz&JGGHf`E&#t1@w9f~fWZ}_G z7L<%dWfG!&56_)iNzQRlK3@1l(y1l5|XGiJM(R(-Exp(cYf4z3&-nBPJuUtKH<*KMLugUlt zt}&(!bHQRl_3>VZ^BT4J{uy!VHyAs!@k|icdynUApW{Qgfo})!9U0%n_atoUEpaUh zhZyL7S(NZhr-8AG<~U5M-klK%k7w(qYgF|)!!cMMqo!%O^qplgoHsXOPisvoS>3Vf zc2Vcf!I)KIKCDd|rk<)-=XEH0a%HpF*ha?rhCQ03DP@UrlZxYDV6mFQvw z6y}SB(fjSlSdPp4$6-}2y4l_R%-wcsY^w@<}n(;@0eWeoXY6BJ!`UG zGAe?pmY{@v4{Li|ujyvVNeck$99Og5e6b_?w-d|%PiF32?>4u!E7VAXc89%OPx)Y? zaRVLJtO>%i4{=Zc?{+beFiE;mirVFRRX5!h0|C4*VXVzmUKD^DYk10XbM=}S>7@?o z4|zAWrTy$nn6pls(*Ty4Z9>NPS>Cc{H1l$^P&h4R3~bZu1${baOC5BsuQ$KiEUn>O z7ZJgu#Y&?I59PdMnKDFLtZv4)*Q2pf>g!`(61Hx+mutEbv#K@ABrOqkjl*pH!M1-y z^g|pCh^`G1zR&R^eE-0kV|~4Ej`yXv#*Uir0N45BfzKcEOW|AMd*#ksklypee#EC( z23zpg`ILPD{1|WWOTtgMI^b^= zjMoDXcK1#A!Q zG=Ocx-G>Brw+mPhA9+bFa(*i*5`Tum!?*FR4{$^zuH;3XpZA-{++R31fWNlN3;zS+ EzjrHuH~;_u diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java index b732b96..2eef147 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java @@ -61,14 +61,13 @@ public class VideoController { @ApiOperation(value = "获取信令服务器配置信息", notes = "iot:video:sip:view", httpMethod = "GET") @GetMapping("/sipServerConfig") public Result getSipServerConfig(){ - return Result.ok(sipConfig); + return Result.ok(BeanUtil.copyProperties(sipConfig, SipConfig.class)); } @ApiOperation(value = "获取流媒体服务配置信息", notes = "iot:video:media:view", httpMethod = "GET") @GetMapping("/streamMediaServerConfig") public Result getStreamMediaServerConfig(){ - //streamMediaServerConfigService.getStreamMediaServerConfig() - return Result.ok(streamMediaServerConfigService); + return Result.ok(BeanUtil.copyProperties(streamMediaServerConfigService, StreamMediaServerConfig.class)); } @ApiOperation(value = "查询监控IP配置列表", notes = "iot:config:list", httpMethod = "GET") From be07477cc7791fcdaec9e6db7fe91eff19f56820 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Apr 2025 14:47:02 +0800 Subject: [PATCH 006/143] =?UTF-8?q?1.sip=E6=97=A5=E5=BF=97=E7=AD=89?= =?UTF-8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java index ed5874e..f10f7d8 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java @@ -71,7 +71,8 @@ public class SipLayer { if (log.isDebugEnabled()) { properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); } - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "WARN"); +// sip日志等级 + properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); sipStack = sipFactory.createSipStack(properties); return sipStack; From ef3ae576ba1474b48e4f8850e1bc465da88a6780 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Apr 2025 17:34:24 +0800 Subject: [PATCH 007/143] =?UTF-8?q?1.=E6=96=B0=E5=A2=9Emq=E7=9B=B8?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 5 +- data-bus/pom.xml | 32 +++++++++ .../dite/znpt/data/bus/config/MQConfig.java | 67 +++++++++++++++++++ .../dite/znpt/data/bus/config/MQHandle.java | 20 ++++++ .../data/bus/config/entity/CommonMessage.java | 9 +++ .../bus/config/entity/req/ProjectDTO.java | 4 ++ .../data/bus/config/enums/MQTypeEnum.java | 28 ++++++++ .../bus/config/handles/ProjectHandleImpl.java | 31 +++++++++ pom.xml | 5 +- sip/pom.xml | 1 - 10 files changed, 196 insertions(+), 6 deletions(-) create mode 100644 data-bus/pom.xml create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java diff --git a/core/pom.xml b/core/pom.xml index 0442ebb..93340d9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -35,7 +35,6 @@ org.projectlombok lombok - true org.springframework.boot @@ -143,8 +142,8 @@ maven-compiler-plugin 3.1 - 8 - 8 + 17 + 17 diff --git a/data-bus/pom.xml b/data-bus/pom.xml new file mode 100644 index 0000000..d296946 --- /dev/null +++ b/data-bus/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + org.dite.znpt + data-bus + + + 17 + 17 + UTF-8 + + + + + com.dite.znpt + core + 1.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-amqp + + + \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java new file mode 100644 index 0000000..a1abbe2 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java @@ -0,0 +1,67 @@ +package com.dite.znpt.data.bus.config; + +import cn.hutool.extra.spring.SpringUtil; +import com.dite.znpt.data.bus.config.enums.MQTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.List; + +@Slf4j +@Component +public class MQConfig { + @Autowired + private ConnectionFactory connectionFactory; + + @PostConstruct + public void registerListeners() { + + for (MQTypeEnum typeEnum : MQTypeEnum.values()) { + String queueName = typeEnum.getType() + ".queue"; + + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + container.setQueueNames(queueName); + container.setMessageListener(message -> { + String body = new String(message.getBody()); + log.debug("队列: " + queueName + " 收到消息: " + body); + try { + SpringUtil.getBean(typeEnum.getImpl()).handle(body); + } catch (Exception e) { + log.error("mq队列处理出错", e); + } + }); + // 启动监听 + container.start(); + } + } + + @Bean + public TopicExchange topicExchange() { + return new TopicExchange("data.topic.exchange"); + } + + @Bean + public List declareQueues() { + return Arrays.stream(MQTypeEnum.values()) + .map(type -> new Queue(type + ".queue", true)) + .toList(); + } + + @Bean + public List declareBindings(TopicExchange topicExchange) { + return Arrays.stream(MQTypeEnum.values()) + .map(type -> BindingBuilder + .bind(new Queue(type + ".queue")) + .to(topicExchange) + .with(type + ".*")) + .toList(); + } +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java new file mode 100644 index 0000000..21e7af3 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java @@ -0,0 +1,20 @@ +package com.dite.znpt.data.bus.config; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * @author cuizhibin + * @date 2025/04/22 17:03 + * @description mq处理接口 + */ +public interface MQHandle { + + /** + * 功能描述:mq处理类 + * + * @param msg 消息 + * @author cuizhibin + * @date 2025/04/22 17:03 + **/ + void handle(String msg) throws JsonProcessingException; +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java new file mode 100644 index 0000000..91fb0f2 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java @@ -0,0 +1,9 @@ +package com.dite.znpt.data.bus.config.entity; + +import lombok.Data; + +@Data +public class CommonMessage { + private String operation; + private T payload; +} \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java new file mode 100644 index 0000000..198efeb --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java @@ -0,0 +1,4 @@ +package com.dite.znpt.data.bus.config.entity.req; + +public class ProjectDTO { +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java new file mode 100644 index 0000000..b83bdf2 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java @@ -0,0 +1,28 @@ +package com.dite.znpt.data.bus.config.enums; + +import com.dite.znpt.data.bus.config.MQHandle; +import com.dite.znpt.data.bus.config.handles.ProjectHandleImpl; +import lombok.Getter; + +/** + * @author cuizhibin + * @date 2025/04/22 17:05 + * @description mq类型枚举 + */ +@Getter +public enum MQTypeEnum { + PROJECT("project", "项目", ProjectHandleImpl.class), + CREW("crew", "机组", ProjectHandleImpl.class), + PARTS("parts", "部件", ProjectHandleImpl.class), + ; + + private final String type; + private final String desc; + private final Class impl; + + MQTypeEnum(String type, String desc, Class impl) { + this.type = type; + this.desc = desc; + this.impl = impl; + } +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java new file mode 100644 index 0000000..9891788 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java @@ -0,0 +1,31 @@ +package com.dite.znpt.data.bus.config.handles; + +import cn.hutool.json.JSONUtil; +import com.dite.znpt.data.bus.config.MQHandle; +import com.dite.znpt.data.bus.config.entity.CommonMessage; +import com.dite.znpt.data.bus.config.entity.req.ProjectDTO; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.stereotype.Service; + +/** + * @author cuizhibin + * @date 2025/04/22 17:11 + * @description 项目处理 + */ +@Service +public class ProjectHandleImpl implements MQHandle { + /** + * 功能描述:mq处理类 + * + * @param msg 消息 + * @author cuizhibin + * @date 2025/04/22 17:03 + **/ + @Override + public void handle(String msg) throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + CommonMessage projectMsg = objectMapper.readValue(msg, + objectMapper.getTypeFactory().constructParametricType(CommonMessage.class, ProjectDTO.class)); + } +} diff --git a/pom.xml b/pom.xml index 2eb257b..e1ec815 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ core sip web + data-bus pom @@ -43,8 +44,8 @@ maven-compiler-plugin 3.1 - 8 - 8 + 17 + 17 diff --git a/sip/pom.xml b/sip/pom.xml index 5072c7a..7e62790 100644 --- a/sip/pom.xml +++ b/sip/pom.xml @@ -27,7 +27,6 @@ org.projectlombok lombok - true From 5ba3760b6746c51d13eb9c8b558166e5194803f7 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 23 Apr 2025 13:27:03 +0800 Subject: [PATCH 008/143] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=A8=A1=E5=9D=97=EF=BC=8C=E5=B0=81=E8=A3=85?= =?UTF-8?q?rabbitmq=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- data-bus/pom.xml | 2 +- .../dite/znpt/data/bus/config/MQConfig.java | 73 +++++++++------ .../dite/znpt/data/bus/config/MQHandle.java | 5 +- .../data/bus/config/entity/CommonMessage.java | 9 -- .../bus/config/entity/req/ProjectDTO.java | 4 - .../data/bus/config/enums/MQTypeEnum.java | 28 ------ .../bus/config/handles/ProjectHandleImpl.java | 31 ------- .../znpt/data/bus/entity/CommonMessage.java | 10 +++ .../znpt/data/bus/entity/req/ProjectDTO.java | 4 + .../znpt/data/bus/enums/MQOperationEnum.java | 33 +++++++ .../dite/znpt/data/bus/enums/MQTypeEnum.java | 31 +++++++ .../data/bus/handles/ProjectHandleImpl.java | 26 ++++++ .../monitor/config/MediaFormatConfig.class | Bin 1306 -> 0 bytes .../znpt/monitor/constant/Constants.class | Bin 567 -> 0 bytes .../monitor/constant/IotCacheConstants.class | Bin 1077 -> 0 bytes .../monitor/constant/IotDictConstants.class | Bin 473 -> 0 bytes .../monitor/constant/IotRespMessage.class | Bin 4835 -> 0 bytes .../monitor/constant/dict/CameraType.class | Bin 1682 -> 0 bytes .../monitor/constant/dict/DeviceStatus.class | Bin 1848 -> 0 bytes .../constant/dict/SipTransferMode.class | Bin 1670 -> 0 bytes .../constant/dict/StreamTransferMode.class | Bin 1823 -> 0 bytes .../monitor/constant/dict/ValueAndLabel.class | Bin 204 -> 0 bytes .../znpt/monitor/constant/dict/YesOrNo.class | Bin 1645 -> 0 bytes .../znpt/monitor/domain/CustomFunction.class | Bin 254 -> 0 bytes .../entity/DeviceVideoChannelEntity.class | Bin 17318 -> 0 bytes .../domain/entity/DeviceVideoEntity.class | Bin 13586 -> 0 bytes .../domain/entity/IpConfigEntity.class | Bin 2936 -> 0 bytes .../domain/req/MonitorConfigAddReq.class | Bin 1786 -> 0 bytes .../monitor/domain/req/VideoInfoReq.class | Bin 2347 -> 0 bytes .../monitor/domain/resp/DeviceVideoResp.class | Bin 2682 -> 0 bytes .../monitor/domain/resp/VideoInfoResp.class | Bin 7699 -> 0 bytes .../vo/video/DeviceVideoChannelEditReq.class | Bin 3692 -> 0 bytes .../vo/video/DeviceVideoChannelListResp.class | Bin 7410 -> 0 bytes .../vo/video/DeviceVideoChannelResp.class | Bin 5244 -> 0 bytes .../domain/vo/video/DeviceVideoEditReq.class | Bin 2805 -> 0 bytes .../domain/vo/video/DeviceVideoListResp.class | Bin 10323 -> 0 bytes .../domain/vo/video/DeviceVideoNumResp.class | Bin 2753 -> 0 bytes .../domain/vo/video/StreamMediaFormat.class | Bin 6821 -> 0 bytes .../vo/video/StreamMediaFormatReq.class | Bin 2830 -> 0 bytes .../vo/video/StreamMediaFormatResp.class | Bin 3367 -> 0 bytes .../vo/video/StreamMediaServerConfigReq.class | Bin 8024 -> 0 bytes .../video/StreamMediaServerConfigResp.class | Bin 8488 -> 0 bytes .../VideoPayResp$VideoPayRespBuilder.class | Bin 1805 -> 0 bytes .../domain/vo/video/VideoPayResp.class | Bin 3040 -> 0 bytes .../mapper/DeviceVideoChannelMapper.class | Bin 1312 -> 0 bytes .../monitor/mapper/DeviceVideoMapper.class | Bin 755 -> 0 bytes .../znpt/monitor/mapper/IpConfigMapper.class | Bin 337 -> 0 bytes .../mapper/StreamMediaFormatMapper.class | Bin 360 -> 0 bytes .../dite/znpt/monitor/media/zlm/ZlmApi.class | Bin 4162 -> 0 bytes .../dite/znpt/monitor/media/zlm/ZlmHook.class | Bin 5437 -> 0 bytes .../znpt/monitor/media/zlm/ZlmService.class | Bin 375 -> 0 bytes .../zlm/cache/MediaServerChannelCache.class | Bin 2954 -> 0 bytes .../zlm/config/StreamMediaServerConfig.class | Bin 6860 -> 0 bytes .../monitor/media/zlm/dto/ServerConfig.class | Bin 108104 -> 0 bytes .../monitor/media/zlm/dto/ServerInfo.class | Bin 2618 -> 0 bytes .../media/zlm/dto/event/BaseEventReq.class | Bin 4945 -> 0 bytes .../media/zlm/dto/event/BaseEventResp.class | Bin 3755 -> 0 bytes .../media/zlm/dto/event/FlowReportReq.class | Bin 2564 -> 0 bytes .../media/zlm/dto/event/HttpAccessReq.class | Bin 2674 -> 0 bytes .../media/zlm/dto/event/HttpAccessResp.class | Bin 3010 -> 0 bytes .../monitor/media/zlm/dto/event/PlayReq.class | Bin 909 -> 0 bytes .../media/zlm/dto/event/PublishReq.class | Bin 921 -> 0 bytes .../media/zlm/dto/event/PublishResp.class | Bin 7678 -> 0 bytes .../media/zlm/dto/event/RecordMp4Req.class | Bin 4467 -> 0 bytes .../media/zlm/dto/event/RtspAuthReq.class | Bin 2689 -> 0 bytes .../media/zlm/dto/event/RtspAuthResp.class | Bin 2548 -> 0 bytes .../media/zlm/dto/event/RtspRealmReq.class | Bin 929 -> 0 bytes .../zlm/dto/event/ServerKeepaliveReq.class | Bin 1754 -> 0 bytes .../media/zlm/dto/event/ShellLoginReq.class | Bin 2081 -> 0 bytes .../zlm/dto/event/StreamChangedReq.class | Bin 1645 -> 0 bytes .../zlm/dto/event/StreamNoneReaderReq.class | Bin 957 -> 0 bytes .../zlm/dto/event/StreamNotFoundReq.class | Bin 949 -> 0 bytes .../monitor/media/zlm/dto/req/BaseReq.class | Bin 1469 -> 0 bytes .../media/zlm/dto/req/CloseStreamReq.class | Bin 1625 -> 0 bytes .../media/zlm/dto/req/FFmpegSourceReq.class | Bin 4123 -> 0 bytes .../media/zlm/dto/req/GetAllSessionReq.class | Bin 2246 -> 0 bytes .../zlm/dto/req/GetMp4RecordFileReq.class | Bin 2144 -> 0 bytes .../monitor/media/zlm/dto/req/IdReq.class | Bin 1572 -> 0 bytes .../monitor/media/zlm/dto/req/KeyReq.class | Bin 1508 -> 0 bytes .../monitor/media/zlm/dto/req/RecordReq.class | Bin 2680 -> 0 bytes .../media/zlm/dto/req/RtpServerReq.class | Bin 3128 -> 0 bytes .../media/zlm/dto/req/SendRtpReq.class | Bin 4840 -> 0 bytes .../monitor/media/zlm/dto/req/SnapReq.class | Bin 2631 -> 0 bytes .../media/zlm/dto/req/StreamIdReq.class | Bin 1673 -> 0 bytes .../media/zlm/dto/req/StreamProxyReq.class | Bin 8769 -> 0 bytes .../zlm/dto/req/StreamPusherProxyReq.class | Bin 3257 -> 0 bytes .../monitor/media/zlm/dto/req/StreamReq.class | Bin 2782 -> 0 bytes .../monitor/media/zlm/dto/resp/BaseResp.class | Bin 5567 -> 0 bytes .../media/zlm/dto/resp/CloseStreamResp.class | Bin 2233 -> 0 bytes .../zlm/dto/resp/Mp4RecordFileResp.class | Bin 2215 -> 0 bytes .../media/zlm/dto/resp/RtpInfoResp.class | Bin 3620 -> 0 bytes .../media/zlm/dto/resp/RtpServerResp.class | Bin 2110 -> 0 bytes .../media/zlm/dto/resp/SessionResp.class | Bin 3939 -> 0 bytes .../media/zlm/dto/resp/StatisticResp.class | Bin 8675 -> 0 bytes .../media/zlm/dto/resp/ThreadsLoadResp.class | Bin 1942 -> 0 bytes .../media/zlm/enums/MediaFormatType.class | Bin 1895 -> 0 bytes .../media/zlm/impl/ZlmHookService.class | Bin 6124 -> 0 bytes .../media/zlm/impl/ZlmServiceImpl.class | Bin 9355 -> 0 bytes .../service/DeviceVideoChannelService.class | Bin 2000 -> 0 bytes .../monitor/service/DeviceVideoService.class | Bin 1402 -> 0 bytes .../monitor/service/IpConfigService.class | Bin 519 -> 0 bytes .../service/StreamMediaFormatService.class | Bin 371 -> 0 bytes .../impl/DeviceVideoChannelServiceImpl.class | Bin 15903 -> 0 bytes .../service/impl/DeviceVideoServiceImpl.class | Bin 14013 -> 0 bytes .../service/impl/IpConfigServiceImpl.class | Bin 6779 -> 0 bytes .../impl/StreamMediaFormatServiceImpl.class | Bin 820 -> 0 bytes .../znpt/monitor/sip/config/SipConfig.class | Bin 5196 -> 0 bytes .../sip/session/StreamSessionManager.class | Bin 1201 -> 0 bytes .../sip/transmit/SipProcessorFactoryI.class | Bin 185 -> 0 bytes .../transmit/SipProcessorFactoryImpl.class | Bin 5027 -> 0 bytes .../transmit/cmd/ISipDeviceCommander.class | Bin 502 -> 0 bytes .../cmd/SipRequestHeaderProvider.class | Bin 7088 -> 0 bytes .../cmd/impl/SipDeviceCommanderImpl.class | Bin 9484 -> 0 bytes .../request/ISipRequestProcessor.class | Bin 212 -> 0 bytes .../ISipRequestProcessorAbstract.class | Bin 9865 -> 0 bytes .../impl/AckRequestProcessorImpl.class | Bin 2919 -> 0 bytes .../impl/ByeRequestProcessorImpl.class | Bin 3412 -> 0 bytes .../impl/MessageRequestProcessorImpl.class | Bin 3852 -> 0 bytes .../impl/RegisterRequestProcessorImpl.class | Bin 7886 -> 0 bytes .../impl/message/IMessageHandler.class | Bin 270 -> 0 bytes .../message/query/CatalogHandlerImpl.class | Bin 9256 -> 0 bytes .../message/query/DeviceInfoHandlerImpl.class | Bin 3097 -> 0 bytes .../query/DeviceStatusHandlerImpl.class | Bin 3125 -> 0 bytes .../message/query/KeepaliveHandlerImpl.class | Bin 4177 -> 0 bytes .../response/ISipResponseProcessor.class | Bin 216 -> 0 bytes .../ISipResponseProcessorAbstract.class | Bin 531 -> 0 bytes .../impl/InviteResponseProcessorImpl.class | Bin 5488 -> 0 bytes .../transmit/timeout/ITimeoutProcessor.class | Bin 206 -> 0 bytes .../timeout/impl/TimeoutProcessorImpl.class | Bin 1612 -> 0 bytes .../DigestServerAuthenticationHelper.class | Bin 5212 -> 0 bytes .../dite/znpt/monitor/sip/utils/XmlUtil.class | Bin 3274 -> 0 bytes .../znpt/monitor/sip/vo/DeviceAlarmVo.class | Bin 4487 -> 0 bytes .../znpt/monitor/sip/vo/DeviceChannelVo.class | Bin 9902 -> 0 bytes .../dite/znpt/monitor/sip/vo/DeviceVo.class | Bin 5346 -> 0 bytes .../com/dite/znpt/monitor/sip/vo/HostVo.class | Bin 2083 -> 0 bytes .../znpt/monitor/sip/vo/RecordItemVo.class | Bin 4753 -> 0 bytes .../dite/znpt/monitor/sip/vo/RecordVo.class | Bin 2996 -> 0 bytes .../dite/znpt/monitor/utils/DictUtils.class | Bin 2438 -> 0 bytes .../mapper/iot/DeviceVideoChannelMapper.xml | 84 ------------------ .../classes/mapper/iot/DeviceVideoMapper.xml | 45 ---------- .../classes/mapper/iot/IpConfigMapper.xml | 17 ---- web/pom.xml | 5 ++ 143 files changed, 165 insertions(+), 247 deletions(-) delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java create mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java delete mode 100644 sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/Constants.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/DeviceStatus.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/entity/IpConfigEntity.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/resp/VideoInfoResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoMapper.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmApi.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/IpConfigService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/config/SipConfig.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/HostVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/RecordItemVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/sip/vo/RecordVo.class delete mode 100644 sip/target/classes/com/dite/znpt/monitor/utils/DictUtils.class delete mode 100644 sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml delete mode 100644 sip/target/classes/mapper/iot/DeviceVideoMapper.xml delete mode 100644 sip/target/classes/mapper/iot/IpConfigMapper.xml diff --git a/.gitignore b/.gitignore index 0180830..1be540f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ HELP.md -demo/target/ +core/target/ +data-bus/target/ +sip/target/ +web/target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ diff --git a/data-bus/pom.xml b/data-bus/pom.xml index d296946..0b33237 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -9,8 +9,8 @@ 1.0.0-SNAPSHOT - org.dite.znpt data-bus + 1.0.0-SNAPSHOT 17 diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java index a1abbe2..b8f1fa5 100644 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java @@ -1,17 +1,19 @@ package com.dite.znpt.data.bus.config; import cn.hutool.extra.spring.SpringUtil; -import com.dite.znpt.data.bus.config.enums.MQTypeEnum; +import com.dite.znpt.data.bus.entity.CommonMessage; +import com.dite.znpt.data.bus.enums.MQTypeEnum; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; @Slf4j @@ -20,9 +22,39 @@ public class MQConfig { @Autowired private ConnectionFactory connectionFactory; - @PostConstruct - public void registerListeners() { + @Bean + public RabbitAdmin rabbitAdmin() { + RabbitAdmin admin = new RabbitAdmin(connectionFactory); + admin.setAutoStartup(true); + return admin; + } + @Bean + public TopicExchange topicExchange() { + return new TopicExchange("data.topic.exchange"); + } + + @Bean + public Declarables declarables(TopicExchange exchange) { + List declarables = new ArrayList<>(); + declarables.add(exchange); + + for (MQTypeEnum typeEnum : MQTypeEnum.values()) { + String queueName = typeEnum.getType() + ".queue"; + Queue queue = new Queue(queueName, true); + declarables.add(queue); + Binding binding = BindingBuilder.bind(queue) + .to(exchange) + .with(typeEnum.getType() + ".*"); + declarables.add(binding); + } + + return new Declarables(declarables); + } + + @Bean + public List registerListeners(Declarables declarables) { + List messageListeners = new ArrayList<>(); for (MQTypeEnum typeEnum : MQTypeEnum.values()) { String queueName = typeEnum.getType() + ".queue"; @@ -33,35 +65,26 @@ public class MQConfig { String body = new String(message.getBody()); log.debug("队列: " + queueName + " 收到消息: " + body); try { - SpringUtil.getBean(typeEnum.getImpl()).handle(body); + ObjectMapper objectMapper = new ObjectMapper(); + CommonMessage msg = objectMapper.readValue(body, + objectMapper.getTypeFactory().constructParametricType(CommonMessage.class, typeEnum.getDto())); + MQHandle handle = SpringUtil.getBean(typeEnum.getImpl()); + handleMessageWithType(handle, msg); } catch (Exception e) { log.error("mq队列处理出错", e); } }); + messageListeners.add(container); // 启动监听 container.start(); } + log.info("mq监听启动完成"); + return messageListeners; } - @Bean - public TopicExchange topicExchange() { - return new TopicExchange("data.topic.exchange"); + @SuppressWarnings("unchecked") + private void handleMessageWithType(MQHandle handler, CommonMessage message) { + handler.handle((CommonMessage) message); } - @Bean - public List declareQueues() { - return Arrays.stream(MQTypeEnum.values()) - .map(type -> new Queue(type + ".queue", true)) - .toList(); - } - - @Bean - public List declareBindings(TopicExchange topicExchange) { - return Arrays.stream(MQTypeEnum.values()) - .map(type -> BindingBuilder - .bind(new Queue(type + ".queue")) - .to(topicExchange) - .with(type + ".*")) - .toList(); - } } diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java index 21e7af3..fef3cec 100644 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java @@ -1,5 +1,6 @@ package com.dite.znpt.data.bus.config; +import com.dite.znpt.data.bus.entity.CommonMessage; import com.fasterxml.jackson.core.JsonProcessingException; /** @@ -7,7 +8,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; * @date 2025/04/22 17:03 * @description mq处理接口 */ -public interface MQHandle { +public interface MQHandle { /** * 功能描述:mq处理类 @@ -16,5 +17,5 @@ public interface MQHandle { * @author cuizhibin * @date 2025/04/22 17:03 **/ - void handle(String msg) throws JsonProcessingException; + void handle(CommonMessage msg); } diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java deleted file mode 100644 index 91fb0f2..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/CommonMessage.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dite.znpt.data.bus.config.entity; - -import lombok.Data; - -@Data -public class CommonMessage { - private String operation; - private T payload; -} \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java deleted file mode 100644 index 198efeb..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/entity/req/ProjectDTO.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dite.znpt.data.bus.config.entity.req; - -public class ProjectDTO { -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java deleted file mode 100644 index b83bdf2..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/enums/MQTypeEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dite.znpt.data.bus.config.enums; - -import com.dite.znpt.data.bus.config.MQHandle; -import com.dite.znpt.data.bus.config.handles.ProjectHandleImpl; -import lombok.Getter; - -/** - * @author cuizhibin - * @date 2025/04/22 17:05 - * @description mq类型枚举 - */ -@Getter -public enum MQTypeEnum { - PROJECT("project", "项目", ProjectHandleImpl.class), - CREW("crew", "机组", ProjectHandleImpl.class), - PARTS("parts", "部件", ProjectHandleImpl.class), - ; - - private final String type; - private final String desc; - private final Class impl; - - MQTypeEnum(String type, String desc, Class impl) { - this.type = type; - this.desc = desc; - this.impl = impl; - } -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java deleted file mode 100644 index 9891788..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/handles/ProjectHandleImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.data.bus.config.handles; - -import cn.hutool.json.JSONUtil; -import com.dite.znpt.data.bus.config.MQHandle; -import com.dite.znpt.data.bus.config.entity.CommonMessage; -import com.dite.znpt.data.bus.config.entity.req.ProjectDTO; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.stereotype.Service; - -/** - * @author cuizhibin - * @date 2025/04/22 17:11 - * @description 项目处理 - */ -@Service -public class ProjectHandleImpl implements MQHandle { - /** - * 功能描述:mq处理类 - * - * @param msg 消息 - * @author cuizhibin - * @date 2025/04/22 17:03 - **/ - @Override - public void handle(String msg) throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(); - CommonMessage projectMsg = objectMapper.readValue(msg, - objectMapper.getTypeFactory().constructParametricType(CommonMessage.class, ProjectDTO.class)); - } -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java new file mode 100644 index 0000000..b400872 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java @@ -0,0 +1,10 @@ +package com.dite.znpt.data.bus.entity; + +import com.dite.znpt.data.bus.enums.MQOperationEnum; +import lombok.Data; + +@Data +public class CommonMessage { + private MQOperationEnum operation; + private T payload; +} \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java new file mode 100644 index 0000000..beaab2b --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java @@ -0,0 +1,4 @@ +package com.dite.znpt.data.bus.entity.req; + +public class ProjectDTO { +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java new file mode 100644 index 0000000..bdbebfe --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java @@ -0,0 +1,33 @@ +package com.dite.znpt.data.bus.enums; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +public enum MQOperationEnum { + ADD("add", "新增"), + UPDATE("update", "修改"), + DEL("del", "删除"), + ; + private final String code; + private final String desc; + + MQOperationEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + @JsonValue + public String getCode() { + return code; + } + + @JsonCreator + public static MQOperationEnum fromCode(String code) { + for (MQOperationEnum s : values()) { + if (s.code.equals(code)) return s; + } + throw new IllegalArgumentException("Unknown code: " + code); + } +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java new file mode 100644 index 0000000..5091125 --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java @@ -0,0 +1,31 @@ +package com.dite.znpt.data.bus.enums; + +import com.dite.znpt.data.bus.config.MQHandle; +import com.dite.znpt.data.bus.entity.req.ProjectDTO; +import com.dite.znpt.data.bus.handles.ProjectHandleImpl; +import lombok.Getter; + +/** + * @author cuizhibin + * @date 2025/04/22 17:05 + * @description mq类型枚举 + */ +@Getter +public enum MQTypeEnum { + PROJECT("project", "项目", ProjectHandleImpl.class, ProjectDTO.class), + CREW("crew", "机组", ProjectHandleImpl.class, ProjectDTO.class), + PARTS("parts", "部件", ProjectHandleImpl.class, ProjectDTO.class), + ; + + private final String type; + private final String desc; + private final Class> impl; + private final Class dto; + + MQTypeEnum(String type, String desc, Class> impl, Class dto) { + this.type = type; + this.desc = desc; + this.impl = impl; + this.dto = dto; + } +} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java b/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java new file mode 100644 index 0000000..63f745a --- /dev/null +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java @@ -0,0 +1,26 @@ +package com.dite.znpt.data.bus.handles; + +import com.dite.znpt.data.bus.config.MQHandle; +import com.dite.znpt.data.bus.entity.CommonMessage; +import com.dite.znpt.data.bus.entity.req.ProjectDTO; +import org.springframework.stereotype.Service; + +/** + * @author cuizhibin + * @date 2025/04/22 17:11 + * @description 项目处理 + */ +@Service +public class ProjectHandleImpl implements MQHandle { + /** + * 功能描述:mq处理类 + * + * @param msg 消息 + * @author cuizhibin + * @date 2025/04/22 17:03 + **/ + @Override + public void handle(CommonMessage msg) { + + } +} diff --git a/sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class b/sip/target/classes/com/dite/znpt/monitor/config/MediaFormatConfig.class deleted file mode 100644 index 6ea1426a64cf2e57ea6ab571e6f45620f6bc926c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1306 zcmbtTTTc@~6#k|KcPW)imCD5%cx$ULpa{ki5+orp6iftb)TiloS_XG_n(4NPKgef& z!b|iA_@j(xcMBw<;LQfjKIKwcsE82p)!mslu zm0jrs3}=>nE5?ZZl4=r} zLhe=RB*kJrhFWxhANdw-3=!v=+qRKmU~?&0I3K1t!tgNHbqn!Se!bX*JoW=wm!=!) zIOWUzxPVa$V`+?If?*(H6NQc$CPlT%Fwz|$u4FO)(#9pC!cHYQ2maho=- zQK9!_#RQIp8w@kQF0rHinyT}znyy9&L(i(NN`}Fb^5tgBt4OmgDlQ?Jl6Hh!7Dk17 z2kZ%URFh%0^lxE`lvwj*SL3uZx$Z867&)hEQQu>ap{_1O~A#GD}N+~AC_xNw~Qm#RM@xdsV2{aqsFlCx3|Wl(J~R8A|`R2-g@{Y zz{1x~@+N7VRz_=Y;Q;JIWWGf*Gy}uPkxa)9$fH17A8z9glF{LJ9lvt&E3A*`TQ7Wp z^&&IKGQ$Tr_X*hqp2yHdmbrWax_TO#I(G0qMN1-NGfr`U5!lFLf?nVZMzMl1Y?I}X lp^Z&UlO;?k<{Trlq|MQvz+K#2((gxd;Rsy>egYaOTcrR1 diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/Constants.class b/sip/target/classes/com/dite/znpt/monitor/constant/Constants.class deleted file mode 100644 index c20e4936facf1045a85a5d306153feaa79bfae7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcma)&OHaa35QWbOr4#pZKHuU@2L(RN<&`=?eVBbsAyw@;IP`gq-9}3o# zSZipQBWST0C2ILxuh*J}`FO4yS2tIt&L#_Nvco24LB}DK4A*yV2mQ7anpWFmrD6oO z<+ZHPjd>_$W!L3I+s1#>bHscj7=*SHhu|!~d855}8(4$N%Lj6(Vib80#+XJ>U@oS( z#5|GWGV^4Lr<-O2!~QRV?#a;1Vvt3Rd|h J9yK0p{Rez%ZZZG> diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotCacheConstants.class deleted file mode 100644 index 7546fc1e002765bd0fc75ce9d433e28dbf64c1f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmb7@TTc@~6vzJqm2P3VSSxq|5maoeuxNauhNNy6-O#j#ZW?*oYCBxKf5em7>Fqtnj)6f`}uALe(7Ge8MS9Ag%Pa~~ZGYs2)bYcWTa^q8YDvgtf z2vKbKQJ6?Cl!hHi)ANtGd8tS=%u@1R;s(4YeD3x{z@r@noY%2{n^cB(ddkCqVKZO- zJAbJ#qPi@pq!71s<BU0Hm&%kp5(&f0>i@QrULe=zlGw_9sL%=*v`|;sw~3eu@p+ zl^M|Rly-gKfIJE$Wl+R3(x~8FDoFX|z9D^hflO9E$6S%tIkKNgKY?r3@(?SB=Twqn WZH{Lxj%Tg^!P@Gx7+pnW-2Mg3<@K}x diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotDictConstants.class deleted file mode 100644 index fdbbc42c19f1b201a47cd2e025b44139724a9a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmb7>%TB^T6o&u9wIT?jC@kHn3nyN78WY1MY0|)=wOcZj28Wa>DT52&%9V)=AHat) zo;DbbapPkC%y;f*=KbUK4Zs!J737dFqfkW=B|>8^AEk(-o{7<99tMU`x=~u0TSET$ z#4p1lh#+2wsWPE>(n}*2G5h0$t$JmoHo}fgPX(sC;T556kGyfO@7vw}*!Awbdv`n< zI`*(nXgc35U6Uw1yC&4Wa(x-CLkl$mT@X5dlo<@tIu;rna!Dw3<7r5!J4%Pc^m&#VDlOjnz4BSQ6pm2l=LMe*won0K wJEJP|&JV7$htdyV-Q@_8F;F~x0X=6aP1e*6SlDB&X7?iY(PAPTu;y_12{c)5GXMYp diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class b/sip/target/classes/com/dite/znpt/monitor/constant/IotRespMessage.class deleted file mode 100644 index b26f0ef9ee5098d0a01ada7193add852c59a9bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4835 zcmb7|>t7Vt8OP5g8n+f}yw*!Jn%G9I32B?8m)Nw+?kr5QJF}gg#n9VyMQX4L7BOwp z8=%NVR-hn=qJoi&rmz|>iRRKCu$pON3Q&lvdZ*ooh_gHI^#%je5a}t3e-mULqT@cANxX^rb$>)QWZjf?UDJJJ3kK5e7WUKQOZmZR>*j_0P>)2mK}%K*6HmW5@lO1do$Jh{ zCusX6+Lacj-xTocrco7@%?f|a1jKyg1&O?3r^f7saeC`=cJ6XElVnpZjN6Ns{xjcY z4USlkuG03A{Loz(!UW26zZw)2UgQe2uQ}Jz^)!X;Od%Tf8?vd!BW27H?<+CGM_!W1 zZf*xuX!k6)fX;sE`EJ(}Bbm3|(cf5gw6OI3Y&2VSnF8Ytf4QmYW-KbpK{KMMios%W zP$EYQ)8;b0box5Og#~M*EjP7jwGZT*ZqxL*^>LH+PdMs6{F57Rwx;fQ{@KQ63F)#@ zUST*fan1V{LT^8w$aUNkOxj&!l0WR%Bc>ro9OwARYZ5uY{eeKh4cs2uI+M)|(B4ja zYTTL}wQep+ArO>yzP&S>Wz1O}_Xs0emWkWHLb|zN|!AUH?eB=%0o75P+ z(t?!o66-SLkSw&PEB7#i^x<|DvL@e_q<53nY=(A@NM!F5>WH5bsxkwb8dA!AYRR}x zn7c!kRVUs)@^q-uZ^AR&xf0p6QpPD3w^Vs!#BFakwgJQ zsf4HEtagii&KjW>(v5cu#whxrqlW zJ`RP^oE+~hEB^`~BWLUs>jW%uUFAKFXPvJD6-qdWp6+CeE=M$Gdjhr3J&R05Yv!8* z99^hUFKm04m5O8UNu5CIaVh9P%?+O8m?zZsM0G6~4;W@NUKUnj6`oyQAW!mg%wmt~ zYsQjjcQ2j002$UEyHlP~`#c%uj@8XNg}%gPU>4sh+!SklWHQ@NQM5E3Tlc+Zez8Zk!~(J^uT(rIk=I!b4X3T4)c>uu zD|SpV0u`onCRv$rA7a5w(m9%-&b$gp($3NB+!XD;Z(mrz2ATZ~dDWDiyDyQgypgXo z?vE1Dpu{^hUt+%LIu1^J|Dvlc6k*$Er)FvQ0G!UhfM>Cv*r}`kZfcRpc5kCxIoqEl z5@)lCGw_meoP(60os(Z;P99BX&X)^GQWQ|Ltjfz8)&%}0kt1}Wk9H(^M)0nlol6(e z{D>G*Z1bO|i|8OYypVhZiw?1XIO+G)Oo0QL|D0o6!GC-$`_W`qt|YE{OYo6ai5y&I z7BAafP(mlRIXxC~s!UdP?Q zKJ_jwdK^v@KfB4V7*^+)J#mq?4+$S{a@(}{ISzmB4k~qxKwys7!f97~igONCX8gDi`=~|g+sAcTFT+{eL zEn0VJ_)FbaaT#47t3TgRT@$Kh(p!qJv#+tsE7?!h;o?lln`9^X3RzDi@>S3?qy+pm zfj5FT3A`D+Rp4#luM4~byi4HS;5`EG1@9AhKlo*V4}iZZ@GIa$0v`q+5%^Vbslcy; zza#K>!EXxu7Wn%D{{Z~9z(>LF2>fHPU*IxuP+%EcE^r0-U4h>NM+8>EQGtI7jtOjl zD+N9Vt`hiX;9m&*ORy>MuffL!t_If#{2TBG0@s3nEAVM>oxt_r-wE6RZWQ=D`1b<; z0sN7`e**tS;J<>K1a1aj5cnealE7`?4uLztT>>Y;-2(T3|1NMJ_^QAI;A;X8fo}*r z48A4sZSbhTcffZA9s^GZJc&w@*uSFiypM`1b(oN~hi8fO&?&J`@MJ#|;v@gSv&8v( QEtw+IAc>^#e1<&uAF@?y*Z=?k diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/CameraType.class deleted file mode 100644 index 50dbbfda017b1059214991cfc31e5e071a863ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcmb7EOH5OB!nXI15INPq_xO9|q^=Tt*W{u@{TV@Chegy$kG6Yu^Uo0-YTx1xGmxmJN zFp`20hmodY@%a2~Y=#S~6ey@B?4D#SzA~F&7-%@ZJofNe2%b*tf;A-6p?g%y8 zSTk)20SWgQ*r0?k`8nPFa`x%7OnMRSx{qP3l*eM|Vu_ZN5Rx!J;6oAy3H8Op%;>^-pKkslK&w%P|*o=`}OE zY^>QNnJK|qE4Q0?4KgXiP8wN@!+O|$hh~Ci!F_8H@le9ra11w>B~fn)ucZ=8oxfqa zg4EUK^m-z%;n9`GQ?}PXzOa^L$Q6L{UK=l$*+leO7MIcYYt^ASqApbzk z32ML6j^PP?E5%ue^qVo}>5rg7NM)5pj?i!d#`P;M=|@ST#ZeGfb5l(2b&~L5wVSY&o4_ z*MGpG%d9(0H!bElFi_V0ACP~+^qgy@HL(|@p0Tg>>D=#}@4Wtg`|KrvIef38N8o}} zt(co$=$dzepF*=z4ZN^gGo5Ns5A7hNS59cIxZ9rNTA>{_>PZMFI^swOsQKd3@>;$u zFjF`vPnL-^9Z4oil!}FXah0K79lGQ$<#Kyizm5UM6l<+?osEWc7#OAiPM4PoH&!iy z*_#KCAcaF1RWYpNFg_57JAO5A1xBXQh1>SFZTfbwWtKK>yH1!*VH`(P9Mv&_V*>sE z8LS443PrMQ`wh4Bqrm)B+wEoFuGh0|fECufU@P11fe9r42^}BeBxPg4qbghx7;UGD zZsyZv&cJCMAK_yPTKW|*I(@L&l#aAC^X(1S*AUlmRzOT^I4_WVv-A7wyMOHddM`z$ z7ufr>z@=_ZJJ~ytbXh}E!yNI?X!wM5yxzID`|K|bx`xjPoz;*fboaOC5*^S$8pWK3 zMYjEACko_q9m`nZ;!16GPHFmolvhPgVETRfvdpzx3N{OzB#LFvud-a-q=pzMc!67N zR5sk&n!Vu@lIxPA^uZgD%T{%4ziih$CXU#Zz^;%JCA{U4_@w1+1vGgzf+oB8?N$hy ztSvW`viA3L)J83fNU*lx_)*KnrqVRdKev%`doCPY+m-Bl-FYYV)Ez0S+Ne2h&f_!> zwJ)CYJaUWE)T!h2U4^-Vvwgv4tgGWT3Gy}lkI4=!)R>}SgtPsnW z^mLL={-l~1e2kG-IP@ny3FPTFA>Sp*ega=b_H*cwXvz?orx<$$!S+4x*k2<=Z&{%r zW9Z@GA}jXz17Z|8#g{pA^a+k<&OO4Z%$V{BllT8+GN91^VTxb`y|kx>FbZZpL3df% z*HYo0#ummZ6%-{$iM(IOH}uOMO*&a+Jo6Bz_J=zziCf{uBVvJXyI!8$fBAUl<-rus zZ{&Gi>HsFx7ZB^QCSumQ(u8WQ$D35_^+XeWR%gOBSXhfF>XFoI&xygv#Edh>xhF6m zASQts#h5kbC7?>+V%+%DxFms;1Qrs;W#g&@`krFx0R}nGtqPCIO7v2Gb?SsZ%%Y!S QPg12?dAxzL%;$Ii046t}C;$Ke diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/SipTransferMode.class deleted file mode 100644 index 14717d31b0341925405e75c1a0b4d7cb7ff5d3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670 zcmbVMT~8B16g|`3el1IZwSpihV3lt9SdkCWR)ioXBvnWXO^Cj1%TkwYx1`@b zy-L+6R@|Crx*ly6JtJoy?^aE>c4$@KRSv8u7-SVegczi~H#-bV*)Cwx94De8DsXl; zcKEtSg^FH=a3a5+-P_DDEPv<m z=%p3JaW{-X6+^hk5c}`2>DJ4X%!%pLt?ff9G}#or;h42ry2+69s7oCtyn8J}>TDTbGw z;M;N9EqXqJC`U@En8pl03Xw*QVI`?|cNk&JG0fklNAg_hb@w34OCq)YQOg_Dcnp16 z+qK@;%LS{tYZe@`Y;~wp@2X?C&XuC+Lr(R@1i%yKw+%1|?UiSButL zn~NQ9c?stDO<9|#W{J~3i{RQYe-;3m=~~k}qw!7_GqozvKffw9!Ee1VBC!jm&=kZJ6p3{)C>=^=@MqmEN7-(3CnC@`L;EC4Yq4wZ@h2LGDSr>Hx z1HqqQ`_dVt+`fEWU!MMhqO^phCA7pP9-l)JhNP?|wWKhFub`hp c;mS4OVnU%HDHfu$l}L+*BCoJYJ^{S`3;or3Pyhe` diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/StreamTransferMode.class deleted file mode 100644 index 8da45edc4c021772a86ab4f16f935a99cb06243a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1823 zcmbVMT~E_s6n@^VTf0#Z>IZ^fs3_YMD~gH?kvUP(sU*WCM58IAVoleXt@FafKj6>s z%ETMRFQUy&Hvr=(sE7!hEmte%vg6z4 zGw+FSR;r%kS8Hau>eYSA^XXIBH;aDFwkiuX%d0=MYd5RQb^-#5ju_$s(L0yt1ttoe zF=d%b(~)4R(5=Vr94L*#bLK>B3{{sb#vBw_@I2dTf{dY!dz0tztmOAod9K{5P2O8Wqat zspU58+YbfKq?)|*u2rvRn*i#k&M!cpD$i%&^4S21RM@8g0&#F); z#ed{bBN9bt#k2fIji8Y>(c9@l`?O;FvbfEI9L`T*5tgk@mECaGqN#LA;CT}%&*fC7 z6;5ZjmE~lGe`^ddu2R7z$&sh%moZCEj%d=!RmL*!F|;||?UFc1Hx?2L zTxsh(yxDnot8;IX_xWFBt^??ge}!0#t|D4oR92xD7h|g=HPdZuwT7#>7CPS#i=6yI zzQ#z@7%@gZA@vSX2^>?5B~)WEa7WKfi#YJpcdz diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/ValueAndLabel.class deleted file mode 100644 index a6c4b8ef38ffcc10a734da8c626ef5861cbc6210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmY+8y$ZrW5QJyrPhu(&A3_@s!OqIYDqsu--yz%7I$}H(RgRrw?cV$W$Cz&6pOR8oj$lSlZCc1#)Nq-Z&Fz4 zDsd`mt(cHhng@`uT&=SokaKHXwf_=B1tHCS*D8H9RudL~{hM$(B@jmapFq^lO)y26 Ljf3_{5`4@)Fqkzb diff --git a/sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class b/sip/target/classes/com/dite/znpt/monitor/constant/dict/YesOrNo.class deleted file mode 100644 index 8ac476698f58e32744972950d9194f55b2e0c183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1645 zcmb7ET~pIg5Iwg|X&S;;sC)?uh|&}xpx_5Z1QC>(4m?yl)6ti-#2O||oHpgbU*V&_ zz*iMS7#$s-{U7=>9QWP^Ewm4`GtJH2?4I3ocJKZ9=gW5h^LQLZh+(SWm5d$Rw~W{B zE8i%2uI+nequ{v}-*kQYRPc?QRoO0Yc`-0ZDk5lO2`cV75tQf zI4(rdr=lMN44wZS*4=7}ir6!qs>pD++vtJ z&!}X12UgvkG^a``o}`r4yd7$5SK4;1t!gQ6m7kb-hb*g2`06c95ZB!+m`>I#+Z;0h zmRz$$_>%w9Cd#plU35*qS|-zEla$T$q+u^wzF>5AAcHxmc?4YLrGgX8OgN!u8On8_ ze7=@iqP3hlm-{KfQw&PRtCkDahRwxQgM&ZAPs++14MUv%3y7=?@>>9)l}_YyZ_{PNaEEr|wDO;_59KpDf1v9F?HKOTvrT-9k$*oH1OIu1gjLa4 z@)*58z_@?tlz)mWYRwBvqJ|JZ3FO5yK1Y};rTUUn!$%lQP9I_0c>In+R)H vwaFvs2M7zpbxE7n3}J{KW9|S7SFYBxPN7gcDW+0yW2AXak#%ecWgh(nUi@i` diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class b/sip/target/classes/com/dite/znpt/monitor/domain/CustomFunction.class deleted file mode 100644 index 6b2ece23270bec16db0b0abbd79534425f0d2f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmZXPF%E)25Jmr@h@gdu9s*+GHdbnEOsGsO-~uab$P(B!xL9~J3lHF-jH6acF_Za! zW-@Oc&)Xfq5@Qbz!#p!J&y|(@s!x{JMk{L?o|{@I&3EnDnmTTEW|h$%`V5m&Tm-L# zF8JYC%FHtK3Q2huM*IKXn!!(0p@nT5$>4@jnvxf8(p7hM+qD>i#I#K&V^z`q^p|Jx cJ~v<>0{RGGgy&*F+9Ty)Nb#+F1RrPg0!~sv^8f$< diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class b/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.class deleted file mode 100644 index 07dea8a8d8d65e38e0d82df9f008ef39aa1b3e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17318 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class b/sip/target/classes/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.class deleted file mode 100644 index 2d18bd0cfe7fb1cf31607528e47efd389d6fcd34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13586 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.class deleted file mode 100644 index 87e0e55dfc365da8d5643f7c47adb70de96b32c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1786 zcmbVMU2ofD6nVrhQ{I%YIv4a~w2SZ{fUX4?sD^INwc zn1>!MJ>P75hnC}-zI|lwMn?_L{nF{&Zny8*M*_1>pG)5!4D118Hp8I9!0DMyXAsn~ z3^H%v9C8AB%W}7lhE`8tu^1U9*wso8q;cNBd0Y^f@7Tdk5;|WjJrAy6$-qSkp0OqJ zK;~fCz$`g+tq(HeaTO8132#@6*D00j>GLL{*%R^M2}BEA0y`jg$PQe?s*7r1{i1 z5<+-V>shtLHzSbtg0Ahe)TQRtL}3Ulgulkm=Jo=s_0_J`k5iTY?B34q7V&pjJ#3p{ zk9}#3`(*dLq2IE%9hvY;Q|j@Cz5_1Gi9P@I}(8 zGiwS~v4RbrrBKE)Hn~#q5wRAL(e!^XuR(u`B@GHcogF40#hAU+BJ-1$v}OEcl9TB< zxgmL1^)SAWZ(R)Y9sN{#ujFcVbt9Bo$kn^u z37lqtJ6tKqQc5EfC}mxR@{AXtQkD>u1Rk-P61(vMN!fADW5@u-YKVC3rZvX%Q diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/req/VideoInfoReq.class deleted file mode 100644 index 27011a981e4debe3db3523459c1090ffbe989ad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2347 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.class deleted file mode 100644 index 95b38dac1a9209390d1d7a5eb6e87fd6840274c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3692 zcmbtW+jAS$8UGzwt6fQJ#}RQ7L7FD5N_<5vr5DQyU_wF-wh4A{8+v0SE%qjoR#~l0 zlU@c|%FuF2Je_G79++uia32CB12{7w-1ccqP8%ss8|!{?4A2CELr8nU1a9 z?|k3y`_6Ye-`Rit_wu^{Zo_XU948<0tH*FOb;pR2~0z zfwu0RsU!>}b)-zBVG7()bSwFi-o1pE>AOea|gR_6`#}B|G8S70WxBBI`yIH({56QM9UuPR&|n zfv)bB{Z;%!Jr7CnZWCX{9)XT&+Yduf9&hXJY0(LNmP!4ZiLXoZ30vB(OC#SfakDg% zqLE=0iDY-1=#lJpX?ragDd{uO-;f+xi$_XsF_D*&By}djkYf0jiCgh)hBRZiyQS`1Re#DV&)Qn@ zQ>*fEX7Jwv*@@Yz?^M{nb%zFqt5w&xe5%$3dPZr!{-`xQZF_k(c0-aMt~q1OfBA^# z)@;u|JtUybNy7r>wZ~q#_V}Nc&ON)baDmIE*Z#2j((kXn^X$qyuL*2fo_}KLcW0Mg zesksG+eYBNskPSiYTfL07Mya`;jELpenf;vl(}{N8QWuRWi+{#ZWY)Xh}QGW02X#1 zw^Wd|^%iBN#i`EFNDE7Wn(fKW6{wY!4lJpLWvLaQv2368t>Vcss}`0*J2Ejcc8F1q z1aqoBTjumN*L!Z{*1SyTn#YB6G}pSXo@;E9nsjHqqJ7wrt-t#VPxvkJtO)G=vVLZn zcdjlxdF^lWs*6{y{CV}=`PJ7iEnoaC_Hr=AAaE}dxDlfmBR$S*CWia@{$d#KpkB zhxn9YpaVbVQ(7SaKfzD=7IOCUxnB8A=ocuAp{d*zsmz%lq1?Vvd1s_DZ-xlv&W*}9 zMJn_1h)}*^qw?-ZW!^6l%G)<8?~PRc8Garr7nq?K^OWfAdkcDWy0x-M+ppJ-YIGq#F;t$#`^;fG^ZZd? z?<>&a=lec@@dC8A^L_8b80+s{L^fEG_{w-cABFh9KatMHKg8Arm;>4PBK9^Axq?PW zu8_!T5|j84nFX|GwQQmVw6CBOw69=fbqO*;ke)SKK)r<|LA`}kHYq`=5R}ZOT0jGZ zG(iIeGn8@~aS8F7_*2DP8=9NHg05R`sb=gk<}Wa-a;Y}CDugj52ZCw&;t=$Bh=CZ(XQx1PAE6SLbl;4mZ8odG&~8P zRE(*A9J36tjXghuIZ|=l&H_G4O5rAbJN*lhT8-e1g>HWW;qCLa-DN;&Ym4 zu49tX1+4*SVB+gpAuQ1XYa%ytL$JOc+{8x+LKS0^N>eLZMn$HHU%#s2OpLsNfzh{d z+p$adZsvQ77?g$QD|0~6IZ5B4=zWqNRy1LQnS+XEXAEWz@v(?|Hjez(J90EESqx`_ RF8$@&4gV|p!5jY9{{w&b-=+Wn diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.class deleted file mode 100644 index aa24bb023298759167a8d39fcef6439e4f3c5b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7410 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 v_;@e4c{hgx7Yn7Y+Px!99>A(ITpYaSC diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.class deleted file mode 100644 index a306c9cbd2dd55809ae63a7918f4c943e5abc772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 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 I=jr)>0pl4ljQ{`u diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.class deleted file mode 100644 index d40246d410e2b52cd29b9c1f76d8729957d48407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6821 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 MJK;a+UwAS6AN+X+dH?_b diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.class deleted file mode 100644 index 0e9eb9aa8fe42ce3734f99505bd767e476a838b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 l!=Lp-myR%~2Kzu)7Hq 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 QV*MWUS3Dk diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp$VideoPayRespBuilder.class deleted file mode 100644 index 89267cf14ebe6493a9d7841a9045c56da3709e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1805 zcmb_cZBG+H5Pr5T^u?xM-pn)4&dkoAzrTJ1Sb&j14Dloq8v4-Bklp2bTyJoD zNB>aU6?KoHe_7hnTVaS7iq$kyNGFlea19#6THUd9Q+h)GYBxRIa>&wgb$ZkFxJwn_&8DzThS@G`isuN1U`7fP4C6BsUGwD! zxUT{{=)eu?Zd`;r&A^I^;Uf(N6d6*U6I6;}q;THTpaO5o9h-Y?mkRu@BZJG8-ikya z&KBNSA>_oWV-o0KMcU$h+o}n7i`N={A31g2sB%}TeR!DgzQ`8Cn;t_(i`1=iDgNiK zMd|HEJ-~ko;ZOUzcy-+Kl`|=#=NG2wTW8e&snHb@?yISZ!LUeOcKH-jwKAJd+pUW= zsXAmRn*TZVei^j4wk_P%25+?lHOg?*Bz#$zq;V9Z`5B{+=Af_9Yyv~c*UL0Kpav?P z%#fzj%G62e2<(S%GD}kZ1`V}2l3HLurjKdI2=)m{5`G+?hs6h_gXd6;9z8`RyZ&=WZP0mcpYYcQ4Qf4l$XVBK;5#FTyW` W_%S>u#28-SC9N64Ptl-XLi!(+&C}=r diff --git a/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class b/sip/target/classes/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.class deleted file mode 100644 index fd11d5a9dcf07bc4197352830f391ba2f1816238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmbtWZF3V<6n<{9o1`Iqr=Q4Be!&@kgCA{wfgeSDZg!Jw({#k4FMIEvd+s^UdG0yq?(hHn zcptzR7UBpY9EFmAiikkRb$vzG^18LGU0k?sEV=@banmy0;{xHK)O-tKXo(`8z&0cV z4lUXRZOL>E?E|amY6Y8`wxccC1>Ll?6|mke8*m(Lmf#;j2)3bYiAB~!n2qi6_p zP1POFxsGWqXQhj_1lrLd&{J|9LoZCr4HLFg(A_DsL`)stwz6yHH7UtP(IqhP|IrKv zp`9w5`6a`NqZ8pcQS>CxiyZ>7Mcq2{URlo*&`NiDkpB;PnFB zK9maV@I#cOKb64K(s;y>mP^vaKmvR4j6fevP_tR!T~%}S(511#1oq)sBF*Wg+-ZA> z%<{A*qZks{(a3Nu%>4+*Fiedg2}8BhITpu$j3#gZ8e!_iqG2rwj0PF-`S#=KcF7xKnQ z%d%bFHEpXTkeV`Wt@OUWylgm{USH8p7R_lgm!EO$qT#qVvI6Rgo-dQj#QG=Su77ra z{qrBze)^aRJZCOjx?6U*biN@I$EO}I2{)Z@_Bb8(tl#-)?VC^j{P|PQjuc5{X!&?Zx5u+|y`+A9k|$K;j7=5%56OED0vWz-vt4|ahlHv4RaYU^Eu$D;tVGECZ!$- zIrF@}LaBu1Nlw&ooJ9*JagHm}=>X;OCw32=m+zwcHs@l4HzDsVUt8lSEvo775tXW; zfNFOInCDXUfeCqAQA@fCZf&oWit^AVXskail_!kEB=g8I>yinMhKVI*|wH zx{21Lnv7JHlw0%_%o8t$vmS;T7dgC&St9Jg9DgT>agdx{qAZLw<9LlTg%R$-JZCC- z--XvXi{K5~AK-^w>~FM15qpTS9nbQTjM^9rWh?t2oqknDbQ}X)Ge| b$h`_2^5Y8OoeJ|;agAe~_B+|RbhP{nny|XR diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.class deleted file mode 100644 index 1350c8d3ac968c8f3524c3f8fb5bc21c1e27d9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmb_cO>fjN5FKw@LO-BDffg1nh)U&xFXgldX=y>K6a?CpxO*Cm{Vn!v~`jH%sNMua1d9xA9Ew_SC3ME$P7X0~5nN%wJ>W!`T&AYt`D`MbEDKeY zWUzP&{8E(IKrz@VQPJ!3u^8;`#AiWbqq9NlJa$&n&6DP;a#HbFmTtgcc`P$6TxF5L z@g*Rh$K9-?CKpok+VI*_(m{_;V1#8cctL4A8dciKocJr{MBzJOMUD>bP;29e7NbiB z+p)137llZs$Yo%Q6Vs;-JiH>XrCO+p{wE5d4^rBF#MvifY1eNU94ggC;^Q_0zb0+^ z2X6m~n0|&G<=#gpq+&4YOysf^3Dsb*nl$>|Gbxd{(GV7deV{)WUp5BAo!{5p;t`)e z8R1cv^xVHG-Fce6+4HCoq7xPG=>_oD}H&Yf=s k=QWRa;_N*(;5J=&n6~8(S?%{Cp?r6`J+l5PqdOw8=ifdw28P#MKDD!OE0-t zJm4jY$eOu`GZMFA37QemyT|#1HX(z~R9iO;LxYy`Pc;Xtt_?~Zf9Ti`!jV+Dd0qBJ znJGoLCpt3$Udot?-LJL08isz+a2g^8OB78SP)391!74PMMW+U|p+jr0xL%`Jx3IC; PZZ5XnFT@sXm&lzDbervT diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/IpConfigMapper.class deleted file mode 100644 index cf96983223b967fb84d3b604a9c1fc80847273b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmb7=O-chn5QSeS(MjS)@EAgB<8H)-q98l&L)W>`E@%i=+;0k92CJL9eGt@}b^lE)1e#mQTy1q73!Ey@9#gS1(zt=lSaFozcSD~RLI2=xx!2z)g~di%%W()=VO;-*mg^&d z*ZJTuNaGBPC2ga`@i)(XmgP;Uu-v#I)cQfXWaQ#+;MLw%N~bVQb&}o&Oi<)L$0E<= E7egv)Z2$lO diff --git a/sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class b/sip/target/classes/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.class deleted file mode 100644 index f062871d01b38a2297ed9296191ae245efd84bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmb7=u};H442J(Jh0wC_06YU;x&<*XbZW(rCvb9Bbye;hT`rO6&)zVt{wV3i1NdI;aEKo@~Ajnx$0;8fYQY_8Op zWpL&wHL4q`vTN3q*Jf?jHZssn;OM5>R25UTs><@4O{#GMeO1bFyJWbi%#D}+WKHKx zsZgg$okeS%6(&l;WP=-~;@Kz==&cx4OXUrR5?K9fgVR2M;9TL3VO0w=2r_`QUv4;5 z)!h6b7REO_xt3E{f7A;Pz)WPiaV-&gS1fe0YAk8GGJ7IT@F_Wqm+Rb6Om%PIF%ef(K zHkE@8tt(iHRIQb1z2#y21bjUR-076uv3x~{!otmICUdFpkW1i8=g7}TKz`&>AGkel z;(@~w!c@CoWP+RBo==@$r-Vjpewl`4_*p;WZPbktc#>+6k z6-NRmBxJH=PnD_09KC3m7_JW9=2*RZz$9;J_%C6K`&S1i>gpm&a+2O!w3;*h(rtx=m}qi{2Do4}AL7=tN`%i#{T z6lPNk%fTO=2)yeYxez58zi37p5N$bp5b2pXU&nO$j+Y$PB^pPF8@7&IFu_?m?h)AO zT(BxsV6+d_P@Kw&iW5N-&n=z=hPga2e$i3z#?lH`Ip)vM2y9A+Y9jq?7vcmL+HlnQ z8tw*lg8uhennOwot)Hy%XC*fWRUA_5~Ql zui3-UgL($FE;xdEZ%pq)J)6*TF})x62OtmPs~C<6IS50cyUnTZl7>{&b^M5a|xw s6;Iv^EKS8cxR3h};Gx)m6v)T$MCb*W7V;^~2>Hx=A8kIz-!7Q_4L_oBSpWb4 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/ZlmHook.class deleted file mode 100644 index 4011910146fa257e1bf4a18af10a6dd92b133182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5437 zcmbuCeOJ^*6vm%HWnqniXtCNiwY37aruAJxEKsSfsC2Qk)!J=#cXl_BWR_$Wgme05 zzfXJmdiqB{KtEJZ?o6k?Sj7x8f2Epvt&3%dome#2`=E+t`; zc?@7MhrETOuo$lGBL{;ef_YDD6nH~~l0lB`Dy1TY&DVJ#?M`5UuT73;h@5pI{y^m@ z@Td_#$Z-op7>@Nkl(I2XF7qg2XlBvV3CyaeJF+Ec#KK9OV(1saqUUTf1X-l0kgOth zPRgi-(|Da>kTf()o*UH}L?#(YR8}P|*!JR_weSYsWH>5<0xyfO^0;xGAdco*+6r7M9BCTbbnpRj=Ep6QPGQDr% z62{_hXsOOUZ$Z@DAmcaP3Ct>I=R!?bxQq`NhD5L=L+a83kOw{}3MxNBh&Qw%3)j^eD3IBz(fyG};Bxi>Y5eQD7L zouz5q&*2jbGnl0XTyfSN+oRXrep*`LWwO@(DVJJ-X@)~%_#q0nF#_R9qEdIl-x+3sS&zCtr|K$-w@%dy}?U%$qg#Dvpv>c z6p?)FG#WIJR2^A&yrz0?TLi@_bw0(g)%slMr7b!ttK{K6vGh7Mc_e2=Ws|U3rlGqT zS)rd-|j-Ofe#C}G?S+{&V>%Y7M+#j;c?CpPjd>(*bQ#X&= zR95*byG~nIoF|K!rrmEJ&MKdwvk|rVrQ;B&M!>=$Jf^FAG@_4=gA>1jUH${PpXs6x zPv~zy4Ft~NDg7Ny24N9j(iIIy0Za7%XLNp?j$hI5@(ZvCU*j9Pmt%C}TRNd{48sQ2 zF`YGLWId-uJ6SJu7HtO&tP?uxs*&|wD(j`rqHUjn^_tGQYh-<&$|~wC+S(adXLQz_ zk@Z6=%h6f1aWk;q(pd{eRw*VIGqBF7VWzXtcyD9rIA%lWz}>R z?Wqi`ah=7Dta>WT)mgMtGO#|>S-z3AlFC}uS+w&pus+sVO(V-oW%)Xbb~6Un4W0F) zkrkw}gwCSfih*@UXZ>VkHBwn?I%@_Y6;oAvr|GC_Z+_xW+?%-kJJ>ID)m?l?yI}e4 z;+u~vc~THnk&Y;801~rwuJWFzqxu;f>H73*IQu07ZRz`gjCcV*Rmj$oO#o&6%Ui;ncMhWKDCL|mx}{$)q`~c;UQWGB+-yZ)MF9VXq@xYZ*Eq7ylll-!}AZi CIcwwq diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.class deleted file mode 100644 index f1cfe173a623bdbc4183a30420f828bb16f77561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2954 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 XpMNX96Vzijzr*-l?CJM8`on(#C3#gX diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.class deleted file mode 100644 index 605ce03c8d09fdee16c0b127c0a37eee3770b298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108104 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%0AKWq1_lBEU-F6u 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

    AM}m9h4?@_MfD8?RCt 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.class deleted file mode 100644 index 3d8dc82060a9a7a01604485bbab9c23cdb995836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4945 zcmb_g>u(%a75~k?W_EXMuh)-sNSeCDrGBMLN>kj~#Nafkak0}77emUc6ML{Xws)P~ zwSf>G<^87RQA&aGk{Ss`0wn5+hY)4A%v!lkB#%!x|1 z(wwr892s5A!a>$X&P5)sg}aw(8>Qt+Gb~-HZZ=CBH8N}U(nh#k2})Pi>1)JYUKd3fCo0P_ z>~}Gshst}v#Z5BIYzFmUqaln}xj2YJ7E+tFI@i({nP#@y3|GRsn&+^KTa>b~v>I*% zqP*3`tF@_F4}%Rc4ZFBaOzG{_TBDhx<#rb%7`5Om1=TZ`w}N#G10#_+bPmg-4+(kP z#RQI8uvfz7IrTULBcl;=>w#oTN-kb2fis~*ZHW9%7q7!z+#<^7CBg0N_3w#e@+X?R zUA$g28EU3CH^p?13tvoWnr4^9a>B*QU5nzp!NnWJl9eY_xfI?h7x%WT3o1`yJ>%lO zU8_o!Sl{GgR;&&qEb43}@Maftn5S_yXsq5_TMkuC&Dwat!hz2HKebg^Uk>XzoJG>X zc?$=l6*RJ^eohMOK^JeuBG<}V39GEBqtTr(Nr~oLo6J0A2XCi#VuAe=xYX&gjLt+ETE-7}P5=HpWzQ zwbHOKIrqP{aG8bJcu^tlDgIWL&8Tak z87!^M2b*U9)9235&YxkvX1P7}u(7q?WR6TKx`#U!oElaOOb*M6c;yo8VciIVS`SBL zo+LAD=FKhCw(3jaeHE$1-e?csAuW$vd0Hg+F3R%CcM4HL&U|&}S+DLqdu2&-FZ6megIquGQ8F}D)Dado*sJ^)=w2}lUH#AIb7z|)dbYh;K-6=me;-F zpTYhKoe8wXJ+We*w=v?bPH|tXm?v|LxX>v+5G&>(9wYAS6d#Ng^SqA{4|a-gi52s; z79;jL#YbYre5b^SZ|)S|9xLXnCq_KfDISj%^9>avKGG>J#fqEQGGd=qAr+h%8-E6N ze2EQehAA;AKdE)8%}r~;C|ys zuS=XO_#m&+jC=Cz?Kh5`6%yxa{PWzr-#BvCNSqJF#~Iph9675b&WGdU9NBLiIqM`2 zKNERneiDCVjScYpS{omG8tK&a@!!IE66xgi@!!CipBUT0Yt)cn?CbFZdtE~6Hl!}EJ3^ZFdq|r03to?q z3Wn6<6(Xe5elJO<{i4?^q@p49dc_E7#_uC(#_#v~gw$_HeO`Zyl)BEcOh#S_`hD`e z-iB7QTWk0TKFUoRuom$M-!TacTQm3=ZApw-)A%@13NzL)K0%b`C-Px@k|=|9+`y-Z zY{vQ*K27A{G5iUiAb1uC)&Ce#(Yl|n<*yL+S?Bos>8nKj_!`%`fy1`*Z*<#m zUcjJ@1pgfC1>B@z_Wui+6#lx>)s1_2ms2(^Wi5G+zKV6;^&y*X<(-*)gikI_!k-;F zO!5ipRj32K(p^?tfV9$NZEyyp-`c(jMA%+)pbPJ41;a zFWquY`WfZQ?7G-5T2=OK~W?nhri(oCNqg6EV^$Jr7(q` z<4K}4F5oGAiztI8i}~9`Hj8T&-yw4FBPRbTqAY%gJMmqj9R9+uwC@q+rK}Q36mQUw zvf)@3O9_^BgHyG~2{8;H-6FI&sl6sc%S32xW~bGV?Y-nSKgMAs&Wj{%RlLs#`JWTL zK=Px1YP~7>$4b20$a62@Z_oa63=<^((m~pBUV&snxi1^49qpBQ49Ifh4_e)&cv@z$v0(ccPJO{-Y=zB-A1@L%v~J%9iJ diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.class deleted file mode 100644 index 7e578b0eda3a89ffae099676cfeb28e3db482548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3755 zcmbtWYjYD-7=E_h&2G{K+CYIQD%dK$5akte)8{!5cv^ZXxHZWdqaI##?=BLyD$KEOf z5JRh7tf?6qDi&oc;o?5rPun}PjLc30&0XDxh4Fxk2l0@B7@eBbz8Xk(-MbqxY(T=s z!vvGYJ9=bUzfr{6mf;b7N&qcoi`Ng8F zlP(^UwN>=J+^p57*#&|aS$ z?SH!asDv!#B8?r)?R2ej+8M8f!v;l6#T&5G#nYlV;)_;Q2D@DB#va-daqU*4e7$2s zF81LW$`h<=W>tf!AQK@y$RO!sF2-d`EKNvA#G?Z)4&pg(&UmF6UHGhp5gU^R z)+`)CYu;VS=B9jB&;$|=4l{ra-P0vW91!k{E{@~YXQ(Fd zvZ#1vkz_6Kb>VIBj9vB`t@f>FoeVhe6wPuVo#7e#)~izBipl3nl>t|*DWhAAW?h_A zAu1QNURI_K%8IdU-rrxDJ?<9|dB<~EH+uF6f^$5tV&x$$!?MoWE(jAf%i|7j3ZJ_GH=wIBSpPAO4OSJgzq*O zGAQ{x#nk}u9JW~5)BFRBD(v{ODptf-R?+^o63X!zQIJl|l6Ey5c@(&cV)?wP4yuyB zmg{hiT*KNb)`~b0mcb_bwJrgbH(bg$Qq2Ec`&IFlTIt@aDzB8$yNoO%VvE8D2?{ z-P8L$I(in1>v*r$kRaX!tD=%L@xl*NwDGPLNmYs>Ug%+pdhc41l(i_D3s zNICe7-w$t-isEw&;vG^kR5|DND+l9F8{DtKn9piVD&L+0=Ev;io8s+Ru2bFG|+MtqoT%k8o6#PcfYK%WA=TQ1`YkG${pi;lC zH9f<`JFUG}VE0$C|CsC#rc7ZZ%z)!aIcV12l%-g#1SRAotQu=L6;Z6nJd5?ArAAY> zVzD#=DO<7Dg(q@CyBQ?186V?3-sd4KT*L>Yni%@?xWEH8qXRSekd%p?OyEUQ7QcSB z;3HBI{?<@h5_ygX{{yi*+%Ro8hQU<8Fz!&r!n#Q|+F{iIHH_J~6~H2Oum$Ae-2iMi zf*0^1j6lR$BC;SA&Z8j1#P2Yjan`!NUB|9tf>+|9`14h~Ac?QyrTD9w-pg0~n5Kt? gKCbCep{F!GDEJektC$HN-1=G`o4+VOQB`{BA2y`ScK`qY diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.class deleted file mode 100644 index 923dfde29f429c9d6dc0e1f34d4297aea66e5b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2564 zcma)7T~ixn6n@?$o82TEK7}*|6)jpw0^bL*y15{;Go?V- zlv(OBcU(sox&>l8rhRk2X4oaGBGZri@-J0vbH}XZqv)0C`viL0i<6;V(=mWSfe1sb zm5rxntv%43WtB~%!axG&bR=csIMJJyZItJp+9pfVFr;G`uak~lqrN+D6-|NQ*!Ysn zJ|yiUI^M$D>|&-wlCL?|tq4Po>Uan5(y@5bNPmYmBy>#2I8uyJZ5HYWdSyyrM#qGV z8MRMpRFM@(oHDRs*GiS0x&2bPXx5^b#E6E=M6}F#%&TcuBBpeFfGbRIRI6sCC@|rl zw;M3;A3;kF@;8YOWr*oEPj6FvUAKB_$a6rM5x4DG4YQm;X5_Rvsy-4B<1)n!9dno` zpSI;j;fz}rqgg07*d0^%a;ajj?(c1zwM}EY%)#|7TLq)MWzyQR9o^zzyF zw}nf#AS@aCbOz1F1r*EPm5UdbIYvFw1-cx)PZ4tf-uQLb?0t4S##2_f@h-rxif`CP z;hPns+H6Z%TVGmPU~NkrY|X6imu+(GOR0`}@nfU@K(V_2><#)?!8>~6TMR|mT60}n zK;FJeP@JI6lU3#3Zdm)Zg1K07rqM#xBh-GMPW=cabd>%J;s+?fqx7E;E16USLFY4-K8ET_4d|;GK60UnzY$A@o}>2= z`b09+K#zy$&nblT=fX)vV#3eScZhgWNrru(L{23rk<*f@1Zho>n$$c{=!m5SvB0M+ zSQfv?=a+8D_!yt?i^XFJw`d>0cleaL0Jpt_W$J>w(F<6i6vAipU8SVpb6m%5N?{z3 zur*35zQqs`w@BVPBW4g+wSUp2LPTC*P(?3)ns|Y8t{Cx)jLi$*B^1+q2N*$-Ov>^D zuarON0#3?TShOr($cxeqBQ6mWruW^R{7mW?=Vv(yeRa4ezf01!p7bHqi3Z+yDE0lh zkTfJiO^YT+;hGXT#W8UTj+2&D9Mf=TVz0S5o0SD|2OHRAMH)%ELn(kbYu#eCLGIFJ z5-EwjfduYSQXJ}@Ap8>N5h8U$kS)Gm5`Ov}kct5)9>BwpMZc;E3;T4Z$aXEkER+8u zE`7-IE%!wscW?gOHU-^TBHaZvd*zja?pK_D!G)jNoO?Su^PjSV^Tl@OfsW4nyrS@cUCCKa{f^0d$9S*rQUmYHzML!fOL@kX6H>lLxq<8L Q9QsE;bu#(~&WykQA7IYpcmMzZ diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.class deleted file mode 100644 index c72200475e9e31c3a00fb7d7fc52922ca1383a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 zcmbVNZF3V<6n<{9Z%MaMQri+JTC{50q%2?sNh#7oE5)|d7Av3v+hie&>2AqxaE9@d zf5I7mfPCSD&S;p?8Are1jK4|5=k9LWG=v$(nPm6ebDnd~bI&>V?%)6Z`a6Ir+|iK| zI9>L)tcn{t)cdrmo=9>0-=fsBrt`jZ>7u~wdJ>Hgl&i8AM?M-KKK<3T~^mQ_mab7bqfI)!_<6Ls= zio-y|3{>{4Y9nL}tL)dEct00i?nXKtG?B+40i8~(c35SYJ-OGzy6fE~)WEQbBY2%W zt9DSm;8z@h^w{{KWHl`9M@_tmx45;lE-Qa7vTkIU<82e~;9VN339Cad=OpptCMHl2 zP~Es1{atDyag!#F!D92aBjUL>SVCLJ34x*AV#VsYhFfEGvN(>T2Bui4vQOf^uDoH^2GWKrwlA>`i{IDvgJ1cXHCR5TADR)+psWotB zY-=qukujc{Y;1}bz3ZV}{%YCYPBx*gt}QOllgT3MPMRd8L`Q6A8a40)@hd*otV{VxcA&ft+^v2yY4sYWoN;S8nI`NkIBm6C=ZIk zTQZH5JcX1}@^n!kR` z@CU?laiWQIw45kBfgVdum@7p-O3LJ4=*cTjao`cm$-L4;UklM+QVHoVX?ay*w5P~D zLT_HpYi*#Rl1|W2$;j&xWF#OxZ?r(lV^T}wGM|z#(2I}x{351|B`kAA@>szY+6VA0 zR;iO)b@2&xX?{P-SfiwHy?}K}Dn7$`T&1Mp0W0_^B^}@3Fg7R|v;sx+>c&6Vr$c0( zVNk~b{tWR92V*hQE;2ShFL6O}hVK+3sIrohe(DAKgE3%-zDm-PzK}O?97dcVMx*z& zzUi|QPjGmKoiJC1`=+Zby3tp71bwoJH*QOPe@T&sypmW9*^1aSR8k`oyAU}Uc{MT( zcQ5R@IA_8v&C*=Mbuu!@@CKz+)PT>)HqCK6$wtV+&SD5(Qj&!QzJ~T3hoG=@LagdA0Xo$=hknB|s z&)^HrKV$UA4(I-^&iur8aUSb*KG@ZnpXe^m#ZKqpuFf}cD{(HdJ#zB2iNY@!?Y`-F z^t7GP)1q5L*6KFwZgIw5HBNl%2yF7aMOO><@F~7(9C=AeKK$|}ac*)~vX@i8;rR6@ rIGKB|iTCB$H*qF+HkM5(pNr)ozH;aJXkxCjhV8AN+G%|y>ap`53qAjk diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.class deleted file mode 100644 index 15cf82e6672b3ff97089f12c103ab53f7d6227ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010 zcmbtWYjYE26n@@hH@gknlBTpJT#Ht1l9tFtfuu#C7K!u*yqEKw%ln-3o_GKJ`PgcZUy$6eXH#BYT$hC>G4vhcRxPyEMRFx`&0sfqJAK;O4;M4%Bu7o<*Coa&ZS&F1BR$1Ili2V`U2uC33O z^Nv@P*)ZZbCUUKh7EW16Bg6Wwcu9%2h1>8Ws2K~V@ez+(YZS^*8?I4y83CTPa8Ati zd$*<;je(C9Mq6j~EuY&g6!T6sj9F+VK2g}!Sv?aH(u|0+7CyyAy06U#> zDfs54pMIlD-^qn!$WP(U`9jHA+}v1os#omQB9j`OFX!yyHM?4nbz@VjvR5di-=NLB z>d{><)OfVA_-K*aph-b5yX(?!b_i~~SsIqNyS?o5gno5}eNm&-JV6JQ3PV1kYqx*J zwR86u>`LQs`ts%M!W<*ZvL<-Y&7w=9w_WPvzK4PFE;|u6pM~~o!nV9p-mK=F^95mY zsFQ-ja%LQ2S V2qGX?g|mQM25)4obCeE$12>7g#nlq!isSxgP&c0Fh0i@Tq$W%zHv26<9*!wHktSy zy7oBvJJfg3gO8KHK`l(u)n0FzNIu0ue^$r%;w1ml+SDJ|5!0Sy@DZ%3m{!L`6Ol~o zge23Um@b&mb3`AZKc>e*ZJ<=zASjhKV}^jt2FQq+O_27Op#>qw3V9q@-f?dGA>&K$ zI1CkPOedb==nOM4zPK-vStsdcB>4!&R2?7Qk^N*^6G2RCNK8qEFG{6# zPsA*EN@h&=MEiOZd)oKeh%AV!xQF|U$iy;=oCR1>7qP);gM6EgqQseovlvC0Gu@-^ zD}-KR4>VGz6xrhNlJM3#AREKbn}8-p>)dL$Y%4)s*#L)}Apx?6d)r!rsM9?ECBmG|~k=0{LN zIm7fwZuiJ?mGh|avWA!&kQh%X=i zr3K2BmUJF}hFP}2x#;;iE=c8bh|c@-@j4cxm;8B3_E-2<$JO3ENJo?}b-#ruJm4yT F>OU)JY0m%v diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.class deleted file mode 100644 index 75b57e401aa7de7d8725239d263362df858ff8a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909 zcma))%Wl&^6o&utC3aG`h0v5sxnHCt1}p?ZLaA7Qic~2DL{Jy(CeEmFaXhU(sYD)y z2Vj*2Y^cNn!Io!2h%@%6LR6}{8T*_$=llONGr#_P`wrj{?s%{m9>j7IjS?lIS+=L5 ziOdou^JpSQ36Ewe?I{_F1Cgodb;>`y5&I1=I00PL82p%L8~an9GPK(LU4Fo$lxI89 ztKqJQRj>1|0Uvb_jQ|U}{_*M6p7BC#XkC(Is0po7Xxw6eB`lNnm>1*cawHh+c4t#> zoej{$IjUYyXpE=j#63MKMhkb#BsxN)A+>WIGHi?an`# zDogyvKu+^myhybD!06uBdbmN?-7qQi?~D)0kMY5wBI6`E0nWvm9h(PJpVVA zJg_<({c4PlC-k+bz|{t{f^|$`wJJDLaEYrGn0^2T(=!;adx&6t?Ie(AKrUggk$nxK v=VCxn8IvCZo%!;gpP-yLpb~wY)x?aB_@-&TXPWKi%I6bW?W5LPW!3G!jjE(p diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.class deleted file mode 100644 index 921632ea02a5a30a345dd6212a10c11655c36707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcma))&2G~`6ot>kcI>8ZQ$kaI%6~yhVqi8E5=zAaRHRBNAcDGJH*rR_i(|L;xQjdr z55Ou5*ieZDf-TR45O-{=K~$=`8T;P3_dDm#%&$M+z603A0~oc%KgU_4}gO#X2rVL9%CHxP&;;<5|r!vbUMV&h|r%Hw@4dZ==)lT;x zOqnHqW0>TrFJFdwg63TMv6jSLx-W+=9du<(Ujwac6ircsL0`}7eS&4qyq{nnVHq>; z2iWez-d7k!*z-Ao%Ewds)~LYJ2DC!$jKW%3aH?PtS1U065-Lo;!q~kNxLfPzf$R!o5%xCO y*C2W~6^Iux`61BCm;d~@#l$X^=;JIWW^}~&s^&*kv(Z}pd`_!z+PYCx-Tw>6jHzY- diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.class deleted file mode 100644 index 6a1ee5ddf6fbdc2c7563e9df072d5fbedb20edb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7678 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.class deleted file mode 100644 index 1bfc27b5bc5508b41e543846173b020e5a84c789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2689 zcmb7FZBrXn6n<{9n{2`YX(FU)QPH9W0<5jHwV~8P1*Jk-LrY)O(j{5T)?}9^n>u#< zO9y>dpQF9&JbL&RUs@SISxJsSp8rCDr@r;t!*jZ?L+a>E^5(0`26)^#= zY&uI1n`TvDXngg7`N%Y?rgPu8y7j;+dvgsnDG;+{ zl!lDmuVVm%0;&6!x7KWUMR&<5*T3HJB!`I(5{s@|wM=I&i6fFjnkL;0rN38n3}KkL z&|k?it2K%a_*wVrwsW6u1di&+No*gnHyT#GXx1#5;&B}#c$Gf3&Bpd+w_*uI$0t@~ zv8fWg6zrj^$JYraPM+ z#_w#wfiSG#4BnG2&Uab1$K_BmA;CEfb4+Gx)X#ce!#rCsHQG*&g7*c)g!I3lW6|%X z=LW$Aa;2u@*)?m!ZrEE@Yr%0`&-859X$a(3NSb_AaTQ;j3X5E(i zP^fs@HhG-$dHnCQNKV3)p7%Q&){-OQdfQf=N*Q77Kr;n0zOq}I^r7Ks^#zb{*YB&^ z6&Dx?wEKeobt$=%mMuwj%=?V2A&)72@{WumB2OlF zm$~cX`vd-$8d#=+N07pZJY$CeANpuscT{}@h|2^f2>&iW`2$qtY5q@$@1aJY=Kp|L zo0@DP>Tf6WyNCy?7WCp29|dLlFZAVoNW`XPLatCU4} z)NEX%EXvPG8J}>a@VSf6_o1prAOW$j-7sjCb9{t)Q_Ak3Ag zAA^UCf5wR)yNokEjroo4VSKXNINQ^hAMGB-`EKKpp2nZ!ZfIO!d*tNBCiB1GMDL`7 z(TnYkUM##u1U7N6m!Fd_>qp)?vgT%QKlzvS6Wm%tekVgdcbS#!T4`La@%t^+i5fxYS+4&eqTFwSLR*arr;3&Im#P diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.class deleted file mode 100644 index a97dbc6238bec5d0443cc89d8e911d00ec384696..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2548 zcmbVOYf~Fl7=BK&n+;*Pg#ry=Edn(pK&r*kCV-Zf3T?Oum0G-Y2`i+ABqkdi`&0Y@ z@`Vp}MuTH#9Q{&f{1g5WD?Vp;b0OpdI54~CocH#;&-=b-^Vh$>{sv$QDGeTho2lG> zY$t7*vFF*m72D5c(^jq!+c$U8M(lZpGAkD|56r9;Teph&J0)vx-7Mw<5Kwfe@Co>4 z(lnYA@P@}WrNFPF1p$FT(X=*7sgzkP3M9f~$@9mWH;U$hj4FdA0?^T>pzT0w_3G%uWipX6vJ2mojEq1}eUR1dXJ*PujBN$bj{yyXI^K}_)Blqp7QvKZ ziZaVLbzH>|v)nzEWe*F`jFw>uU__v^CUoFQU)OZJjj%uqeXSYA;R6Jz`>mX#!wxT2Mk#)w zQL0azL?}*SI+E$Exl-ESHVco8?F>s5Oy*KXX45F7<=#D13YF8GE!eJ8+jMGy0*TwyuiRq ztSz%BWh~xE_3pHhifs$;gEhAulTFKi{<&;OKd_N26;kH?w4}JJUN|Yqzz|!#pZBqc zf1C?@#lGh|z)SQ29#WpiAwEc!;);8uC??lp{v#HiC@x4(O`3WrX0s^ zcrW7E!lw-D=T-R`S00x9I;oQMTw`WmaHZH(Jb-c{Z(vd(1hePsgi5u&M;`P*tteD< zl+#C4V?2KL-DG2Y%eGXR>Ew$B&f2QoM+FzOkl&Lt#y=reYhkA$x|eG!#h28cbdg8l z0a#@L8!E9tu;rN$;*4!o5tS;zX2$2tIp2RS{`vdsHvo@u-$sSuiJwG#94N`>@l^3B zi363SJd)!;@OemYD&g{2#)=PAHXTS2Mgw_N1B2T!)$#uz`9frJM~jmrLse>(OykyE)X^aAiO41|ld)tl+MQkf zwCnflG912ncqW&RYcrS8$aq0%8l-=)FZU*U4AG4f3wSw4Gn5 z+h8j&^-omR@r>>Y1z5TOtx!3muvrA0Dp>=I-V_9m6D xLG<^OAfDS)4}mUx{;M80@7SdfJRA#8s@HWlLm7I#&}(eas%J5-@l6QihS6*2lMbek zC(oAbwQl=OC6F$aS9H{*J})?U8}AU_yhjNaqtmSsf_&G(MZ8C$ni0aA{}-QyO9InJ z&^E)s>+CG`y>?RtSC_yPQ_xG$5y?LTJP^}tKb{C z-KOvptA0baw`AaHJJ~eCme&(lJd?g}>S$IKzAkVCC*dYw`e9220wcQ6)%Z5E(OzPV zvY{G3tjTVI$ozU^Wo?-mSEx8UuHO!sC2_WTuY0y$IuqnmTDH6;klpnAK||g3v@p{r zFMn1u!6i1L&EH-irMr-M_KZa8)7z5-Y4`ZJR)A)p=E(17xb@a;<6~bq@L5n5v zId1ZNisLQrr7%l?bF|X*EuhYofq8o7VOjQboG0{=7sy)}=V!A|^b3>_xy3m}UsE&C z08%Fai2|-qzUXlNioe~-#Uzh}-%UNq` z65WL-Lp(<#p`F+v!65Wgc_R2JioXm6kDVI)6_%3VIfB;;XDZcSQ9QkLEOF*g;!MBz;;F^|sfbs+z>)HUb!`O}!D;^TN9Wl7`FR?pof&c&j diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.class deleted file mode 100644 index 25588ba8eddd7f168d1c04ff7ece5496f36b5205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmbVMZBrXn6n<{9n{2{{mr$T-(Y6+ANPw+MTS)*dEhrcQ1&gCIj$V>0S={W>?5582 zr}zWp3m2_DehCpYV@Z@!Z`_!b?7M9KyY4&+BuabMF1?-{1ZKFpEcVL>TT> zoVrmpJz+ev4?Lsp*rw++jJl|r+<0b@&2tR#RM?)eT@#j7a`sGnOFT(}LD8Wi#-LTW zz5JxfEryY7X`eskhQ;kYV`Fz;RJ`Kkmq}{V*~wGYx4njG?-i36lC{$egXfXSJePEg$UJ?N=dmjqWnLE& z?wF3t$k5qp+^s!us)8Y!om`dK#-x2*#~XN)AkCY^*rIRUNl?P;I&R=CG8}}c(ibsF zzX=_0OFyj{R*mBwhOsWj0RK|cw5p&ZEJ*v5j%mzLWqxoVY~o}3 zbTdLaE;1BWC~CM(G)!G@<5|$~9s`?{sb_WEkt}JR6XapYY&C7qtcxAfHFqs>-?kl( zd!}Q%4Ed7mFt^NIzRQhox$Et_j&1OckFmDBQC=~HRV~sO*~B?@QWpL?kd=V(fs$#9 zajbDhAF>8rQ+30sygRa{U5VT7?>k-cgYV&mqB&BnrIL)vc^Qa zr@F80e5QP3n>dF4z}!`&wmn|?Zk->5h}F%l)%9g6yGre92)Ai@4Dn9B#6&kV;dTf7 z%5h-#Q<4;)iZv)FxB`W!V2n;r+X*>!zavsH0=4bX_922! ztH_P&(L)&?)}URsPo71n9n?NtPPM=bCmvOD9!o3Tja$xWY}28jr-z9A_8% z8{F{&*iA1$f>dG>f*X+dO~81L?WSp#i%Hh;IX>_EJ|BM1`TM_Le*^Fywhg2N)>?kg zZo8qhpLqSy?)jb@`hne(ZP&4%bh#J$wtOtT&^`zQ>GZZbj(05E`|?o^0-6OK83D89 zc-xPLPFG-QW%r@;*s;5evp+w2C|hBp@^ua-vIcS%=2ZOMmw^rBpl>%7lYPzvGEyN7 z6z;r*OSmkMJ(l6VJaz}60~)vU+>dq-vt;m^h1c;0H-ZHI$_#J=*9ESg`wH&n=*7T&@Nft-F{dToLFq``5;#-#EKAk@E%swz>N$~^lu6SOa8 zny3qiiYj1RcpLA~rO=OK1Qsv2ozP%I#2#MWbv?N^>>bJAOXsLdR|~s-%jq6EfveWZ zM=k8Q1A+D3muZLDUDzN;UzI<1IZ-B{`(Z~00&@!H*4dA;qOarS{6XlnzHK`Fgp>Zo z{!Vk7Rd=GFI~aD^TgEs%J2>yS;^dz=Yq-jxK<>aF1}*u(RmzuW&V_@ss;J^Ro5_Tjr-S2NuAcF`&Udp`{QLqQ2d=#ObuwWYRa#S#Y#fv~)1`!b6#|K;y5+C9t?k{n?$8RaD zlHeLwX~ve&;7r3hBa1K$^B-Iy_3XbW8d%_CvJKR=kO;ZQcZ#vPQlJQ=ULa761I7e& z!YTraLNO`x9b+_R-^e%CtEafKK?kh8a=y`_STkRH3Zp*4)o(V+vqe_p>;xlCK^wTw z+9nV9$DE}wPqa@WkxJT4q@Ht2qckC?im&I?f4)u$MUb~cLeS=0d8(7$wV$SR&PPUD zaX`XBs5|V1n8`%@J-Zn@6Y=*jTqmSe@oJDXcsewiPM(?0^2_K=uFt diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.class deleted file mode 100644 index a5944d9e03a08e4fdf09e55c39a19eff31ed8fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcma))%Wl&^6o&utC3aJ{h0v5jfpV3S81M!mp%jonMXHn*sX<+^n>eG!#rCxJq>DTX z55Ou5*ieZDf-TR45NB+wLNuzn8T;J6|D2ig>(96E0G{B11B2mtD3f3qDG^N4Llq=4 zjg-uSL<}PyOk#>D8Hi(%s-Ukj!IK@Cie15nBHI;5bud^SY}6Rskf)nRV;(a!TfGB* z%!8Px`@!46fe2N%{k{$ta}Mer=5_wliz~n4x!BY_kR(G*Xq8;!7CbCsiL^&NAH9}C z!CvLjzYRdn2NeUKD{n7ftGJ#vrXW4N?M@dQmEN#>qfr@Ax1lWTPiT9`Eri z(st#v)F{dsUiL0N#thvq1Cv_e%zZJ~QjJ8$u+UdL{IJarE9F`y@^P%Fa*HNclCV*_ z&#>HT|AQ&L#IN_|I19y_NRP5Qqld>@8+Yg_U0Mv#Ycl;pbgqy!fdP}gzTf!-+nV}6 z!9Kz^r~VJH?T4MOFblKepTH^ptSP0NxJsvnfMBb1-Yzk?hU;Vz5No(W@g~XKB%gs> z6&;=5JxqpH|!EPpeG!#qqTExQjdr z55Ou5*ieZDf-TR45N8~#LPV;%8T;J6|D2ig>(96E0G{HZiwZ+GRAWAjwB(cISo5(; zBCS$BmcvN!NlY=VxIC4K=6#(?G2T~tN9D=ztvsoL!S>;x%HV|}**?id%+P4{j>M_p zu}BX2o57I`b+`S#1`i7^YCaZC{8Lsc4;%;1)MEMtYVM!tu~D@D_`kFiQLb}1DU=PgP4Hzo(e^LAkxU# zrPJ1t+ Cy0nS_ diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.class deleted file mode 100644 index 15c3b68237c0e90e6791be11e31e02a5b69bf35c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1469 zcmb7ET~8ZF6g{)v^)6-s;{qv-TbhQn{=nI$O`3v%NdxSSNURbaD zz^~|Ye?aoW1C<&hHBywkBvO7;TY6@9F^2F`3Fc$x+;h*lbI0%h{p%Hg+xQ^^4Ji}4 z4FhR`>{Itw*J-<*9p~ZpQ`raw(#u}Q3s(hFh2qu-ER2}Q*cgQ^;57VQr|E^#Iq2+# z&aO|SA2_?R>AB89n`fc#1ajZG=XT{|xlgvPYy^_Dx!PH(dKh?}ooa^U<2ELc6|fp^ zXMMltwgsjOL(o`NwfK_)=WKk0DS?q48P*ftsX}oGK48``W8;cqPD@4GRmNv+e1fY? z)^fY8HNPn%lN%;J6}WOy-o2jJZpt8oJW>`u7nn#)6=F*(>f{R>*D=o|?%tm4GzBWd z;uAF=3QV}G7QPe^Ma5LGQB>Zn(2v7Rlm(_DRi5wEW#GAO@4($|Q?(w8pQw2q`JlJE zErTcVL9XUE-1e4BFoDTOJ#2Yhfm^lzd3#k>x_egXbN6y;ZHxN-^S7H^nSkMkEg1-m zs{He(jbKM#2iviF=r(@YboUam#-qm@o9krVU{wRz?X}rF<^Z0l`@Ntc?|Z5Yc5)*( zRh4j!9il;?#D7ioD?8rgnvKqJfjft@;B1tRA^zY(LxrO{2H`iOF#-_!HFrYw8^`m( zf5JTC;c)QerNOuGO%l9Bw8ofpsr&-w<*8?4M3P#`QXZ6I_Hn{L+z3)W*B4*iLBa)A!rFgoY4E(UK2_k-)^GrzQQmt l{}TBhkMUV2PGQUmK4G%Xu+tyHP)5S=P*S96m?V@TrGadyGq z*xi1>xaq}^SSk%^+HOGNH!;|AY&T6pFOaO`b9~7uih+c{?W)(b zYi=OzXRW=!Zh9>@@O--|Yp!EIYj7{{Y+vr%%MGtBw*p@}%|~)S4FS!9j+B5|by_R? z9j75MJ-hzI`NgptPHWfxe&>m-29?53X_y!>khU|x0=X;wN*dz|c0wRCOiD4DvM`M->(rfgec7wAPI9)ern08ge$K+@ z_=3=jE2HpyDH0bEWx>t1?+m7$5b^K8a>TX-$&ibb| z!k|kP^7B;bV|!y&JQFXdOJ5+ZATGxTG#Y+9T8(W5PW9=Avlp|`A3j>!SYgdIy6ww$ zrx9>+6m7P9U6$=XfuklXY!htD>#z@3U8Q((knEfyi3@BSlebPFp?ZfigLB>nj<>ja z#qT=b8>Qm!(6xiozYxDcPac&1f!MfS>>?R1i={&t(X0z=^E!tGt^5X~IqfyZpTjEW zv@SAXgm%D!Nqoss!GLh{9Ook-e1+Rw5fWeH4)>=y-sQIh=16dXt0ZG{sBorXk&#&# zhWQSsNPXl#WDSh-F?smvHxLWC%XfmYx>BGBBt9aLjRJZEbiyhEib6In^DARCW?#%y z7K?|NT%rTkW>XOJ%>^5;>^!W`IAK!qwE+XNkL1v$J!>Z^f#O(Fh;a*Ly=0_ zB_uv@OQSR)sEV%-)PKBA2t|>9j(lttcSoAkQiG4FF+XO&fyg8VDY{CJ3q6PLQUqHOM> XFu}&U(#6~`w|-&yp0MRm!FT@y(&sp^ diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.class deleted file mode 100644 index bd3d3b3f9d1a24355e44050170179bbc9de330b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4123 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.class deleted file mode 100644 index 3910987684f8e6ac0a393fb26e9ff7c438c60f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1572 zcma)6U2oe|7=BJ-$FApgY1(Eh1iCLEA5G0StZ4^ybW)_WLo2ETSGbAQc%*UbI9%*+ zaK{f|H@yG}Qi(|jZb0HU0podXlcw1&CPnAV?|Ht?Ir;0~Uw#GfF18J16zc8Z$m#fz z=RE2kN6t~u_oEi5UZyjZ0GRyeQL_JMhS*kn;q7Af&T4=5Sd-KlGwzN1;%z zOi;Fh{$azyywDXC^3!5O$)b%V6e+vw4!U=Pj;D|pJDXDXnvK`-2J778 zW3NxD`eb$qY-7^f1tyv-p&}5~sh$6)J|X<#P7|vNsv-buHXOXkD54;#QCPf?XDUNt zTj7BxX60!7;Bi+qXG;!gZbfPObVqbnUeE zJJfg3v!}J+pmtWPBV^-gwRQ$08I54?uCiIz>VM+Wvi1k&AH%LMYa`_23hk7DS-itm zXaJiJRvv9kg!k}1XQadj_>kY1*xu$^25VTsI%iqdE~CMbh7DF0VHoD$n4|QWe^4|q z&!5S&mA9N4xy?SqT3sB7fXp)jib=s(fKFNwAQFlx%(tx3xcf%Fu~9w4!X^{2cT4$3 zmuAg;?JRQ$82spzWj})u8YRw$jb(xi!;1hxG};lNos_0p~mqD^=WMhdZMi~)^=^IO|lVf Y7Grz-&*w3f`0j$s+y8r+H diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.class deleted file mode 100644 index 8caf4c4a66cca0bb9eb92c083f2e621215df3b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1508 zcma)5T~FIq7=BJ-$Ho{40Rn7kfwo)oL2$QqTiXEJm|6)H=u|4C?rJ7EB8Cuy<4jur z#_sk5)*CK1sSDDOruL?j_M5tP&#}Ff0vDB%^YQw9-{<3;^Uv!){{nCm-xx>AQ?YoCvwjtogf zV7yp5g}E69UVEozVN@aJ1hQxOC^F+VCXgrdrrT+L>o=r8x>#CORpSE$nYQr(K4frD zA>_{YH*iT{@@?xFcBSjJ8Zxj@z>JMq%#r4zM!k6D0vrQk^O`=9M*O=*MMB>I}~*RyeZewdF>4e_IBR-0c=M z=hpnX+uCviPwkVS7B;<(z>T%{J*8MrjV%0ky-LnsK=;F@3=}c8z7}~p5QXCP&}Qh? z_txEmgn|Cu!`1b>?6*o+0@>-dLW+oUGo9qv-??f3yR;=>ZTj7yF7J6tVB+NdA(Bp6}om*c>(bY^z>2XImG&WxrcPLEmw|V#H$|c zjd>1twCdj&oYr1q^eOD>wAMp5%FvG3Fb#*Jf&pyY;CM3z!YBBYJ3`_!#`t`23!gKV zBB2?4!C0FAX?)31<2N7=!!TcAnA8XUMc%+DeBGBq|On@#|eD` zI$;$7MIoQG`I$KytFL5hi{)dCEztpcqmZpNDb~zZp2Dd1F!{q$;bM{HxH`c|Q_yYP zVQ-V}*SJbyh-izENG0tmQg8T4qckC?iqjkFf4ff!MUbyQA?R>cp6cainELIE&aud7 zJ5ESA2rOYaDOUK(q)fT;2c~{MQ#}+_$1Y|1E@h&7qd@u2l0Ns?MUg0+pz!z@mvdKo wxTc)qlq+)Rp?sEG+&$)2=yRLxb6ZZhS+u=+A-~~M{H#7dtIzMNNYB^*0X!QFb^rhX diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.class deleted file mode 100644 index 22de6b2b8384159d244a8a07fc372847da7ab8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 zcmb7F+j84f6kW%bEX7rB4sq%>K%jvpaT3usT#I#x=9Z*k$iQ*r z1o~;1uh)F9;@r1O>z2Pyrz4rj&vEydNXJP7!+4Rs*tcr?^InOpl4IjblEX=9A2IL> zUS%B@9QO8NVBPLwwowDG;dM6C4@w#6P>6($85qZeKu`C zKhtq$CXtW_lTt#SJZk4D zALH{q{x8(9NCS`9vxfHr6mL43J^;i#fnD_dEK9)Yx+-UKNRgJPHXD+vPzuJZTOkTO2RGT%rZD_Es{5Z_{rx&%*}gLUeX z{E8Iu5haDci`bx~;u4L6x19^b?5F&xU{&eU+poeIak@FpM}uOp4yu`(`gpJi>`N zPQq9n?wj3b)Ahdm187qXymVXY2MUTbEF=hVP7+_|wA!<-Sb zBpY%K*U3m{GjC8zpqsXvWSiu2oy8}V6kNs-M)p*vV2BLqaX@~olv8RwsI z>c^OKrlT{z$sL?e$DM~dI`d24!8spy9`5M;8E!?+1&&8+b>@?Q-Z< diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.class deleted file mode 100644 index 23d1788cb0423ff95fab7f5d1caa10f0354ee9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3128 zcma)8ZF3V<6n<{9Z%H?O32h;OP^3uS+O=3w5{gi4wa^!6u>vBnO_z2{vKx|Zonids zpJ2uxAYb@^Gm<(wVS?U4lrnSuV$H*xpjtQ2w=sl+0I5Wjv)-IIH=oHn`MTfu>I27mR0hKncKX$r*yo>l@*I?*16NPjtsJt>4xQ9^Qj(6cTY5rQ!2(7 z`rAASa1LYWc%Q@Q1T)ht1>ZQM;{!}G^w0(c9#ms+kB?S8A~>t#BYaHhY?}4W%kH}6 z_tIP(d7M>IWH{LNF3hI4?ee-+i=%+32I{?JxPj8VeWv*4MIDzgO}U%Zs^w5ejD=}x zavCbv9(Zb&0zTysGaZ&qg8$P}!)L@xex%i*QyS)oko-tJ;DZ*fGO!Hyv7lp-^QC#N z2!J8AyzO{)#agxNHud-=$8kN=vt6gokelbn$}HP!=9+0dFzen{-E|DJrDI%KSz4U6 zt@1jNCpl(?7>$ci?s=suog5LxJ)02XVDdDX1h{wWiS zlDBD72xt8e-eyjO3q#TD=~IzxF|$fUxOX^{pOJ#UarnG_{@4`z44vbh&fv-uZDWXE2h z|3@GH3wjQd1u#OIClI5_(~FY?K8jUZ%?f*biJSCANPc9@mw0SE-a$W@sPFlB;CX@U zqO{kOjsA?mTz(ga+Yb5I0!|~2wC`j@sJ5K+1Znf6d7cp;`c?ov?GpsVvl55i#XFtI zIZ7k%BM6Q)9d!lgfBONy%JCd5PpxBvNup2`Nn!R8pEK zXepH|X@QcO(wa)rGYTyVUMGbD1`>W^cSOjo#Gc?bzM}mhe1|(!s|dzn<7--r(yxFL z?vfcYbiZ6#CCJbcD)3IW3=$W9^aoBhS})W082Q6)|< z9_=q~66soh?kUu<2F~5*>*EE9Z=|GPN8_asTN4G@-=Zq`Mp{btw~lrv_JZ&kM8=6< zheZ)-bod^S6rloK#Rf$ir5-wiO_C(KLJkt$oLElXH&9;VFeIXmF=7jhy(abccZ4qt zL2fEEb)>yZftnIhYio9{k}`!!_r9PH2EBQ|$l0HuKJTc)px;D%w2(rOE919)7vn^y zajL5^{UYdM+}~+@tgG=B9tOq*Vwg9N;*YEL$rjDu>syQNQCi)j1Vf3@!0U>Wcv~DX zZW$_QPMbaPgofsu;}O%D@oPWG>n>%**`E9rg!GfsXWUG4g`+i>mXzX{U-q*DNj^7~ezcY?W?*IS* diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.class deleted file mode 100644 index 12dc3cab8094008cbc738fdbec2ebf36479d4ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4840 zcmb_f>u(%a75`m(AG71Jyv4%Buy+`&kI@hsc*89-@u_36(Da@ev^*AtXNWiN64e5`Jgy>?7+b7zxSVIrp63 z@0@$jJ@?F=-~a2EzXosuKS-lX;rM2GCtvUbFMqjI3GzGTk{^_-`5mv|yZOsS+JbVv z>RrmOdZofjP+9RVnNUbrNFt?RY`UfMm+Ed&;lR=Pi|&(dzUY>=@=F^Rz0F{H>=6?N zGHI9=dIW#hzQYAo&)s1(g_I`&Y7(~BLLd4S%q=fCR|}TQ)j$G|wMCvQ1>Tldoi;Hb zfpZGk&S{CKS6Mh9o(y`LtF09(qC9BfwubxF>ZZ6C_3aj3E$Sq(%c15q7GB$6uhqQe zaB_z&+#yPfu%%M*sWbJ0Ul#uBER5hzg)|MTwdy9L-!kRZpz4>lIAev^TR1Av453`$ zTD2$%9JermNltd#t!!~Af>9k(VAH*-VHmVz3S zwfYt=O34^OSqD?FSL&s}-|;T^HGiY%ohg;dfgAYcQcYoEUXGw!^f%lMH~+X>3oh2m zrM%n3xBw+TtGv|39nZe#+13P zyK)5RMb~WqykGJb>pL4>^+A{OQpnAhH{Id|x9ZC{QYM0JpB_$x6aC*>6KAX#uf5Kr zJz-+Y!M0ar9>x7gv#xtXb!%*f=5T`)dbBYbX=b!rY)0DH9H&EOg&oPz77?|(a2uQM zqETOnZ|+XfnS1_&B;a`u3LauI02&NV=ZYuuY| z)cGr!1}r?u-;WF(9)HI%^t_#Q15xkGOZk$lVct52C9>7g}fKn0< z;U9R0Qi|UGj1N*u6a7bgh?0S?<3)U!QU>3}kMR*oCL?|hAEnfT8+abiQnK(jR_1e* zdhvI7_!y-=WnvZ|r_`^qIE_zG%BnnT`*}(O>TX_GK1nHuPjT9t7)~4iL|+;z^D>6g z7~r3wUdC-&%={ljE}IuZU8Fe4XBPt}r8*_EU3)S+qydf0lKeF1%N`{+9qp$3PGWk< z{%dyn)cAFb&9J(y#o_GqHVfIvPFzKLY8O+FiGI*Yh`~-o7DLKgn}(cZXkulDB*RWN zOtzB>O{u1d^{!dNPC7KP)FW29VLId(p~+~PcmOo(h?5CTto?|UX_!VGGc=h^6Hf$L z!||n8(MyjK)Q!L3)A$S%W8hEtETt}%!yi~IQhKBK1wKzHfiw6PzCbC7M_Eu`q?DqE zZG4GRnwAB8nUaAY;W)lRDTCkPAYPzkN~x%yA$t?IBf(Npiq*l#O$KO3AII>`rP$^4XyA)o9d566=E^%g^(=_KC~OXgQz4Eb~?c{G;HZ^0Py*-r9! zESaB;G341!az2*K&&wF{TqpTNEcvVWT10l(JfuCR#wT9H@%Spy{aKnv_~v69k-L%< z*Ohob_w3h?zH2GI{k{=5pOgFbqpxNP-;DP&vtK{@Ca2gqW9M^vzkc+^PvP6~e$MXK zkK7X_&)}H#g~B^Z)<= diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.class deleted file mode 100644 index f06cf109050ada3cb2e7a48878c33da9c0e4414e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2631 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.class deleted file mode 100644 index c78c116db0da518760abcb2260b807c9c96f8c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3257 zcmbVOTT>fl7=Av;W;bCer$QS_?LlmTK-X4nZGcKoSSnBo6m31wCE3E#Bnz8O$9B9| zZ~Osz<&DfZz0et@GwL{cQ)m25*7|(;He?BLraA-J_xs-GJs)=e{QIY00lbc~jwXSz ztXHsdZs1stiW`Ad@QQBW`BuTnxwiEvPhQ|zzO!j91ioVz=E|it$Di}Pj~~uEn@I@7 zOlXJ;7+Je`b+c^e1-b{O*X;+kmA8wl){T{QCmW0o-bunhLPyd>i^QM)Z-!}2Anr&5 zC26+R#6Gm~x#|S-PT)Vh?3Igwv^^LxK2;2yRmUGqqC?v56lkyaOe))NqFX9UN@c;u z;=>I`ULP=V5GiG2(JeS$IaqMA0$saoOy)g1pap?LCi-w#AVD=(O2I9kx!Au8%OtwR zRe}v1F>w^fn71{%w07CcIRecCgHzJeBa+{5;uV}=%wsM~a-qUqO3=!Hi9rmJkqb?9 zMgk5ENZhcA5u9RBek46z5o|R%68x%((-N%vDtvkOn#nGCg9?I3>>UvWDsmm?n5tS@ zl?#{3Za(MuNt{K$fs8<3qXrsKF^o&tn2B*P&bYm?;S_TMBhfYr1B(`Sm!VMu6Rgzm z(OR?>t(TZ!JAx9H543oDMlXwwsc&S@`e z=a+2XmFMs>7Oc5+?Lx)1|GN(8t?;CQS~G;17SOzai$kDI8tShVi4$4j?7A`)NF|?% z4-wU~(ow6$j*jS6OGQU@MogumdTdH{uG^CXiaIUcm&jw(Fy9w7%5$X zj1Z)!j0mVVlOU)!lT0NfC>eqhsbm!tdrbeEaf`n)D!{}Ne>YTIco*;S#0YU4cgXL? z7T)Jw6Z7^3KHyz5Q}r1>Bo)I=+{Z_xG|D+xCKbm6OyVvn9iLzVHYo#Nv1%)%68IX2 zkR_Ewj#kd0T{r&1J{=8qrg*qryU z#z2~Jfa|+hZP4c1}S`|>mFxAnk z5EhTz)sXeKAz0rHuHhRnD8d-|^`OcEi%;368f)_M_jT26t@N&`0AZr|w#MN-!av~T zcXh&D4Tbq()<8I2FMP0}Fh9f^2wU~ShZ_p>bFG2!nR?;l4TbY4gu)p%h8&0ZQ2Ixl zY@9JQ5AmIOh=-e0pa`##p7e|AQHxiwSsUuHUR00T(*m3D8~JnQMfIq)F61{(sArwo zkqtHRGtS-BYs_Tt1&FP17z G7yJVnyL=P? diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.class deleted file mode 100644 index bdc5df6acbca89d5e9f365fd1f48890d77694535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2782 zcmbVNTXPd-7=FHFH@iu<&;xB*4pOjSo20B96iuj>B8O^QkYW)$u}xPJNRyCkxnR6k zZ~Osz<&B+jxX>9bGwL{cgERgn5ubN=lh$;d={S@5_Wj<&^B%u9fByZ`uK-TNGmua? zQL3*xD;3{!9@ZMZvs$lJ{Cd+_^;Rmb^RP;pUw4|`eP_{cdhY5q?|udfngtyx1+(PV zF5F*ps|rKob9dbbu2XeucbqHBcfFEdoVb;NiL`-?g&xs&cIs`$ZF%&ikn#k+B~E)S z?80t^^c~M%ES0@gS7Fci#1^-Vu~NHJ%%ESK4k+|>ha@31`y6ap5H0Mnmo|S~w9R1yLC|#rQWf4XZG- zR;jLd%?wWBh>4dK`a2yQ4Iib2)$_HEK89e4Pu=# z!F*HsQDTvvW~=g}tsq8TXB5Ls_jWYuCx?R&FyrWI++(4LtRies}+qZ>s|NDUQ?k*(8t1Nd%N`ZN7<1u^s$BwK9piBvU9;8@vnVCY~a%nZ^2Av*cZ@NUL^rs(f6k zi^H5$lbc3ELI$5yLIykda-4%N$C%$@Tej#JA*f7)}&)k}bM{ zcNwh7qTeKy;BbD7TTCR0V@&8hQX0;2i@i@u=Q)B8NTq^Oe+%;&_CaH*m11@Ic}By{ zdqNmP(Ax@a9hQ14D^g2s;caSmb0cNr-^!c%F#?(}NB&KPZGpqDjH%9^9R9wmyS>5e zTA@NzD86>=-e&v*j(*o=JQ!=tzuy?+iEiVOSY!T8#~A0kjrYeI^AA17*y%Pt6l?q; zK8lQs91M95MmF~&j%K^f!;*y$!st8*BUpn{>D%!@6FUZyJt{zMJWzheK(dGhXgMCp z*)fo8aslE$J5TO$++~GisHT6$$(xUHdf=rEoRRm=&p0zN?4{2NIb38V1 RKEAl&JWhA!u@ns6%0IR!-~0do diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.class deleted file mode 100644 index 2c3282b517bb7a8f43a0b979a423e12be4eddb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5567 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 a>B(s+&r)vVo!;|yGo3wS`e}#KkN*Q$3%Qm6 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.class deleted file mode 100644 index 72168db5a09170206811aa466265b234c1d56b64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2215 zcmbVNU2hvj6g^|_+H1#Y6Sw&=7)T(r{z$q7QfTcYK--k2*lDn1}Y$ENBeqz=wLx0lbo@47Bv)k6o?ahi=vpe;BR@1C-ML=yEPNU15B{yl$v6_0x z>N-W4}bJYXUQLt_)~h4*bW7g|M2y z>v)5?8b-Hq$F7^MgnLoEDX=uu*(>FC&uZ4qP8@3pYsd&JpHnR3>a{H)xdif9Cpn|t zHd}RpjnRsIas0AIX!%Jf+ZwLP5c-5?pw)zW5f1L)e~{CqY>KL^z%0}B) zSv{!im3NtRk5`WE+-u5rAqW>+8+yj8cCS-2Ws_5kb65D9y!KdSFNOI0g!sp21Oo55 zvzwf=>1oHf#`lQhEzWd)1;1+UDa7|Kw7^krgYHFlbOG4HHfQWFEHl`+^ACuA$ITFi z&ht~8JuW*8!e-|<8Dw@c$ikE$0`KDkpFxRVS#Bhk{}EBiKRiOg*>5bl&(W6oa^i-yn^n`rv{V;#h zPo;NZuDGRayK<%HiVcdT&E-!K-RNWGbGe=_C~_mE_&b`EkXz~L(rkKB{oG+*hBEe< zQ^gHDq!mIO*Kt5TVRBi*C$tn-h6hkya6zFALa=lQ@q(b?JR}zupay^dql_;R#(aF| y{Yon`6f4dAjI~dn;!5&rA6Z#&9~;T*o}K0=`8J0>HYb~Bw0$#vT>=$X`Rcze$f}qC diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.class deleted file mode 100644 index d425a2ccfba14b203ebee4c15b65ed77bd479203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3620 zcmb7G-ES0C6#q@TvopIph0+3L3nCx_{bB_XWm^=ApvAV77K`8qOxvLy*v>4wQ$YMA zF+ONweAXvlTlI#6cGZ#H zG^8Ebpeoz8SXhI#+;-Lpj^A*rfo$6q+jr3SOOEaJXR%JUZPU=&=#MSDUb1Xr-|1oqKDnW2h@Z82cvpWvRf*ceaI5y7dH#7))`BG9KTJR>HJ zl4N73EWDzHeo@baJkd9BSVKp>0BWzn1-CTgRI(VrZWBl7POQ21gs~hJ;h=?Mc%E+C z<+9_=Xy}V~SmbxS_{+>Q;{!M$CSGXJto7!KBt(w&n;2pgz1vi}4x4z1ouZZ!6&WKe zV(+#ncCJscHKKKdIIThJ5*H>coROlNfv^12kRM<00(ah-bgS-E$vNtIeqaZ#?^RjT zVVMxS3MVH{jh=9w(o8?c(6i^+E{1q|!DVGLAyp3B*$n*) z*;z#@eoFP&+F{poMi=I%oXQ!SZb(~5F(>VcE9;1v3g%q;bujen{~i@|QS+DgTam2-_I% z>)Hv{HOXocGZxM4vg5VZ{KVuUjEaAmsoKDbsVre(d1Y^_wopph34ft7?VNC>30h;r zxK~CO+d11NFAW_{a^8??lJkVzmr3XNo#g-7Dqf+02gpjnISP1OtQ4H5fM>=^!K+wH zCa(E(y_nAHf=S;;+ikSu^?W)8>L?lnbrj9KAs{mX8F@1X z>MUjm>MUmS83AP@P$r*^fwmTN1Z^!^`J8~P2t=v|O5I_Q&3K)^5;|bv4gP+hg2x41 z*NV?Ey9^GV|Xg zJ>%O!6&8p1ZK7RWDk{M@tq6Xj0xSiuGh_)~lWS9%(f%Svdi0al{(*Db1hAK13%{ERCkI8vHz@iTb)p7#pD105uHj5oblPbc|O=HgY4du^e2- zCkP@HbA?J>D_KTGripJMRdf{il^M}l@m=3E^iE4SIF~<3nqC^!ba-J%mEOe7Bs+UoYe!u;8s6f$6N?Z#Zn8gzR%=Jyeww@yqqwdy%hJ`uKVsnAT|C?N+#-(3akhx#Z7(Xilb^Peif$MF gu%fpLe^k*O!XG2Oi1Ef+$A@EhX*k{sr{Mj60fj@TNdN!< diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.class deleted file mode 100644 index 4e5eefc855043243b3074d3ae6e861d2ba5e894e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2110 zcmb7F+j84f6kW%bY}rv#H*GEk0|^AMd5)1tl9ZQpyetDJEE%;U-Cxo1Dqa&9qdQB83cETI;;gh7=5@S|H&|N3 z>@@DXbt|B-lEj+=GXvbA$GxuItXp0h3y5pTlbR96@{+GLsa@1j#1iW=+ilAsG0Ven zqx8d|M&gsR1zeLMjB}oSqK4=g_0;eVp)bvKBIIit-V+c78S#dWo01vLcS9$E?0(nr z?Ur?5ckIKab=PrR-}G(Q=?E0JWZ#%g`_Mczjjzm(f822$!#uMwHmkck8@AP~m)R?h z*&=tTF!2{QF)JaRm$q!j+Ud3qE$>s4No1F}HM4nOdbT`Amx|x8ne|qX_5XJ(OGtM5 z4KqE=cE4W=2V{mO#2z)pNDqdTl%{!UT|jmHhUF2ZtaTxrj&yJr9mWGi$bp=P ziBLJX7_a(f?dxr`9idkD_AA@#Oj%*Ga0a_g4xAcAODzl>(^a?Y)vOIWAaJDZuE{pV zJbORJ=OV@*j(s3;JR$HtgcSkZ>(iWpEeV)x{?eKLmcOT%}t2t#Q>u z1Khy}JaI5E%XQTGMndLcTknn;!|kfLXDpme}lHYwAjPt z;7DO=XNgNmS^gbkS>+inpFm&EDm`TT7P*p2lUym0Ri#bh875CKo>jAnzL9duT=5~Y z!!PwPtlTlvHdJ(I%w?K4$zm{u|N$ z#zYd@b4(`@T31oN@WEM-1HNF8Nj^bXneTFNEcVA4EMXPi0ZEJRu+9D9oSq zQ|VpGlvkCtfUaDo+#p$6rg(znau0J~%KKbNk&3JmX*5Y8Rk@3)SqY;?x#Jv*Ey9(P za05G(Vo2jUc3DrHwaj3Tk`mCc3FQSZ6w)9Bp+krlG#Z>^@?r{V-=J@!j9$@<`S=D$ yNcUwZBF+DTh0mVgt;x50C`iCPEKgn!( diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.class deleted file mode 100644 index 8ed801ec4bfa4abe2d2bf89813b2b029b3b43aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.class deleted file mode 100644 index 1126ef354544ce12d72557aa3ee5cd0dd6e7db34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 zcmbVM+in|G6kW%jvB%D&b=)|qNuWs^z?ZmFpoP{>T4{0CEc#J(k zqMyPCke57w1g-=Uf|pj}8~6+!Tguuqa@I@3ejACCjkSAIFcr&U@Ba%yZct7;cU0S+5Yu{aFCz5aW!AIn2{|&++aCi88tT zi1jd);LnR*TR~aq-REmm(Sd|c^ zG0!0*Bd||<8n6g)bx9~*H}H;v%1gBOOt!`~BK6$BL1Fe3dtps{oq&h4)mF!Oc(A|g z^d8x}Z8DRtx^=s~WA|Ee4lgyY+3G8ltN*ucDy*r0{GxNCGz}j#ze7m0kyj%gS4uf~ zoRAW>pX)W9of_>OGb?A`#f3P6?eVx z6zWIc>;tZ%2Fz<>HAPMRgNr(`*>yzV5|JOJ|q{QKFwm21xlw3bPMaxsV8neG2$j};ub5+U>hIu^&(ioU3|p5C<@fwrljFxHp?AKI%-&; z{uY_qVEiS1o{bkc6Nm8Vu3(e(L~)5d`hb$=)9?V=D_&@%K`BCqQm<%qa*oJF2Kvxo zXrrCJq8an?V;Cacl2AmN`xO^Ie~Oj#n*+QpfCnh1F9-61$X6&2@b37Cj1Ffm#HH|w H&wTY?seM?? diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.class deleted file mode 100644 index d99fcc0e56118aa8909659b834996afd6cd5c107..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmbVNO?TTw6uo2FmaM9cQ9d9aZbRz^e-Mkd2??fg!IpEN zYYzW`EgQDQrD+Zvdb;Lc@Gn>u-Ww~_O}dKDu}1IBoBQs&^Jetd%io^^n87_25rNry z)3>(Wz_A`R_5#aqHr$}uvV3RTwXH{I1yp1t%|JpT`Fk^LpD|!a`@Yv^`<#IRX}1Dtzh%J0pn#gL-YDN$sR+#9J7szu z!x&L9Xy9$UBM_^5&4wc|l*yJK*!#BS*^OOmW9xxa4~ja*Fs@?4KnmxH)vJIN(unBn z+g``n*db9feXEx}yWKAKIVwTRZR{5NGcbU}pEU3;E(*j;E^Wl3z(_w-xNq_d5aeWD=d?G6u59QJm!07Fft+Pp_B2`v#^_pay8z{t2x@iaI{P6%|(v zT*Hh&@|9M-0Ak~O+p#@jGu&TcD0TKO6aUb_94AWbIzdI&sNo|4XozVjk-y-%`%Z!S zkE0h^x{s;ce!L^aPAZeFYDj4K1Gr?qKsdE~kE1~S=G_9}01vu=A;yX7)^m?9e7cS*)X z#ocY#L8nDoUz0SHAX^ofdLx_TdsC!yAPW;XTM6v?!*zQv%%zp;Uf7sQh7s5LgykkK zowBw?N~%|yomSmhby>KfV>eELSuR~6^~dP;iZ6}woxF_ax5HD#jY2m5lg> ztcTyYA_ZTPH-fK--yA9-zaPmHBY)u#@0Ih6m zef)zWe);!rbDnEZWDO&7b()mAOf078nMR)UI^r=%DsB=FuAo4tpR2n=f8zZT2^GUa zjQ>Lz^c|r2p2il9ta2>(8!jD}DaTjCUrhl;o@1D3P`DcLe!Kllu9kyg<7e_ zy3{DOc$a$f=5oyZRGPXpSL5bq q(mZ>JwI@jOM)jJbC)5Caj|Op`z8TXPM+rK~-`kdNP@~ug?*0deoSb(6 diff --git a/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class b/sip/target/classes/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.class deleted file mode 100644 index 16706a2655f866aaed42ff0a0735e66a18ae53a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6124 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class b/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoChannelService.class deleted file mode 100644 index 6eac1d9285624c5f6a81464031bef63ff163f23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2000 zcmb_dQBM;=5S~S}6j6~1q9`h$(iitZjSnRxAT>5=0%;8ozHNKkvSe?!-0d}5i;QLj?+&TyPm%RjhsOd0bE{DaY@D1iQsBL3jD{<*NQs!0v zHk;`Mstqr5?y4&4^PEoZal?cp(3&8#$*Ht75?JD>;ynI7Wzk~woR!MtP<4c8@snEh zkide+T|MNxVRA1Tj!%FlSb-6eMm-*<%T$v)=TB^9v~9E9E{st|wlNRwpsp{$EmuaE zFh`_yyMY2-A9pu*!}w{i&}$<^SL0ev*&xs<{HZ{KMcGCdYI-19NZ?}@Ys}3V*L+*o z0Sgm#%?N*ANuiM8#k{DW5!5$&FlHO|GOv5RC_qA4!y!<~MzXz*gjI>jwh1&;Pe(E$ zfI9i7YCV2J(<4@+quiVSjZx4V4G7aS1<;FIWLwyguN%RdN- zeOw)VERtdLDw;Mp$Ov4+?>bJ)IUIH+m_e(I))dU5eG}$V`xe@_;SSiL2zTwe0F`wA x9_}x~lJ(z*<<$QG{SRTq`X9k#yRO0$yFP_yc3p$@^#2XSjx%@;FKi|+{{RRjjI#g$ diff --git a/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class b/sip/target/classes/com/dite/znpt/monitor/service/DeviceVideoService.class deleted file mode 100644 index e543c59d57ec5e383ef1879c773cbb4fe68878b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1402 zcmcIkT~E|N6upB=1yn#>@cZL!d2vki$t5PPV%%7j(1b+ay6vS7X=j#p+EAbT75*3> z`~m(brDM=5FeL^@$rpuY@UHLwQVDb}WHOlMX5By9QmnF2NWK*&xQ#`b>H&kf zKqNBMWsVF!|1X`5P9ZAMXp4ul&&vt%8bEAzuVvxy!54| zWw40!vmLJ)ymtHdm2vr~fm85r66rSX57u``A;(NrIIL}IMll2an?kpR){?{jvzlOA zZ74PwnoeLQ)EP#}J!tW|eGSc-;T9 zEhnm27Ce{;6SmW{yr`9mlrrj5Yzeu;VABqh)^D+MLe z6}3?@&3$sFve^brg8p$6{AFBD^w*5ae4xra!WSYXYu222w_E1E*(9`~7@VQ!9PPga z+F~A@r_&srW?-Jq3vdCO58dS>(;6^ZWy zSQapt$hpK)>H@FRiOM*DRRM<`Q7TPExoNRlq>`zbmTiOTo|SIM=ug&nIsyI6(VynI zfa78OyO`Wmk~G$8hF4yn7iFhz)GQj^3J5(yWp+ZY;Yb9Xs z$A_^WaHbNjNf*(H9eVr%d#{nx_)nkXzl|x)#EXwxpS#xW4-?bYnYy6Ts^0w;#zE)N jUS7bGtrZ(;&!!W=8gwc3A++dvhr)&}|JsBthitzAOq`&Y diff --git a/sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class b/sip/target/classes/com/dite/znpt/monitor/service/StreamMediaFormatService.class deleted file mode 100644 index 2e0f5082e3d7375b7d8116dd282b12a37cb97585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmbV|Jx;?w5QX1{ACu5<0j|IlAQ~geNJv2xKEc>KiYD^zMC-K$lpKqK18^vWV-N)q z4aLk9PxI-$_x|zv2H*;(1!fM{jRo?Wg`VR!Q?RJn5_OUWZG@_vgu}gf<)x*-x%v_c z96FqBcwlNduIZuPNRta3J6!IFHCs?`J%y*5vv%9I??@iA#7-^#;P1Y14)aRak#nEK z;brw3T(15By_uf&vv~`wkp`ndz1V)n^0stXRMw|PmfDVv&j0G+V&`-W?Qk&8(O4`n MLow|W%%{8f1XpT!iU0rr diff --git a/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class b/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.class deleted file mode 100644 index b3363d7a8ec0f4f308dfb84534a8deb3f8dc5cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15903 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class b/sip/target/classes/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.class deleted file mode 100644 index bf82c73fcd187028bc7ce1fdb8d9efafb009a157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14013 zcmcIr34B!5)j#KDnaSirLIP;mLDpSyRH6kSH$X%MXkYb|4>)Nj->|TgQ>8&%{CLM zn3V{p%;eTsw;7K055&VA&Y%U)OvQ_1iI}~Vsi3B|vxI_F5}=TxQc_H32;^wYHp3Su z2JCRZg_Tw^8`yGF0C&csrj-RZ)D=mYZIOWiGs(1|H7||bR?-aj>viF#^p?f|O=LPT zH-2}u53_@(lqOKQqDfT2G$m!m&2HPbrZtwbnO4=bUJ%(D3CAOe-f)MVj3s&-4`-&< zSu|+J;$eXV0w*)g5(0Z;cHdxEcp%bi_L*_;8(xdYmPC&gqDq=7r*srkrHeQNp|(@r zS1FoC)0u+3roG;>BRCSA#OhL-NwWfUjH20eEYn0ybb2q2EoCRoNI%o`8b4{ytT2X` zjTO+BIf|-jE;dBEyUhVe;FzopJ%fpETQsEEN~8w+&17RKoj^4Ks#R1+^-M=)FlPa0 zDjYD)Elj8T85;{OKXoCRM<)g-tY|(h03%}%HCu5xLo1mA`L^X8;H)h2U6Rr(HT5Sc zI+;#k3UoUFnCAOw9J9wIQLDt7t_y&&F+``)=>a-J(IRSOnv~I*mV|BgicSZ%M&g6! znjWU9H7$M+?h3$ILQ4a5rlPZG8RVX=%u%a95=&@RS!bpO<2V_^f;dQ%?_c zt+uC(WsU&`^=!t`WTW)#*Im8U3U3v&4f~9weXt+Y41}nO3PcfBDtd=#XHmB`n6N|C zLaPIGwn(MbQ%WtiRx8mfI=x89uDSEdoD3=92J((3DxX_5AF6xGgz^0pqTB1yKE;TVryl*TL zk6j$;ikppoak;7&Ad~5oaZk=n*fD#^e{L)EOn`6*HQ8IuZDRIf;jVjL;Y|c6#xyT` zwWlK8@CJ4yVTW5RTNI+rOr_w|f&>jMd*OyXFI;=yb0gP2fA5XY-~71{^-#Zfxdhy< z%ctMH)^-MH0Fuhs5Zn{|ZiteU3XrX6khU_-=uU+D25rlVhjmQoG9!s_6Mk)g&xNve zTLVLDlNS7|9W&t(7Wq-Rvh$gWJ9D0I%0UYylQY_;XoxOm3JnfKp+wFxWs&bfsNGyb zm(pbcdat7Q(RMhKLx>DoX}f3BVMpvi&>C2?a%F2v`wFIoqbzrfz{l){1zk$-SM&k8 z!if@{;&+%PduHL6b%>(0L(vCiZ3(o`As|E+eMr&O!f&y8;b0`53eq(QUoYNy`3v{n z_WV`1yu9lUoaBoK9)4-}j+bxy=u7uK^!yzk4AD-yE>I z^u(NU^B|wg%iapd`6;Hw*)({&UAo7bp9{mW!VvureL6s&QFII4>LxKc(=)B+qVQW{ zc6eh_=Ri=F(s-o5D;hax&`b_7b^7Jm9FL?@a2i5hevmL;ga(*=Dtw^;3Abhdx@eFZ z6wvL8?x4@YxdU??s2ZVB<3sj{O$`nVSV=qFvC>T+aEQCCiqPysBre)*9ISdLB z4$TWQ*@af}yjGsmjo#~;>R}1Wl}jmof%XLGi;DKrmzYk=tp|tHBE+t^PB)j=973W# zNq9%&k4!oNsGvgnvYgd$-s~-X4idCS6z!)2$Rm*`XC$bT$8;b}Z}4MtGb327WRD^G z3OyL0hZH?b2PLj#`)4<~a&kwVsNvD^)uC9b-LhBo57^MEDp!Fuem7CW%EsEwBJ8g! zdX&D#RFO3Mt*vmwt|_%dVF_XXRxOG=iI3xiV7uP{z6_mxwmlGDgT_=yuE^o>GmK!1v28X{+K;`ftb(F6+KPA5Y>rD+H<_$@Y9Yo6GUBOkYezc zik_uk!MDTXuStL>B$0=0fTPsTZ)n2lZxsEOo^zrJPDhLE?3|?Kww1g-({Yy2vM9Zv z=tapMN{~!>M-`=)75$EW4;h0iU0;ffE3!^YXPBZ!e^m4*osL;fF4i>U?vQ}-XGMRZ zzrr5k7V@KtRx8;XPQ`mpz98Ic^&*#V4AS43=A7q5z2`=*MjSkUwi8`iqOW}Arb{lH zxAc5^7(8NwtOg^bk!6I6Hib)QL?4tHSLo5;2gMI@g%N*j3jeUrDJuq*40cg<9XM0 zzEzDOp3GAMJXP^gd^FQ>*~*q{3sCn(Qkv`&atO{JGMW&Bk!S+RG@c&d8H#7}tgNcf zT>;v=oV6K$uvti(t@v0z4zHtVJJ_ak5_!^Lc!MBUE1oOqSYax%)eP|oTod40#dTco zmE3l$--Lp8N8-zopRUIU8l12$@|FB!mxwv>JjEw+m}vscX@kygo!v8BG33~$TR*%& z@j^ZcCX$K`I2ls2)!!dUM5UlwJnERdqzG%nb~2Jk!I6c#`=jBOjxoC%OZgN&HNdAS zKAq1%?w);oM*<4ALh(tw*IXu?>iPNKY2@tJZU zWw3^IW-lVTnG{jVyJd=-#EQi`t=KjYOPZ+?Ud}55yi)Nycoox3?W?u0ZL=TwQY0R3 z?n_z;YXkadP|voO*4CB|#B`@d$+r?}c>=Fid^V%zE|kU|(~_Fixi+nL@dyI1w#;$b z06bsVr2wc2g@doZh;%X(KDNRGm z%@m5?EMMWdCSNt?PQiQgxri~m359=7J3Ydq&C10gyYu*+0X|>xyZGJEY<(s=6eJ&Y&>S*?ht z%=M5mEZQrYG=_AJmfq<1RW3;(x`|${pb$qygSRM-iv~~fnT8ukIl)$d2NYi@QRvuA z{t!!SwYHe)c7z#qsssQL-;dsKn`!r1(e{YwyTvKRwoZoNRQn{j1sO&A1gvdFw&*yh zApJW?ZwBdiL3%9&#Fr|*O!j0$JUf<%%G>uT-Yzsv2MjMAjl?AZOZG&%Oco!mE=A>GXUH3-f%aXll z&?ew*+>TC=QL4^rNuUuKi_UhcMx-qWhE9V?O281`Nc{o+G?MAuc7y^X<#l?NqjQl? z0)l)C6Q2~~+h|9CZ_j%h;QH8H-9$;*rF#_Q&jQrK5bx&C1^Dxd@8Y{5-P{C;4Wzl2w z3#HL|33okavQ2V4fZeP3OLDwo4bBSh&6gDq3&IMGQ1;3j7wHJoNr#0rHZU6F0mTn^ z%BJ5*IWD9;sQ4j4I0*>TFEqXoALK^@{8hz|^4E}Lj7~FGMx@m~?YVNfuwLsJ>?v@@29!TByrBya(u8yD~j`cSup(bsV&!%!t_ zFxhRQAz$beB4w@U%%W%Ag}CgvZ)Eq#m^vdc0YG#o3+=ub6sa*^2IIdR8%w7cGf-~w zi^A2Zv5Gf#CQr#KcSLU4ic|n5s2hb9WA~#-++q%0gxHFx(PyRXWzi^-4e&ELnrVP} zriSTq2ZoL%x@bo6VMB(n9d3aS%9ha3fG4H4QTy^Ge1~E1jY}c0lC*zg`ow=rc>gJp zmHJ}Ccj(Y2QV+1T3- z2zmmNobD~S{dEm}k>i^N99H zr}!)}9dWU$%mVeR~OO?L)}haTX)0O9+`cP6jpJi%d(8R5sZsh8xrBOnQebLaqs_M`c8L(t58N^tbn5f=<$i=9f>~ z^Fd&m<}9xsQ)N`2%+xT(XXd|p#A#Q#utv+U`XpQhy60!HiENK4+Na@{sd8l-4;dx5ySI$c5 z(4PY3i=?u)f) zkeeg%cn9pHvD}zFs*&k+MLHp^l_>b=v(-C75pqmf7Do^&>yNVH{LP&O9fW~Pz$+9Ggd33#0ZufK}@vCM7uHqMi7E% z!Hs@W7x-o>V4Q`Z$Fh4(xSo#sB%+P;Xax&Oh;dJYEf0;ewx8_ zfQ}HI_f5eS`4wftlL2^H~A@m`p6-aSQy z{4>lL{Bua^Y5oO%3v-WSkLZ8&0czT`kCwN(OyVv~Guc)T7QobgTEXCF)i8N82k0DO zbA#b~x5-_7fZjRg-TCzyzNcy4HsH)V>1cc~R!8U3O4@|4wKi+sXFD{xya(x>{0#pR zyc|uf{4Dr1(%d;SPifux75~~jvg@(G5M0&N)eqBq4pOw8=iNyY9-y906&LKI_`?nJ z3LYeDgf6U`H%u386qRsJ#G$O0N~n(}QVbZkKsV#K&F|Ng)j4p}r&7be;os_0sp04N zdC*Zp$M6gMBH+CQs6pa4>F5A1DnyGXLh3K$=Xd83+SR|u(;xVc4$XW4Ad8ya>e1ZB z4OukrrAvnC@`ho$a+t2ViApLyJVMv*8KIB0#CmSD4ZKo^gTG~OMp{soA zeQR2fx4MEXp&PaM3_!5>Py7mwvK`+c?$zoY$M>Xv#*?GoQz35W-CrO)=iOiNP6R)l ziXFjEd7I7&(9QtO#J_1xc%(dM@i+dvYZdPWII)WPbrn%9)*pLf-F<+5LNo)0tfjoW z;-|y(Ge~to@!~QPrK)*S)b4Ua4ma2{}Z+=e(+UF zxVoIgSZJx1qxf}OgQEt+^n4vu;i8Rla(H-YKmEa=jB9i7-w2J`MdkD=S{B>21Q;+j@EhV~wK9dM;7#fXkQG#UWb-DU;p)!$uI@|+A4~9a77Xdi zz1%#^Eo}{&rM7$0Y9e2a5IuHS&T;+E zQTQJ&#C;p(A)~-3bkG{t00MY5mevh(f2$$qn!Fpt58FG1^cg>m4 zEPEDz7qmb1R~!QMpZmn|2l4k^^_4sb*S(9D6)f3Ji!r=N4;L0EYyJ49hUQSPzQ=OJ>{!XoMRS=RXN_bMTYI&m)*G$IrV#=Ow{gcnAKzw~{X(<`3-R zAq=jl-1n91|O;9kLke*tw?(?CE!lO-!!;74AS6cVvq(` zjzJn+0R{l~aREpF)b7&-M=#-(2acY`zyn9$#lQnck6_?|qx&%cxEnM$cw=~G58N)i zN`t!wgEYAJVUPxw!~ozvp&^(U0Nf|_;9MO)J#ee>Dh+N425E5fF-U`(gF%|QsTicG zD>)zrx#t1CaZ@GVw2yCo7$@YU8BXRoPivyiJdLGBk%929-OVggZ_#478=i>&O6R;m z?dgB7Q9CpfnYn8a$7$Ur3Z;`9F*Ww(x6fcbQv1VR|0LFPp7*jDk3UgOL7DrQoag1@SQLUfm8pj*8?o%C} z0L55noMfDAoNAn==NB5M8;jlfrN)_h-dVLQYt)oAYIaA0ZKbiwI9tP7X|&>L4JZkL Ms(;H98L`q@tiM~g%~T?qPHD!)wh>R6 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class b/sip/target/classes/com/dite/znpt/monitor/sip/session/StreamSessionManager.class deleted file mode 100644 index cbe9958bd1f4f8be9236a4e835627b649b459e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1201 zcmbW0ZEF)j5Xb+U#KtD4jcskMwOXHQlZuBTBBT^0AihWxOo{a6=DMa^bGygho==}j zL0eD|U;ClN*}J0#O(6JYZ)b1jH~*R4`T6VXcL4XXRY3v8GD;p!VTPf0$lq{($ko7q z-aiz9WtiEPO4=QU;%2>9#%YF))G4uY=m%N_i7`T1zjd;G%Hx9$k18mmIEyO0GR}B7 zi#dh|fe!tBX@&nmMb-~Bp|$a28Tqk@W2u$jwMOu;n^_&M_&^wjO8%R;44dug6f~WL za~|fgK=Px6s(F~lj+EHUXrm|fe~%pMyoV($6KWs`wJ`=YCa{bZhE*r{U0P>rD5+h$ zhO3wdmMUhL?aG1THZg)>Z_3)XMb*v*8)Xoqgc>f>&Z9{3#}%y8mpV$hGFFFJMLMfCKBKaA`v|p{ ze`6L1x0qtqGuIqLLAZwNDY}XqxJgMFO~pozenhsD;ic#!EdIcSk7O6%B)VdN<&?XW U`JHgRoLj)H)PEE8JfZ>o1_>@XH2?qr diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.class deleted file mode 100644 index f990895a791feb0ffef462564545f8a5367030ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmZvWO$x#=5QSgrPt=tg7hb~I2;QI|2nszxj6tTfNl8XgkLJPycqlP-?P6x&J-&~5 zf1WP@YfLo?g^dj@omd<_d?(Zf&k`af?nt8Xsb!&xyF(1tr4(XmZ0_${jiJK4HdjN9 z@n_l}YiC7ctgz_Q+fR|n9Vc<#MTJ=vF44M@8>g`RCtdYqHYg18jPjevSLa<|@&(+1 BHQ@jN diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.class deleted file mode 100644 index d31e0f6229c1f5c66014aec302f580308dda8e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5027 zcmb_g>w6T{9ez)46E+h93AY4-f(i)EW7!Av80XLQ zq%ui?I@>srH5@lL+oxv)YI;2gS=UTz9Eet7IcgNFP_YuV0@ZV72`ZB%#>bodRUzQf z`6JEqhon8LRIHZ9tg;O!W2GG<3`h#BRk05BB*!&VhLz0&7U<|*0t3M^t!KDkeN<{+ zuVMolX-U#b2-Nmkc0zNKV>>6bUMrC>?5Ki!1lHyqGvwN4IT0BGB06EA$0Z^tzrfv|ySlAB3jhAr(9DFpY|(wehTLSxIfevC`VXp@IIV z>3D%cJ= z6}{-A@uzehGK4+RaH&JL$2;-oh~bGc*U(p!B+`8 zziQmjnPFPjka42h`&tQ|SWcd##7g#?n)O(_b_b&fCKaZc}4f|1`k^X8SA^HX85xl65xjt}D|k`GH}Ddpr7&BAuHt*bFPZ`mgoC#$sXGpfM&U}<*0an* z>2l5MI58_7%i1<8sMeMH+O0d|Y(){gEL-I(0=t&rtzvDD2#3r>no(ynZsL9}&33x> zP-+F0W+}~Ov80c7L4Qijo zEa+T{U5omTt;;jc=RKF_0!RLD>lSsPw6AMvs2A1aJEicbLq?jGqI}`AlEk+>U^sBO zfErL3w2O6~TV^|nce?b88bLYpn<5WQ>;bXkOl~hK75rk(5!m-E8~mYcS^^s}9g`8< znNC}*d?wF|0z3Sol96Y!FE`@>QNG^WuUBKz}SCqduhOP<2x1h-fqqA*<-U+-}#5;3jnNI;DJp=ns$Bc~RR^Xm+lM2n`H&|}WN(WnnjhVNC zwg%e_%gYJxBHU)!uu~>WvcdClb9lp|GWo3=ybDgDjsV7%5T}diVJ`~+?K5>A|HD}B z4`V5u&cj$8FIX8M*c3ugd^LlhJ;n(2?skzOD{IG$1E#Fk8y2Xy56YS+u&sE+yM}F8 z?wO3i&Y9vpiaj)nO}yZgK;T;_Lxa5M@YWfTcSnwWo8L?D9lrDWm3x1c@4Rhsu8L#4 zl=Aa6zG-|4KFhb=fVk!@eVw0j8WjI7Kcx~1;Cpz3Pl0oIlb>>NKT7#WiR(~WTBlK6 zio+L7M>p^(Iu2y zho6$@Qv8gPjDye6t>EVh?-}oMK>GX=p8}VW^34;6DXehp644*(Bg7-ToHwq-KQ1HE zxKgzGkGC$NTME>EZ5pG}tYd9u^<~o-<4+mo*HKqr9+;bGtEjK|1S_P$rW}^WNICLA&{)VEV-w{bUlV@;@!=7?O=rMA#G2P zxK6ZTFM80$nB9kGupiHoz!(WU$)oVQ9F-Jy(^lS~@g9CjGTYGX5m(N24R{|H$Pk&x z5qt?(@GG)aPExPp*JMm(^!^6F4G3P3iqFuX;HaqhTwaThd0Z#{i%3mV0pY*H@2N<} z)1&;Cp*b%Xhe9DKau@{ufIo7nzz6v7ZYqu}pyC>?dnzXJ(cM%$w}6U2(HRoO4cxq& ziqQpBOyd@pR^sDaZQAWI0W{WD-o*2hGQnPEf_-xmO72^oOcdcI%5w4!td+n0pq3@E P1h+jh|C}S6KhFIR1N?{F diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.class deleted file mode 100644 index b090313aea7b7442d92a4d8d6e9214a4eb5525e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmbVJu};G<5Iq;#Kq(XkBtD^C@WMpL0#c+(43Rpp9q|#litXTBDutE5V&DV#s0t^o zL?t2ymOJVB>AmN7Uz?9l0Jwp11U&(_sWVb(Ci!Lymd07l&dX94l0DkeXqKr_GEQ`H zM{AwZ+!=#bk&oa|!1)T-D08%#e0*L}$^u5O75RFOjJeB#!(`Fzp`1Z&C0W*7%dPlQ zD{}WOGMhdL7`Iy6x7fZo0T+8n!pK!A;IzoGPS_Kgxlsb%|7*GU`Av}1Hk{Io4HH-Slpb_W0H%S4Rf&c&j diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.class deleted file mode 100644 index 5053b5ce245eb066801383f790b3b68b01b0d395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7088 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 POK9^d^4m>=;#lBc?kN;b diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.class deleted file mode 100644 index 08edb4b6b7e24999dd245c1288957faf37299533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9484 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.class deleted file mode 100644 index 0f8843bd1423ab13c182014189b5d57508d3e137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZurI|{-;6r2}7Q7c>V0^0Z*I}0lXK~N0X$90hn$!^@;1o3DV9>7D1iLta92Il*E zKb`>Q=!XahOJOoTD=+!3bI+O4${Wj07 z;xgtm))(HL5-B_(%o_(`JlWRr?c4c_uS%)?VtOPDB2!o)*D95S(Z7XRo$e9{t?D;G O)nEtRnjx$(K<@)C-aYjI diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.class deleted file mode 100644 index 52cf25d7824a15cd919949cb9c6eb770581967f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9865 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 E2_e5*=Kufz diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.class deleted file mode 100644 index 0bc3a8b6a6d78f8828d829d9a4abe70fcabce2bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2919 zcmbVOS$h*z7=BNZcG7fM3~O1m>}{YOps3Iw*bQ3R0@4}8;k%~o6)oRz<&_!f`Nq(gRXP*QPrFW5dYbIxs$X zs$U>EGG)%1M!~f6#+dI~c0R3yuGH}qk^-w}N=4ga)YNh31P+fphTSx`{-%zot79Mb3#_bHL?C9_ zla9cyM>(S!bEhVzWY#CT8V(3Nop)vp+hVpoLpQ9vhLlzVcfI3e9~mY!%vFZwj} z>lnZ>LQvJ=fg78$t~7ngETm~|Cu$|tsYyJ0F{on*Cj>N4+PU!362YS|8=!!nhKu_0&5--B+9&ti_(l0W#C#?mVC>xHJAchtB?=b zvu44{^|<*N70xwuS%HlzI)nJ_ce0BK5|EhGkk@fpRrFO=G%Gv=R+Ly7{V|^yjpp`fD(n=Yu2{z|1(NgZUSz>ZoY`wFJ#g_*S|fi;u__Lmtdq4`PIEXu2nJ8euz zb`)bWD8j}N+XbtIb)7W5Jkh|gJo*^Lbg3#Qu&mFqJ>Rtbj9HkG%&aprwr>?>#`3I* zg6y$v$2XM&Ji;0Vr&-x#Ve_0BH!IUBPn{eYtQfIu8Klj)Ne-&zI9aohFs!(rlPu0!Dd@e_{=e&8MxY_bJfo;X|h7wn73e^c)j67xsyudj};u>=JZg zIZj8-QV4DQaJCRWE)rv9?;Nv~A2zYXgd!@9T6O47l>!2(pt;lqp+`uiw=kQoULr;Bg*-#*c3bu6?c>InHp5apY5q|5>gMkw$QA zPThk@CAA;WbeGEruJW%$fXrjqglnAX0V(EiohyMGHEg0GoA0qAsio$zs-Dd@vfKVh zHgDi2FH;+lqNql)mb>TCGRogGC%?tE>3pxmMC!3VPF1VL>yLfvaE@D4&e5@*r1_}F4&fmmaG^Pu? z@HXBdhl~7f;a%?0ybwV(dk^o^_y%0U2c(No&Ut)@+tlDAQnn!S4@JZ@Bs6T$a8P5{ t5*lP9;`q1%|CTcNKvOdDBdqVRO@S}UHYi5}>&f{OjuCuX35L&re*sC~DD?mU diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.class deleted file mode 100644 index d53111a265079d4b1173788181e7d7c6a4eadaeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3412 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 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.class deleted file mode 100644 index 860549941298a491fc18a16b08947847a82163c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmZvXy-ou`41~u4azI7FLqLNYy0nBJDF`V@>6bk#a&)_U>^djl(I|KT9tyFSbcn_p zS>u_{-#?#U0IqS;U_!X_DR8SM{1JQOkfK`3T(oD)E|#FiSzfnNj5YKf2Pws^g&!XG z;@-u!lic8taJF%SiQ^3_RLUM&9aYEy6;S)!@E^NkGZWu>j8`ED~? yjHz!sq~)GuK2-DUaz!|OPTTC|Ry!e_|6#fs52pmeLH!t@ig<+SsL<3o!SOG~C{wcl diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.class deleted file mode 100644 index 95a4f14369ebe2c9147a3e544ebcbc3c5a2284c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9256 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 Yi-K1K_bhp6FVBBQS{*(wJN^scZ`M0{M*si- diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.class deleted file mode 100644 index f664228b4668c5580d18b08fe1758178585f2c80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3125 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 M7sFr6_dc>|;FSLUMQ9ok4sw3m?FT5)*$qn`MXD znQtG@+a16ZU4e)&Pffu`6(nD^4O|$lf^qDX<=_(S3l-Q&Z;kenSFy6Yuh=@1O7D#m zXcGEaQYM@y`ox<cI!%%_3AmC>9kfy=S*+P2JrrNvha?g*OF#^;ggiX}Z5NJ>3i=<2z6S_;LD)j=5jxMyn5U3p< z4I``x^iq@4NP9)|qV$v-){P~nOY&A0F4vx{a-}JpqTWE44@+`yO{$zTwwpNaOnrn{ z;MCX&xzg%lGPW{Tuf{%8qIeLExyRTy>al~CnVxgcB`Xn{0^OCLArM}fkrHV2b)jx& zd7|v2Ofs(Q^i3+Wp|rZ<%VOxCv=g}Luk8G{fOCO(U}iQ|*SfMj_;+0=RXX85A`UIU tIyN{%!H1(`++;=z4%Cl7Al|tUV2iPmffy~u=HgyQ8{5qIr;Gu1e*pu1nmqsj diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class b/sip/target/classes/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.class deleted file mode 100644 index 05a660468d63144d35bf3297856e1223fe098f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5488 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 Z@Dws6(Z$&`UNAO>8AinLvQ~~)z;AoYz+C_U diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class b/sip/target/classes/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.class deleted file mode 100644 index 872ec257226a30d4f0a71870e67d0947ee6be116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5212 zcmb_gX^>o175;87^LlyR^U{z&X9EHWvn5SPLSQC|nJrAhOcG`blab|3_sevLo_?L~ z*C7drAe$m6$RdJ*MiG~wtdk6hQBgrz+;K&%qRO9E`NyJ4h4|gK^z@L4P^DGL?fdR> z&UeoF&N(-E<=q#K16Yl}MBsy8K|nxJ>uwz1tt+7hT+mn-C~4Fdj# z#$g2^fsJW%B9+NmM(RMJXr(4h?wh4lIaf?otX#gF>dK89Woy7F?KMj66)S5LtXx{R za%Q2&$QO-L2oZ|w>sk|mikO19ih5`Q3vBIWBV8%wto^Azqg>X<4M&h@w9-GRF5NOBSPZ`$mZ&%v=LsmZZZJ1N%joAV z3YK}I?JNCyA!ANNuvA`JibfSp@=~Z^?6Z2!!nlGKfivFgkd8_&pD{`iG|L#LJP>wx z<*f)-V5Nk5p+KNvOXILySgm3WE~0G9bPN(Wy}|XYebaTelzOp>OVCP==*6N@$OtSy zbyRBZy13e;h}F_x>s4&Php3ZI=-6)=Wr?S8v_tZvT}1~vsUu^vij#)X4tq~Qw~9@; zl+>_;;=!FK51h=75H|C&!=@-ML$8896H&`L*}fv+d{aUM4|ZnL=*!UR4}As7&`=(orG#u2?A=_u(sPB_nS>7$ zzURt?4)z&-bN1R~A{7Kqn`U|UzO+%4WhH_l_9!T+D1#+y$+)>URmhdCRN5>Vsm%qt zrJ(1#OC__^!%WIcFV$!5SyhI>nYDhauG@O|3Y<4>Le}Akqynuy;8r%tn-EwUVly_P zIDqRF+@RtkxKSWEEoRyi^lh2A!=%6Gh*M|MY`%%2f}2#_Y$qCtx-IH)e0UIm^vy1n<(ZT*`Ed-?c$5_L9zCv=wy^8~#J>7lXEKHqdhU@jcxq`8^GBIY92KBK#R}#HuTF(#b zrJVeB7Xwx{M_3)b|7*`|6NpqfSyph!tq-Ycx7%tCRMOdYF9WNG>G>T0GMs{m>l^K0 ziz%7}CDJr^z|zy#_UT0%uOd5KAj8~e_i?;a?N|g5u=`BAJGIr}g!n8d0{td(E$g4NGSw6!Wt&tXndnZ&wDY-|lBLr2i%0F$OI z;fn^ig5wAw?ZiBcViB>l;YvF7Dh%Qp+q@pz1v_2WhtN+)PZDnoeK?FG#6ORLn!*co z!y>H5QLY6k;dC4$85GK?!*}SA5bqqvcU?>WL01K-f4Di(GleZaNb3^YmrtSJ56-S2 zId*y+eXYU;s-X(hFy=)2K*2|vNaCl zCA>_J$hFI9z26Ra7{0gBr(mLvhklHoI4ZjK9HT@Fj$j0dMa%uGMkxF ztznxLA(s`AWQ43}jZ)fYDNS|7B*WGFb?((zQhf=Fz5Q5qU-kA+-imr#wn|>HiRh|~ zQ{}@{S)Yt2>nHJrL-d-HbXT!#0M|2OHz2|1<9ysmw%){8-OM!OyAHSU-%Yo(MBKsh za2F$YHzRisPu|Pj`?zvHWA^|K;Xy{@A-u(>)!*?j-o_(1fk*AQ9&}vq#gN(f3SN~l z}Upv;;;A_cZ0<63+By1vSR}S`g49M#PJAz$+ZyCJcM6y z7AB@UZT3fq>=yi*Yf<969&d1_63I3A4QDZ8)9_o);zSrCiw^R?24u15MeyH9D5$)H zq+}F}qkrwx` zAU?{H_&AHovn(qwu#CLO;QxuVeT$Xi9lRpW#H(T%UK7jlx>!Rx%8ql$30#%D>#O8l zk3Wz)B(GTMkyo7SkykA6$V-xY$P1&&tk58qzLi_&7gGe3d diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class b/sip/target/classes/com/dite/znpt/monitor/sip/utils/XmlUtil.class deleted file mode 100644 index ff2a46e1d11298183863cf81943aa7e9536da321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3274 zcmbVOYjYD-7=BKYc9V1qr8g+|JH0_bK%l8esZo=?ix^ru5!pF#RFB&Ni9NbD zs9Rwu2uqX-fx5<62`8@uEfBDXDzMl^ zqHbO>+7v4xY%=57l%BSu3Tg#rj9=J164!_Aq?rz(9#a)eQ_+Cw0!!j%Dl(X~^~mY; zupLR6^w6{-ndERJYbT9Nq(5csXie&;*N>D{ZMK3@snSkPdfi73E z0#6Aj_zs|0Esu?%vg!?Ltfv1G;$V3<1RE(-*iSxaL^S#M*kx4Uv8bl^D!8&zz=X6{i!D5%h# zAuZGGxWmdnAT744*oN&a&h!Lc=KF=ExPxAnV%t%0MLO7}qPq~OZY`yUu?xEu>`~E! z-Z9;m?;3WWemtug48xe7a`$RFpkN;}Sz^CU%M5jC!(r@|5shNMiUShauMG}Xpc7s4 z@w|!`B#R*PwNEp$dIb(cQ!t<+4mMq736EGb9?mkTYrPfW67VFsKxw>4I(|e&LZ)i6 zTVRDKhuN1&6-RMQAY?Fk-R7W7`kF>hn->b$16>#@dC}O)NU2D}Wa#K~hru3haG5)5 z8%@LDT;oiLHXR7#I4lJj6*jU0Qy*>FEn1vabc);_~*r!=Z`Rxh=_E3_JH^m-vG;xFAux4d+jw%5`*jb*C z6((bG08-sQA~mbWN0CT_?j&XFPJlvVUq&`l-u98n&(%;y8_CaSfoUE9?}(>bWsj}J zkFlm)pVvK6mYq|{O*{$dDfXFXuR@j3QCs884i$$8o5!P9Y)BFcq@5H6<&W$~HoYuD zr|PR7tu3m{MdGJqS4{S-(|~BT9!a6VDXx#1-gKWDE~I>`M_&%EcF#8v-A}LEc?Hk$ z99_>po@XA*JkkUM$kANw(R}kBEF zPssv~*hLPjRoryvk`bm zxPXFP3Kl9*6zQUZn#$m2h4>*J^6$DHo}sm$HgiPtHI#|#&7|GrLzifE-Du4rBHe&X zzuF zV=e9yK%vT2m&qNhWSm!bHRtfOK(}ZMEX^?yXe(^iZOwk z*m(&nL_^>j>h54KA^O?^tui_NKJ+yN8p?Ax$diOWhXitX(T~2-hdP-@tfukp3q6yM-0GjVbNK8tkAXCQoZ#3%YR# zyJ4XhS@bcf{Y=7sT;Q?(Jr3duS7kBoVR@|KdH(^+2^!wrerdt{>7sH7e)Oqi~5(SFEbTk**qj# zIdkO{67NI&e^{ZPcz`wqo%d09AHD~&zB(4+D;oLmHR*p-Y`%Fc0QoOeU4I+HKch}I Qpzt(cHNU>4%!kYW0`KB9T>t<8 diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class b/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.class deleted file mode 100644 index b84803c7ad1ff8514675e6294731a1c0c7fe1472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4487 zcmb7HYjYe&6+N@BnceM`R&pd~i2^cFV!fQjL6BtD7RXu0NJx%j8$-e?>(wBQz1m%` zMur4J$P1DX9^si6`IN$6T$QA-p;k6tRNSa6~q>(XDJXgC|D>rJ*weo#u&pCC^K<1F!biH{4$;qiR zSy;%L$SLHZ3{2Ns8|78kbIOl2+g^F2MP#c}-gMjLi>-3ix#-rNg+{Hjai(R!TJ`&j zs|JRbyYD&Wb=>A!MJf*{3`$v5lbjPBx7Bey2@EL=OCawDRvd4=wJQD_6h_3K_5G*a z4M)6t6>b!7(f3xJ&3eaedv2>K!4D|hgfXTxTFo`r+gf!D7*&aUP~k%ou^Khc4~TQ0 z!iOVoc)0E4=$%lw6}J&uuQiWe*s3)Qj7&!6q`9k1Jt*Kwg(*yPR%?#8+{nY`XB!-vNrv0C4z2WLwK}yZ1@BP!s1(dg!CcDian|XauKD5|UT)QEjWe~5EB(Nk^4480)9mu@&xQ)ex9NCY&Gu}jkZ&&9AW>0W zlF`tkDdoIEhww=*!)}C34T@|OEMvy&$Xib0GJvDt# z;gnaapI@o9gY{0IIJvlTlmsnu!*ra@tp+cR+{BJh8Cl|SI}yrH>@G`%iQc&@-4ExO z(_KBAA>HX2a0u{+mOItj>eQWkT{$_2wVW38^>e!%2-wFnC&7zPp1i2bZwtTW-Qc&p4%m)>D~}AH7uYMaHQ1)7ufcfBhjsXrFrC=sQw6q%E%ppK zsrl?pz5?@21{3He=VOz3NXH}>`jd;X$vnkll8gPxqp`_6=VOxh^e5jGo6Nf)CV8|! zc|10mcj!)Xf|js-1*JFo2)i{lnfGN(^3DCp)3M3CqIQzQb-se}{$ZD6lP}_{L9)$- z74c=JXRgAGSIMYGK&wO)Br=tkel5OEVYhWe=2GY3_&UYi){$)@bsmYYvuC$;WSdEy zugBLJ-EAG&rc&n{c$Ciz22KNcWLaO<^Q)a^OA(w zKgj;UNPq4)9dmZ-z#ow>rQX5NC8z_X)Hd!4D^%<>Ar(7QN((0Q4u&tGP)e6F5zxGC z5;SjHB~w6F05VHf1himh30kmorL2H*0VrF_ML<-II~yQ=h#rYTm+KWsKolc$}<`7$%d!;RX^{$D0X&fg|l zGq{_roH=O`i;xq&TQoWP$VrFfaJo-$Xd*p+UF$N5*Xb=V``u#YQ0lM<>}@O^87o%S z_Z7z<-S^}(4~dfsTe>qX-qAGOqv^muXPe>_kyyoA@rD?g-mLKGLX#^OcO=HhY20WV4XjZ6Om z`AFk0T>KZvWC4G|kMR?V<`(=4Kc$t%U3d*YBY*rALP7nUmW3wP@gl7(WwL^oXyx!a z?!e2m^7tM0;uTs-#9-J^?^8P&6P975QWO9T<9)7a)RPd`2+S_1i|ca+P^$;pMPKg^ z68IxO9Do*KHzzg}q~&7Lx|#ni8YJiAle_u<1Hcko8~$?9iY2#6T0r|ZIQhUeoF4wn zHa<&@&aoN(ytXT1e^J}>Vt-lN3u4!_T@|~o?fu(uhS#-yQ0#NsJ|>t3AKPg5e-uPN P{@Q_-47}>^#9#aeDDE`a diff --git a/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class b/sip/target/classes/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.class deleted file mode 100644 index 3a0162a06b7221ed2966d14f7511b8fb9b1a77b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9902 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 diff --git a/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml b/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml deleted file mode 100644 index c43f856..0000000 --- a/sip/target/classes/mapper/iot/DeviceVideoChannelMapper.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - dvc.channel_id, dvc.channel_code, dvc.channel_name, dvc.address, dvc.camera_type, dvc.ptz_control, dvc.status, dvc.remark - - - - - - - - - - - - - - diff --git a/sip/target/classes/mapper/iot/DeviceVideoMapper.xml b/sip/target/classes/mapper/iot/DeviceVideoMapper.xml deleted file mode 100644 index b0820c3..0000000 --- a/sip/target/classes/mapper/iot/DeviceVideoMapper.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - dv.video_id, dv.video_code, dv.video_name, dv.transport, dv.stream_mode, dv.channel_count, dv.status, dv.register_time, - dv.keepalive_time, dv.channel_count, dv.ip, dv.port,dv.host_address, dv.manufacturer, dv.remark, dv.create_time - - - - - - diff --git a/sip/target/classes/mapper/iot/IpConfigMapper.xml b/sip/target/classes/mapper/iot/IpConfigMapper.xml deleted file mode 100644 index 339afe7..0000000 --- a/sip/target/classes/mapper/iot/IpConfigMapper.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - ic.config_id, ic.ip - - - - - diff --git a/web/pom.xml b/web/pom.xml index 5d1f8d1..38137db 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -29,5 +29,10 @@ core 1.0.0-SNAPSHOT + + com.dite.znpt + data-bus + 1.0.0-SNAPSHOT + \ No newline at end of file From bb952bd01fb924a1ecf68cb2d0a529f0a7212490 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Apr 2025 13:54:17 +0800 Subject: [PATCH 009/143] =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/CombinedDictEntity.java | 4 ++-- .../dite/znpt/domain/entity/DefectEntity.java | 9 +++---- .../dite/znpt/domain/entity/PartEntity.java | 4 ++-- .../domain/entity/TConstructionEntity.java | 11 +++++++++ .../znpt/domain/entity/TurbineEntity.java | 24 +++++++++++++++++-- .../dite/znpt/domain/vo/DefectListReq.java | 4 ++-- .../com/dite/znpt/domain/vo/PartListReq.java | 2 +- .../znpt/domain/vo/TConstructionListReq.java | 13 +++++----- .../dite/znpt/domain/vo/TurbineListReq.java | 14 ++++++++++- .../com/dite/znpt/service/TurbineService.java | 8 +++---- .../znpt/service/impl/TurbineServiceImpl.java | 12 +++++----- core/src/main/resources/mapper/PartMapper.xml | 6 ++--- .../main/resources/mapper/TurbineMapper.xml | 19 ++++++++++++--- 13 files changed, 93 insertions(+), 37 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java index 2b1eb6f..b644d3c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java @@ -12,7 +12,7 @@ import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/11 23:17 + * @date 2025/04/24 13:44 * @Description: 字典表实体类 */ @Data @@ -21,7 +21,7 @@ import com.alibaba.excel.annotation.ExcelProperty; @ApiModel(value="CombinedDictEntity对象", description="字典表") public class CombinedDictEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -11768336612800273L; + private static final long serialVersionUID = 839158304342208816L; @ExcelProperty("字典id") @ApiModelProperty("字典id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index 7d4ab2c..d702e88 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.entity; +import java.math.BigDecimal; import java.io.Serializable; import com.baomidou.mybatisplus.annotation.*; @@ -12,7 +13,7 @@ import com.alibaba.excel.annotation.ExcelProperty; /** * @author huise23 - * @date 2025/04/11 23:17 + * @date 2025/04/24 13:44 * @Description: 缺陷记录表实体类 */ @Data @@ -21,7 +22,7 @@ import com.alibaba.excel.annotation.ExcelProperty; @ApiModel(value="DefectEntity对象", description="缺陷记录表") public class DefectEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = 272430541345740192L; + private static final long serialVersionUID = 721961595098309935L; @ExcelProperty("缺陷id") @ApiModelProperty("缺陷id") @@ -56,12 +57,12 @@ public class DefectEntity extends AuditableEntity implements Serializable { @ExcelProperty("轴向长度(mm)") @ApiModelProperty("轴向长度(mm)") @TableField("axial_length") - private Object axialLength; + private BigDecimal axialLength; @ExcelProperty("弦向长度(mm)") @ApiModelProperty("弦向长度(mm)") @TableField("chord_length") - private Object chordLength; + private BigDecimal chordLength; @ExcelProperty("图片路径") @ApiModelProperty("图片路径") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java index 553d1ae..b257196 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java @@ -35,8 +35,8 @@ public class PartEntity extends AuditableEntity implements Serializable { @ExcelProperty("机组id") @ApiModelProperty("机组id") - @TableField("crew_id") - private String crewId; + @TableField("turbine_id") + private String turbineId; @ExcelProperty("名称") @ApiModelProperty("名称") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java index 23b1c0e..e1a029c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java @@ -23,46 +23,57 @@ public class TConstructionEntity extends AuditableEntity implements Serializable private static final long serialVersionUID = 295094962841990277L; + @ExcelProperty("施工id") @ApiModelProperty("施工id") @TableId(value = "construction_id", type = IdType.ASSIGN_ID) private String constructionId; + @ExcelProperty("项目id") @ApiModelProperty("项目id") @TableField("project_id") private String projectId; + @ExcelProperty("机组id") @ApiModelProperty("机组id") @TableField("turbine_code") private String turbineCode; + @ExcelProperty("作业开始时间") @ApiModelProperty("作业开始时间") @TableField("start_time") private LocalDateTime startTime; + @ExcelProperty("作业结束时间") @ApiModelProperty("作业结束时间") @TableField("end_time") private LocalDateTime endTime; + @ExcelProperty("温度(℃)") @ApiModelProperty("温度(℃)") @TableField("temperature") private Double temperature; + @ExcelProperty("风速(m/s)") @ApiModelProperty("风速(m/s)") @TableField("wind_speed") private Double windSpeed; + @ExcelProperty("采集图片数量") @ApiModelProperty("采集图片数量") @TableField("image_count") private Integer imageCount; + @ExcelProperty("天气id") @ApiModelProperty("天气id") @TableField("weather_code") private String weatherCode; + @ExcelProperty("施工状态") @ApiModelProperty("施工状态") @TableField("status_id") private String statusId; + @ExcelProperty("当前时间") @ApiModelProperty("当前时间") @TableField("created_at") private LocalDateTime createdAt; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index 6454a58..df83710 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -25,12 +25,32 @@ public class TurbineEntity extends AuditableEntity implements Serializable { @ExcelProperty("机组号") @ApiModelProperty("机组号") - @TableId(value = "turbine_code", type = IdType.ASSIGN_ID) - private String turbineCode; + @TableId(value = "turbine_id", type = IdType.ASSIGN_ID) + private String turbineId; @ExcelProperty("项目id") @ApiModelProperty("项目id") @TableField("project_id") private String projectId; + + @ExcelProperty("机组名称") + @ApiModelProperty("机组名称") + @TableField("turbine_name") + private String turbineName; + + @ExcelProperty("机组描述") + @ApiModelProperty("机组描述") + @TableField("turbine_desc") + private String turbineDesc; + + @ExcelProperty("机组厂商") + @ApiModelProperty("机组厂商") + @TableField("manufacturer") + private String manufacturer; + + @ExcelProperty("机组型号") + @ApiModelProperty("机组型号") + @TableField("model") + private String model; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index d8196bf..34933fd 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -39,10 +39,10 @@ public class DefectListReq implements Serializable { private String defectLevel; @ApiModelProperty("轴向长度(mm)") - private Object axialLength; + private BigDecimal axialLength; @ApiModelProperty("弦向长度(mm)") - private Object chordLength; + private BigDecimal chordLength; @ApiModelProperty("图片路径") private String imagePath; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java index ac11584..8f69872 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java @@ -27,7 +27,7 @@ public class PartListReq implements Serializable { private String projectId; @ApiModelProperty("机组id") - private String crewId; + private String turbineId; @ApiModelProperty("名称") private String partName; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java index da90917..499b638 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java @@ -1,7 +1,6 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; -import java.util.Date; +import java.time.LocalDateTime; import java.io.Serializable; import io.swagger.annotations.ApiModel; @@ -10,14 +9,14 @@ import lombok.Data; /** * @author huise23 - * @date 2025/04/11 23:17 + * @date 2025/04/24 13:44 * @Description: 施工信息请求实体 */ @Data @ApiModel("施工信息列表请求实体") public class TConstructionListReq implements Serializable { - private static final long serialVersionUID = -20191616975838303L; + private static final long serialVersionUID = 790780491672151941L; @ApiModelProperty("查询关键字") private String keyword; @@ -32,10 +31,10 @@ public class TConstructionListReq implements Serializable { private String turbineCode; @ApiModelProperty("作业开始时间") - private Date startTime; + private LocalDateTime startTime; @ApiModelProperty("作业结束时间") - private Date endTime; + private LocalDateTime endTime; @ApiModelProperty("温度(℃)") private BigDecimal temperature; @@ -53,7 +52,7 @@ public class TConstructionListReq implements Serializable { private String statusId; @ApiModelProperty("当前时间") - private Date createdAt; + private LocalDateTime createdAt; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java index cbb3ec3..3fd3947 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java @@ -21,10 +21,22 @@ public class TurbineListReq implements Serializable { private String keyword; @ApiModelProperty("机组-项目关联Id") - private String turbineCode; + private String turbineId; @ApiModelProperty("项目id") private String projectId; + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组描述") + private String turbineDesc; + + @ApiModelProperty("机组厂商") + private String manufacturer; + + @ApiModelProperty("机组型号") + private String model; + } diff --git a/core/src/main/java/com/dite/znpt/service/TurbineService.java b/core/src/main/java/com/dite/znpt/service/TurbineService.java index 2424d0d..beffffa 100644 --- a/core/src/main/java/com/dite/znpt/service/TurbineService.java +++ b/core/src/main/java/com/dite/znpt/service/TurbineService.java @@ -27,12 +27,12 @@ public interface TurbineService extends IService { /** * 功能描述:查询单条机组-项目关联 * - * @param turbineCode 机组-项目关联Id + * @param turbineId 机组-项目关联Id * @return {@link TurbineResp } * @author huise23 * @date 2025/04/11 23:17 **/ - TurbineResp selectById(String turbineCode); + TurbineResp selectById(String turbineId); /** * 功能描述:新增机组-项目关联 @@ -55,10 +55,10 @@ public interface TurbineService extends IService { /** * 功能描述:删除机组-项目关联 * - * @param turbineCode 机组-项目关联Id + * @param turbineId 机组-项目关联Id * @author huise23 * @date 2025/04/11 23:17 **/ - void deleteById(String turbineCode); + void deleteById(String turbineId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java index ed0c9e3..024b28d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java @@ -43,15 +43,15 @@ public class TurbineServiceImpl extends ServiceImpl list = selectList(turbineReq); return list.isEmpty() ? CollUtil.getFirst(list) : new TurbineResp(); @@ -86,14 +86,14 @@ public class TurbineServiceImpl extends ServiceImpl - a.part_id, a.project_id, a.crew_id, a.part_name, + a.part_id, a.project_id, a.turbine_id, a.part_name, a.part_code, a.part_type, a.part_desc, a.manufacturer, a.model @@ -22,8 +22,8 @@ and a.project_id like concat ('%', #{projectId}, '%') - - and a.crew_id like concat ('%', #{crewId}, '%') + + and a.turbine_id like concat ('%', #{turbineId}, '%') and a.part_name like concat ('%', #{partName}, '%') diff --git a/core/src/main/resources/mapper/TurbineMapper.xml b/core/src/main/resources/mapper/TurbineMapper.xml index eee13f2..dc23a95 100644 --- a/core/src/main/resources/mapper/TurbineMapper.xml +++ b/core/src/main/resources/mapper/TurbineMapper.xml @@ -3,7 +3,8 @@ - a.turbine_code, a.project_id + a.turbine_id, a.project_id, a.turbine_name, a.turbine_desc, + a.manufacturer, a.model From d03afd190ea040b5da5f3ae91abdb65477528b15 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Apr 2025 14:00:36 +0800 Subject: [PATCH 010/143] =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/AuditableEntity.java | 28 +++--- .../dite/znpt/domain/entity/CrewEntity.java | 56 ----------- .../dite/znpt/domain/entity/ImageEntity.java | 77 +++++++++++++++ .../com/dite/znpt/domain/vo/CrewListReq.java | 42 -------- .../com/dite/znpt/domain/vo/CrewResp.java | 18 ---- .../com/dite/znpt/domain/vo/ImageListReq.java | 55 +++++++++++ .../com/dite/znpt/domain/vo/ImageResp.java | 19 ++++ .../java/com/dite/znpt/mapper/CrewMapper.java | 19 ---- .../com/dite/znpt/mapper/ImageMapper.java | 19 ++++ .../com/dite/znpt/service/CrewService.java | 64 ------------ .../com/dite/znpt/service/ImageService.java | 64 ++++++++++++ .../znpt/service/impl/CrewServiceImpl.java | 99 ------------------- .../znpt/service/impl/ImageServiceImpl.java | 99 +++++++++++++++++++ core/src/main/resources/mapper/CrewMapper.xml | 39 -------- .../src/main/resources/mapper/ImageMapper.xml | 52 ++++++++++ .../znpt/web/controller/CrewController.java | 84 ---------------- 16 files changed, 402 insertions(+), 432 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/CrewMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ImageMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/service/CrewService.java create mode 100644 core/src/main/java/com/dite/znpt/service/ImageService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java delete mode 100644 core/src/main/resources/mapper/CrewMapper.xml create mode 100644 core/src/main/resources/mapper/ImageMapper.xml delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/CrewController.java diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index ffff2eb..a36c17e 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,13 +1,16 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.List; /** @@ -21,27 +24,30 @@ import java.util.List; public class AuditableEntity implements Serializable { private static final long serialVersionUID = 141481953116476081L; -// @ApiParam(hidden = true) -// private String createBy; -// -// @ApiParam(hidden = true) -// private String updateBy; -// -// @ApiModelProperty(value = "创建时间", example = "2022-01-22", notes = "创建时间", hidden = true) -// private Date createTime; -// -// @ApiModelProperty(hidden = true) -// private Date updateTime; + @ApiParam(hidden = true) + private String createBy; + + @ApiParam(hidden = true) + private String updateBy; + + @ApiModelProperty(value = "创建时间", example = "2022-01-22", notes = "创建时间", hidden = true) + private LocalDateTime createTime; + + @ApiModelProperty(hidden = true) + private LocalDateTime updateTime; @ExcelIgnore @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") + @TableField(exist = false) private List idList; @ExcelIgnore @ApiModelProperty(value = "当前页", example = "1", notes = "0") + @TableField(exist = false) int page = 1; @ExcelIgnore @ApiModelProperty(value = "页大小", example = "10", notes = "10") + @TableField(exist = false) int pageSize = 10; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java deleted file mode 100644 index e39e575..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/CrewEntity.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dite.znpt.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("crew") -@ApiModel(value="CrewEntity对象", description="机组信息表") -public class CrewEntity extends AuditableEntity implements Serializable { - - private static final long serialVersionUID = -18989296759149249L; - - @ExcelProperty("机组id") - @ApiModelProperty("机组id") - @TableId(value = "crew_id", type = IdType.ASSIGN_ID) - private String crewId; - - @ExcelProperty("项目id") - @ApiModelProperty("项目id") - @TableField("project_id") - private String projectId; - - @ExcelProperty("机组名称") - @ApiModelProperty("机组名称") - @TableField("crew_name") - private String crewName; - - @ExcelProperty("机组描述") - @ApiModelProperty("机组描述") - @TableField("crew_desc") - private String crewDesc; - - @ExcelProperty("机组厂商") - @ApiModelProperty("机组厂商") - @TableField("manufacturer") - private String manufacturer; - - @ExcelProperty("机组型号") - @ApiModelProperty("机组型号") - @TableField("model") - private String model; -} - diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java new file mode 100644 index 0000000..7714a2e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -0,0 +1,77 @@ +package com.dite.znpt.domain.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("image") +@ApiModel(value="ImageEntity对象", description="图像信息表") +public class ImageEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = -60463872766900490L; + + @ExcelProperty("图像id") + @ApiModelProperty("图像id") + @TableId(value = "image_id", type = IdType.ASSIGN_ID) + private Long imageId; + + @ExcelProperty("部件id") + @ApiModelProperty("部件id") + @TableField("part_id") + private Long partId; + + @ExcelProperty("机组id") + @ApiModelProperty("机组id") + @TableField("turbine_id") + private Long turbineId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project") + private Long project; + + @ExcelProperty("图像名称") + @ApiModelProperty("图像名称") + @TableField("image_name") + private String imageName; + + @ExcelProperty("图像尺寸") + @ApiModelProperty("图像尺寸") + @TableField("image_size") + private String imageSize; + + @ExcelProperty("焦距") + @ApiModelProperty("焦距") + @TableField("focal_distance") + private String focalDistance; + + @ExcelProperty("拍摄时间") + @ApiModelProperty("拍摄时间") + @TableField("shooting_time") + private LocalDateTime shootingTime; + + @ExcelProperty("相机制造商") + @ApiModelProperty("相机制造商") + @TableField("camera_manufacturer") + private String cameraManufacturer; + + @ExcelProperty("相机型号") + @ApiModelProperty("相机型号") + @TableField("camera_model") + private String cameraModel; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java deleted file mode 100644 index 3e99c72..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/CrewListReq.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dite.znpt.domain.vo; - -import java.io.Serializable; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息请求实体 - */ -@Data -@ApiModel("机组信息列表请求实体") -public class CrewListReq implements Serializable { - - private static final long serialVersionUID = 322835125942914057L; - - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("机组信息Id") - private String crewId; - - @ApiModelProperty("项目id") - private String projectId; - - @ApiModelProperty("机组名称") - private String crewName; - - @ApiModelProperty("机组描述") - private String crewDesc; - - @ApiModelProperty("机组厂商") - private String manufacturer; - - @ApiModelProperty("机组型号") - private String model; - -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java deleted file mode 100644 index acd9a26..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/CrewResp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.CrewEntity; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息响应实体 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("机组信息响应实体") -public class CrewResp extends CrewEntity { -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java new file mode 100644 index 0000000..5153dfc --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息请求实体 + */ +@Data +@ApiModel("图像信息列表请求实体") +public class ImageListReq implements Serializable { + + private static final long serialVersionUID = 734848078850759056L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("图像信息Id") + private Long imageId; + + @ApiModelProperty("部件id") + private Long partId; + + @ApiModelProperty("机组id") + private Long turbineId; + + @ApiModelProperty("项目id") + private Long project; + + @ApiModelProperty("图像名称") + private String imageName; + + @ApiModelProperty("图像尺寸") + private String imageSize; + + @ApiModelProperty("焦距") + private String focalDistance; + + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("相机制造商") + private String cameraManufacturer; + + @ApiModelProperty("相机型号") + private String cameraModel; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java new file mode 100644 index 0000000..1421a4e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ImageEntity; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("图像信息响应实体") +public class ImageResp extends ImageEntity { +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/CrewMapper.java b/core/src/main/java/com/dite/znpt/mapper/CrewMapper.java deleted file mode 100644 index c53cf2a..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/CrewMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.CrewEntity; -import com.dite.znpt.domain.vo.CrewListReq; -import com.dite.znpt.domain.vo.CrewResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息表数据库访问层 - */ -public interface CrewMapper extends BaseMapper { - List queryBySelective(CrewListReq crewReq); -} - diff --git a/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java new file mode 100644 index 0000000..d689388 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.ImageListReq; +import com.dite.znpt.domain.vo.ImageResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息表数据库访问层 + */ +public interface ImageMapper extends BaseMapper { + List queryBySelective(ImageListReq imageReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/CrewService.java b/core/src/main/java/com/dite/znpt/service/CrewService.java deleted file mode 100644 index 4b270f7..0000000 --- a/core/src/main/java/com/dite/znpt/service/CrewService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.CrewEntity; -import com.dite.znpt.domain.vo.CrewListReq; -import com.dite.znpt.domain.vo.CrewResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息表服务接口 - */ -public interface CrewService extends IService { - - /** - * 功能描述:查询机组信息列表 - * - * @param crewReq 机组信息 - * @return {@link List }<{@link CrewEntity }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - List selectList(CrewListReq crewReq); - - /** - * 功能描述:查询单条机组信息 - * - * @param crewId 机组信息Id - * @return {@link CrewResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - CrewResp selectById(String crewId); - - /** - * 功能描述:新增机组信息 - * - * @param crew 机组信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void saveData(CrewEntity crew); - - /** - * 功能描述:更新机组信息 - * - * @param crew 机组信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void updateData(CrewEntity crew); - - /** - * 功能描述:删除机组信息 - * - * @param crewId 机组信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void deleteById(String crewId); -} - diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java new file mode 100644 index 0000000..598be9a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -0,0 +1,64 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.ImageListReq; +import com.dite.znpt.domain.vo.ImageResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息表服务接口 + */ +public interface ImageService extends IService { + + /** + * 功能描述:查询图像信息列表 + * + * @param imageReq 图像信息 + * @return {@link List }<{@link ImageEntity }> + * @author huise23 + * @date 2025/04/24 13:44 + **/ + List selectList(ImageListReq imageReq); + + /** + * 功能描述:查询单条图像信息 + * + * @param imageId 图像信息Id + * @return {@link ImageResp } + * @author huise23 + * @date 2025/04/24 13:44 + **/ + ImageResp selectById(Long imageId); + + /** + * 功能描述:新增图像信息 + * + * @param image 图像信息 + * @author huise23 + * @date 2025/04/24 13:44 + **/ + void saveData(ImageEntity image); + + /** + * 功能描述:更新图像信息 + * + * @param image 图像信息 + * @author huise23 + * @date 2025/04/24 13:44 + **/ + void updateData(ImageEntity image); + + /** + * 功能描述:删除图像信息 + * + * @param imageId 图像信息Id + * @author huise23 + * @date 2025/04/24 13:44 + **/ + void deleteById(Long imageId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java deleted file mode 100644 index efee590..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/CrewServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.CrewEntity; -import com.dite.znpt.domain.vo.CrewListReq; -import com.dite.znpt.domain.vo.CrewResp; -import com.dite.znpt.service.CrewService; -import com.dite.znpt.mapper.CrewMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组信息表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class CrewServiceImpl extends ServiceImpl implements CrewService { - - /** - * 功能描述:查询机组信息列表 - * - * @param crewReq 机组信息信息 - * @return {@link List }<{@link CrewResp }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public List selectList(CrewListReq crewReq) { - PageUtil.startPage(); - List crewList= this.baseMapper.queryBySelective(crewReq); - crewList.forEach(resp -> { - - }); - return crewList; - } - - /** - * 功能描述:查询单条机组信息 - * - * @param crewId 机组信息Id - * @return {@link CrewResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public CrewResp selectById(String crewId) { - CrewListReq crewReq = new CrewListReq(); - crewReq.setCrewId(crewId); - - List list = selectList(crewReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new CrewResp(); - } - - /** - * 功能描述:新增机组信息 - * - * @param crew 机组信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void saveData(CrewEntity crew) { -// todo 校验 - save(crew); - } - - /** - * 功能描述:更新机组信息 - * - * @param crew 机组信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void updateData(CrewEntity crew) { -// todo 校验 - updateById(crew); - } - - /** - * 功能描述:删除机组信息 - * - * @param crewId 机组信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void deleteById(String crewId) { -// todo 校验 - removeById(crewId); - } - -} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java new file mode 100644 index 0000000..c409253 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -0,0 +1,99 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.ImageListReq; +import com.dite.znpt.domain.vo.ImageResp; +import com.dite.znpt.service.ImageService; +import com.dite.znpt.mapper.ImageMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/24 13:44 + * @Description: 图像信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ImageServiceImpl extends ServiceImpl implements ImageService { + + /** + * 功能描述:查询图像信息列表 + * + * @param imageReq 图像信息信息 + * @return {@link List }<{@link ImageResp }> + * @author huise23 + * @date 2025/04/24 13:44 + **/ + @Override + public List selectList(ImageListReq imageReq) { + PageUtil.startPage(); + List imageList= this.baseMapper.queryBySelective(imageReq); + imageList.forEach(resp -> { + + }); + return imageList; + } + + /** + * 功能描述:查询单条图像信息 + * + * @param imageId 图像信息Id + * @return {@link ImageResp } + * @author huise23 + * @date 2025/04/24 13:44 + **/ + @Override + public ImageResp selectById(Long imageId) { + ImageListReq imageReq = new ImageListReq(); + imageReq.setImageId(imageId); + + List list = selectList(imageReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new ImageResp(); + } + + /** + * 功能描述:新增图像信息 + * + * @param image 图像信息 + * @author huise23 + * @date 2025/04/24 13:44 + **/ + @Override + public void saveData(ImageEntity image) { +// todo 校验 + save(image); + } + + /** + * 功能描述:更新图像信息 + * + * @param image 图像信息 + * @author huise23 + * @date 2025/04/24 13:44 + **/ + @Override + public void updateData(ImageEntity image) { +// todo 校验 + updateById(image); + } + + /** + * 功能描述:删除图像信息 + * + * @param imageId 图像信息Id + * @author huise23 + * @date 2025/04/24 13:44 + **/ + @Override + public void deleteById(Long imageId) { +// todo 校验 + removeById(imageId); + } + +} diff --git a/core/src/main/resources/mapper/CrewMapper.xml b/core/src/main/resources/mapper/CrewMapper.xml deleted file mode 100644 index 9b14b93..0000000 --- a/core/src/main/resources/mapper/CrewMapper.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - a.crew_id, a.project_id, a.crew_name, a.crew_desc, - a.manufacturer, a.model - - - - - diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml new file mode 100644 index 0000000..6f39975 --- /dev/null +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -0,0 +1,52 @@ + + + + + + a.image_id, a.part_id, a.turbine_id, a.project, + a.image_name, a.image_size, a.focal_distance, a.shooting_time, + a.camera_manufacturer, a.camera_model + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/CrewController.java b/web/src/main/java/com/dite/znpt/web/controller/CrewController.java deleted file mode 100644 index 1c0cd48..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/CrewController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.CrewListReq; -import com.dite.znpt.domain.vo.CrewResp; -import com.dite.znpt.domain.entity.CrewEntity; -import com.dite.znpt.service.CrewService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "机组信息") -@RestController -@RequestMapping("/crew") -public class CrewController { - @Resource - private CrewService crewService; - - @ApiOperation(value = "获取机组信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(CrewListReq crewReq) { - return PageResult.ok(crewService.selectList(crewReq)); - } - - @ApiOperation(value = "根据机组信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{crewId}") - public Result getInfo(@PathVariable String crewId) { - return Result.ok(crewService.selectById(crewId)); - } - - @ApiOperation(value = "新增机组信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody CrewEntity crew) { - crewService.saveData(crew); - return Result.ok(); - } - - @ApiOperation(value = "修改机组信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody CrewEntity crew) { - crewService.updateData(crew); - return Result.ok(); - } - - @ApiOperation(value = "删除机组信息", httpMethod = "DELETE") - @DeleteMapping("/{crewId}") - public Result remove(@PathVariable String crewId) { - crewService.deleteById(crewId); - return Result.ok(); - } - - @ApiOperation(value = "导出机组信息", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "机组信息") - public List export(CrewListReq crewReq) { - return crewService.selectList(crewReq); - } - - @ApiOperation(value = "导入机组信息", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - From f9388cf0ce7df9e5c914ceabf393c86dca4cd7ca Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Apr 2025 14:10:42 +0800 Subject: [PATCH 011/143] =?UTF-8?q?=E5=BC=95=E7=94=A8=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/entity/TConstructionEntity.java | 1 + .../main/java/com/dite/znpt/domain/vo/DefectListReq.java | 1 + .../com/dite/znpt/domain/vo/TConstructionListReq.java | 1 + .../com/dite/znpt/data/bus/entity/req/ProjectDTO.java | 8 ++++++++ 4 files changed, 11 insertions(+) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java index e1a029c..cf1d7d5 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java @@ -3,6 +3,7 @@ package com.dite.znpt.domain.entity; import java.time.LocalDateTime; import java.io.Serializable; +import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.*; import com.dite.znpt.domain.AuditableEntity; import io.swagger.annotations.ApiModel; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 34933fd..92db85e 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import java.io.Serializable; +import java.math.BigDecimal; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java index 499b638..cf9c96a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.io.Serializable; diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java index beaab2b..627b8d3 100644 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java +++ b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java @@ -1,4 +1,12 @@ package com.dite.znpt.data.bus.entity.req; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@Data public class ProjectDTO { + } From 546750e754c33172d6563994968ad9bd9436bd9f Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Apr 2025 14:17:28 +0800 Subject: [PATCH 012/143] =?UTF-8?q?@TableId=E6=9B=B4=E6=8D=A2IdType.ASSIGN?= =?UTF-8?q?=5FUUID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/domain/entity/CombinedDictEntity.java | 2 +- .../src/main/java/com/dite/znpt/domain/entity/DefectEntity.java | 2 +- .../main/java/com/dite/znpt/domain/entity/FileInfoEntity.java | 2 +- core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java | 2 +- core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java | 2 +- .../main/java/com/dite/znpt/domain/entity/PersonnelEntity.java | 2 +- .../java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java | 2 +- .../main/java/com/dite/znpt/domain/entity/ProjectEntity.java | 2 +- .../main/java/com/dite/znpt/domain/entity/TCompanyEntity.java | 2 +- .../java/com/dite/znpt/domain/entity/TConstructionEntity.java | 2 +- .../main/java/com/dite/znpt/domain/entity/TurbineEntity.java | 2 +- .../java/com/dite/znpt/domain/entity/WeatherTypeEntity.java | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java index b644d3c..6acc4fc 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/CombinedDictEntity.java @@ -25,7 +25,7 @@ public class CombinedDictEntity extends AuditableEntity implements Serializable @ExcelProperty("字典id") @ApiModelProperty("字典id") - @TableId(value = "dict_id", type = IdType.ASSIGN_ID) + @TableId(value = "dict_id", type = IdType.ASSIGN_UUID) private String dictId; @ExcelProperty("字典类型") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index d702e88..43c5aeb 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -26,7 +26,7 @@ public class DefectEntity extends AuditableEntity implements Serializable { @ExcelProperty("缺陷id") @ApiModelProperty("缺陷id") - @TableId(value = "defect_id", type = IdType.ASSIGN_ID) + @TableId(value = "defect_id", type = IdType.ASSIGN_UUID) private String defectId; @ExcelProperty("机组id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java index 651f4f5..fb1aa27 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java @@ -25,7 +25,7 @@ public class FileInfoEntity extends AuditableEntity implements Serializable { @ExcelProperty("文件id") @ApiModelProperty("文件id") - @TableId(value = "file_id", type = IdType.ASSIGN_ID) + @TableId(value = "file_id", type = IdType.ASSIGN_UUID) private Long fileId; @ExcelProperty("业务id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 7714a2e..267a7ea 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -26,7 +26,7 @@ public class ImageEntity extends AuditableEntity implements Serializable { @ExcelProperty("图像id") @ApiModelProperty("图像id") - @TableId(value = "image_id", type = IdType.ASSIGN_ID) + @TableId(value = "image_id", type = IdType.ASSIGN_UUID) private Long imageId; @ExcelProperty("部件id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java index b257196..032b56c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java @@ -25,7 +25,7 @@ public class PartEntity extends AuditableEntity implements Serializable { @ExcelProperty("部件id") @ApiModelProperty("部件id") - @TableId(value = "part_id", type = IdType.ASSIGN_ID) + @TableId(value = "part_id", type = IdType.ASSIGN_UUID) private String partId; @ExcelProperty("项目id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java index f6f202d..956a4ea 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java @@ -25,7 +25,7 @@ public class PersonnelEntity extends AuditableEntity implements Serializable { @ExcelProperty("用户名") @ApiModelProperty("用户名") - @TableId(value = "person_id", type = IdType.ASSIGN_ID) + @TableId(value = "person_id", type = IdType.ASSIGN_UUID) private String personId; @ExcelProperty("姓名") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java index 4bf806b..6155e9e 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java @@ -25,7 +25,7 @@ public class ProjectCompanyEntity extends AuditableEntity implements Serializabl @ExcelProperty("项目id") @ApiModelProperty("项目id") - @TableId(value = "project_id", type = IdType.ASSIGN_ID) + @TableId(value = "project_id", type = IdType.ASSIGN_UUID) private String projectId; @ExcelProperty("公司id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 64c42ca..621e3d8 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -25,7 +25,7 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ExcelProperty("项目id") @ApiModelProperty("项目id") - @TableId(value = "project_id", type = IdType.ASSIGN_ID) + @TableId(value = "project_id", type = IdType.ASSIGN_UUID) private String projectId; @ExcelProperty("项目名称") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java index 5c24565..fac6d37 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java @@ -25,7 +25,7 @@ public class TCompanyEntity extends AuditableEntity implements Serializable { @ExcelProperty("公司id") @ApiModelProperty("公司id") - @TableId(value = "company_id", type = IdType.ASSIGN_ID) + @TableId(value = "company_id", type = IdType.ASSIGN_UUID) private String companyId; @ExcelProperty("公司名称") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java index cf1d7d5..0664380 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java @@ -26,7 +26,7 @@ public class TConstructionEntity extends AuditableEntity implements Serializable @ExcelProperty("施工id") @ApiModelProperty("施工id") - @TableId(value = "construction_id", type = IdType.ASSIGN_ID) + @TableId(value = "construction_id", type = IdType.ASSIGN_UUID) private String constructionId; @ExcelProperty("项目id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index df83710..a308925 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -25,7 +25,7 @@ public class TurbineEntity extends AuditableEntity implements Serializable { @ExcelProperty("机组号") @ApiModelProperty("机组号") - @TableId(value = "turbine_id", type = IdType.ASSIGN_ID) + @TableId(value = "turbine_id", type = IdType.ASSIGN_UUID) private String turbineId; @ExcelProperty("项目id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java index 28df2c7..623653b 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/WeatherTypeEntity.java @@ -26,7 +26,7 @@ public class WeatherTypeEntity extends AuditableEntity implements Serializable { @ExcelProperty("天气类型id") @ApiModelProperty("天气类型id") - @TableId(value = "weather_code", type = IdType.ASSIGN_ID) + @TableId(value = "weather_code", type = IdType.ASSIGN_UUID) private String weatherCode; @ExcelProperty("天气类型中文描述") From 6dfb96563145a2ff2ebd85db3ca7f635f215e1ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Thu, 24 Apr 2025 17:58:44 +0800 Subject: [PATCH 013/143] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E7=AE=A1=E7=90=86=20?= =?UTF-8?q?=20todo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 6 ++ .../dite/znpt/domain/entity/ImageEntity.java | 52 +++++------- .../com/dite/znpt/domain/vo/ImageListReq.java | 54 ++---------- .../com/dite/znpt/domain/vo/ImageResp.java | 18 ++-- .../com/dite/znpt/mapper/ImageMapper.java | 12 +-- .../com/dite/znpt/service/ImageService.java | 54 +----------- .../znpt/service/impl/ImageServiceImpl.java | 85 ++----------------- .../java/com/dite/znpt/util/EXIFUtil.java | 69 +++++++++++++++ .../src/main/resources/mapper/ImageMapper.xml | 42 +-------- .../znpt/web/controller/ImageController.java | 29 +++++++ web/src/main/resources/application-dev.yml | 23 +++-- 11 files changed, 180 insertions(+), 264 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/util/EXIFUtil.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ImageController.java diff --git a/core/pom.xml b/core/pom.xml index 93340d9..cba752e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -134,6 +134,12 @@ fastjson 1.2.83 + + + com.drewnoakes + metadata-extractor + 2.15.0 + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 267a7ea..7d966f7 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -1,77 +1,71 @@ package com.dite.znpt.domain.entity; -import java.time.LocalDateTime; -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.domain.AuditableEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息表实体类 + * @author Bear.G + * @date 2025/4/24/周四 13:15 + * @description */ @Data @EqualsAndHashCode(callSuper = false) @TableName("image") @ApiModel(value="ImageEntity对象", description="图像信息表") -public class ImageEntity extends AuditableEntity implements Serializable { +public class ImageEntity extends AuditableEntity implements Serializable { - private static final long serialVersionUID = -60463872766900490L; + @Serial + private static final long serialVersionUID = -7702927820673158420L; - @ExcelProperty("图像id") @ApiModelProperty("图像id") - @TableId(value = "image_id", type = IdType.ASSIGN_UUID) - private Long imageId; + @TableId(value = "part_id", type = IdType.ASSIGN_UUID) + private String imageId; - @ExcelProperty("部件id") @ApiModelProperty("部件id") @TableField("part_id") - private Long partId; + private String partId; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; - @ExcelProperty("机组id") @ApiModelProperty("机组id") @TableField("turbine_id") - private Long turbineId; + private String turbineId; - @ExcelProperty("项目id") - @ApiModelProperty("项目id") - @TableField("project") - private Long project; - - @ExcelProperty("图像名称") @ApiModelProperty("图像名称") @TableField("image_name") private String imageName; - @ExcelProperty("图像尺寸") @ApiModelProperty("图像尺寸") @TableField("image_size") private String imageSize; - @ExcelProperty("焦距") @ApiModelProperty("焦距") @TableField("focal_distance") private String focalDistance; - @ExcelProperty("拍摄时间") @ApiModelProperty("拍摄时间") @TableField("shooting_time") private LocalDateTime shootingTime; - @ExcelProperty("相机制造商") @ApiModelProperty("相机制造商") @TableField("camera_manufacturer") private String cameraManufacturer; - @ExcelProperty("相机型号") @ApiModelProperty("相机型号") @TableField("camera_model") private String cameraModel; -} +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index 5153dfc..c0b8473 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -1,55 +1,19 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDateTime; -import java.io.Serializable; - import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; + /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息请求实体 + * @author Bear.G + * @date 2025/4/24/周四 14:18 + * @description */ @Data -@ApiModel("图像信息列表请求实体") +@ApiModel("图像信息列表查询实体") public class ImageListReq implements Serializable { - - private static final long serialVersionUID = 734848078850759056L; - - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("图像信息Id") - private Long imageId; - - @ApiModelProperty("部件id") - private Long partId; - - @ApiModelProperty("机组id") - private Long turbineId; - - @ApiModelProperty("项目id") - private Long project; - - @ApiModelProperty("图像名称") - private String imageName; - - @ApiModelProperty("图像尺寸") - private String imageSize; - - @ApiModelProperty("焦距") - private String focalDistance; - - @ApiModelProperty("拍摄时间") - private LocalDateTime shootingTime; - - @ApiModelProperty("相机制造商") - private String cameraManufacturer; - - @ApiModelProperty("相机型号") - private String cameraModel; - + @Serial + private static final long serialVersionUID = 671014582625089979L; } - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 1421a4e..cce541b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,19 +1,19 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDateTime; import io.swagger.annotations.ApiModel; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.ImageEntity; + +import java.io.Serial; +import java.io.Serializable; /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息响应实体 + * @author Bear.G + * @date 2025/4/24/周四 14:16 + * @description */ @Data -@EqualsAndHashCode(callSuper = true) @ApiModel("图像信息响应实体") -public class ImageResp extends ImageEntity { +public class ImageResp implements Serializable { + @Serial + private static final long serialVersionUID = -5215414858454232077L; } - diff --git a/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java index d689388..14ec3d4 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java @@ -4,16 +4,16 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageListReq; import com.dite.znpt.domain.vo.ImageResp; -import org.apache.ibatis.annotations.Param; +import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartResp; import java.util.List; /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息表数据库访问层 + * @author Bear.G + * @date 2025/4/24/周四 13:17 + * @description */ public interface ImageMapper extends BaseMapper { - List queryBySelective(ImageListReq imageReq); + List queryBySelective(ImageListReq req); } - diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 598be9a..b956e32 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -8,57 +8,11 @@ import com.dite.znpt.domain.vo.ImageResp; import java.util.List; /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息表服务接口 + * @author Bear.G + * @date 2025/4/24/周四 13:14 + * @description */ public interface ImageService extends IService { - /** - * 功能描述:查询图像信息列表 - * - * @param imageReq 图像信息 - * @return {@link List }<{@link ImageEntity }> - * @author huise23 - * @date 2025/04/24 13:44 - **/ - List selectList(ImageListReq imageReq); - - /** - * 功能描述:查询单条图像信息 - * - * @param imageId 图像信息Id - * @return {@link ImageResp } - * @author huise23 - * @date 2025/04/24 13:44 - **/ - ImageResp selectById(Long imageId); - - /** - * 功能描述:新增图像信息 - * - * @param image 图像信息 - * @author huise23 - * @date 2025/04/24 13:44 - **/ - void saveData(ImageEntity image); - - /** - * 功能描述:更新图像信息 - * - * @param image 图像信息 - * @author huise23 - * @date 2025/04/24 13:44 - **/ - void updateData(ImageEntity image); - - /** - * 功能描述:删除图像信息 - * - * @param imageId 图像信息Id - * @author huise23 - * @date 2025/04/24 13:44 - **/ - void deleteById(Long imageId); + List selectList(ImageListReq req); } - diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index c409253..0e06c94 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -4,96 +4,25 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageListReq; import com.dite.znpt.domain.vo.ImageResp; -import com.dite.znpt.service.ImageService; import com.dite.znpt.mapper.ImageMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.ImageService; import com.dite.znpt.util.PageUtil; import java.util.List; /** - * @author huise23 - * @date 2025/04/24 13:44 - * @Description: 图像信息表服务实现类 + * @author Bear.G + * @date 2025/4/24/周四 13:23 + * @description */ -@Service -@RequiredArgsConstructor public class ImageServiceImpl extends ServiceImpl implements ImageService { - - /** - * 功能描述:查询图像信息列表 - * - * @param imageReq 图像信息信息 - * @return {@link List }<{@link ImageResp }> - * @author huise23 - * @date 2025/04/24 13:44 - **/ @Override - public List selectList(ImageListReq imageReq) { + public List selectList(ImageListReq req) { PageUtil.startPage(); - List imageList= this.baseMapper.queryBySelective(imageReq); + List imageList= this.baseMapper.queryBySelective(req); imageList.forEach(resp -> { - + }); return imageList; } - - /** - * 功能描述:查询单条图像信息 - * - * @param imageId 图像信息Id - * @return {@link ImageResp } - * @author huise23 - * @date 2025/04/24 13:44 - **/ - @Override - public ImageResp selectById(Long imageId) { - ImageListReq imageReq = new ImageListReq(); - imageReq.setImageId(imageId); - - List list = selectList(imageReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new ImageResp(); - } - - /** - * 功能描述:新增图像信息 - * - * @param image 图像信息 - * @author huise23 - * @date 2025/04/24 13:44 - **/ - @Override - public void saveData(ImageEntity image) { -// todo 校验 - save(image); - } - - /** - * 功能描述:更新图像信息 - * - * @param image 图像信息 - * @author huise23 - * @date 2025/04/24 13:44 - **/ - @Override - public void updateData(ImageEntity image) { -// todo 校验 - updateById(image); - } - - /** - * 功能描述:删除图像信息 - * - * @param imageId 图像信息Id - * @author huise23 - * @date 2025/04/24 13:44 - **/ - @Override - public void deleteById(Long imageId) { -// todo 校验 - removeById(imageId); - } - } diff --git a/core/src/main/java/com/dite/znpt/util/EXIFUtil.java b/core/src/main/java/com/dite/znpt/util/EXIFUtil.java new file mode 100644 index 0000000..136a5a7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/util/EXIFUtil.java @@ -0,0 +1,69 @@ +package com.dite.znpt.util; + +import cn.hutool.json.JSONObject; +import com.drew.imaging.ImageMetadataReader; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.Tag; + +import java.io.File; + +/** + * @author Bear.G + * @date 2025/4/24/周四 14:10 + * @description + */ +public class EXIFUtil { + + public static void main(String[] args) throws Exception { + File file = new File("C:\\Users\\Administrator\\Desktop\\水杯.jpg"); + printImageTags(file); + } + /** + * 读取照片里面的信息 + */ + public static JSONObject printImageTags(File file) throws Exception { + Metadata metadata = ImageMetadataReader.readMetadata(file); + JSONObject jsonObject = new JSONObject(); + String lat = ""; + String log = ""; + for (Directory directory : metadata.getDirectories()) { + for (Tag tag : directory.getTags()) { + // 标签名 + String tagName = tag.getTagName(); + // 标签信息 + String desc = tag.getDescription(); + System.out.println(tagName + "=" + desc); + switch (tagName) { + // 经度 + case "GPS Longitude": + lat = pointToLatlong(desc); + jsonObject.put(tagName, lat); + break; + // 纬度 + case "GPS Latitude": + log = pointToLatlong(desc); + jsonObject.put(tagName, log); + break; + default: + jsonObject.put(tagName, desc); + break; + } + } + } + System.out.println("**********" + jsonObject.toString()); + return jsonObject; + } + + /*** + * 经纬度坐标格式转换(* °转十进制格式) + * @param point + */ + public static String pointToLatlong(String point) { + Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim()); + Double fen = Double.parseDouble(point.substring(point.indexOf("°") + 1, point.indexOf("'")).trim()); + Double miao = Double.parseDouble(point.substring(point.indexOf("'") + 1, point.indexOf("\"")).trim()); + Double duStr = du + fen / 60 + miao / 60 / 60; + return duStr.toString(); + } +} diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 6f39975..9fba7da 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -1,52 +1,18 @@ - - a.image_id, a.part_id, a.turbine_id, a.project, - a.image_name, a.image_size, a.focal_distance, a.shooting_time, - a.camera_manufacturer, a.camera_model + a.image, a.part_id, a.turbine_id, a.project_id, a.image_name, a.image_size, a.focal_distance, a.shooting_time, a.camera_manufacture, a.camera_model - - + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java new file mode 100644 index 0000000..f0f1cf8 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -0,0 +1,29 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.vo.ImageListReq; +import com.dite.znpt.domain.vo.ImageResp; +import com.dite.znpt.service.ImageService; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.annotation.Resource; + +/** + * @author Bear.G + * @date 2025/4/24/周四 12:46 + * @description + */ +public class ImageController { + + @Resource + private ImageService imageService; + + @ApiOperation(value = "分页查询图像列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult list(ImageListReq req) { + return PageResult.ok(imageService.selectList(req)); + } + +} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index adf1b31..5362495 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8080 + port: 8888 # 数据源配置 spring: @@ -10,7 +10,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: h67&E98HS8^6 + password: BUw8YW6%@^8q druid: # 初始连接数 initialSize: 5 @@ -59,11 +59,16 @@ spring: max-wait: 3000 host: 39.99.201.243 port: 6379 - password: yfeng@123 + password: diTeZn@123 timeout: 3000 # 0 gaea系统,3 gaea-dev/gaea-test系统,4 znpt开发,5 znpt测试 6 znpt生产 database: 4 - + # mq 配置 + rabbitmq: + host: 39.99.201.243 + port: 3389 + username: dite + password: diTezN@123 ## MINIO配置 #minio: # url: http://10.20.32.11:9000 @@ -80,7 +85,7 @@ spring: sip-config: name: 信令服务 - ip: 10.17.12.203 + ip: 192.168.0.207 port: 1074 charset: gb2312 domain: 3402000000 @@ -96,17 +101,17 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 10.17.12.203 + apiHost: 192.168.0.207 # 接口端口 - apiPort: 30186 + apiPort: 8080 # 密钥 - secretKey: JvVotkdN01y4qZHlrJsdq4gD7n9rK6wV + secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G # 流id前缀 streamPrefix: # rtp ip rtpHost: 10.17.12.203 # rtp 端口 - rtpPort: 30186 + rtpPort: 8080 # 动态端口起始值 dynamicPortStart: 30150 # 动态端口结束值 From bb63c4b66f041eb36d219c9a566c81ff6b14af7a Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Thu, 24 Apr 2025 20:05:14 +0800 Subject: [PATCH 014/143] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/main/resources/application-dev.yml | 25 +++++++++------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 5362495..f53ac7c 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8888 + port: 8080 # 数据源配置 spring: @@ -10,7 +10,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: BUw8YW6%@^8q + password: h67&E98HS8^6 druid: # 初始连接数 initialSize: 5 @@ -59,16 +59,11 @@ spring: max-wait: 3000 host: 39.99.201.243 port: 6379 - password: diTeZn@123 + password: yfeng@123 timeout: 3000 -# 0 gaea系统,3 gaea-dev/gaea-test系统,4 znpt开发,5 znpt测试 6 znpt生产 + # 0 gaea系统,3 gaea-dev/gaea-test系统,4 znpt开发,5 znpt测试 6 znpt生产 database: 4 - # mq 配置 - rabbitmq: - host: 39.99.201.243 - port: 3389 - username: dite - password: diTezN@123 + ## MINIO配置 #minio: # url: http://10.20.32.11:9000 @@ -85,7 +80,7 @@ spring: sip-config: name: 信令服务 - ip: 192.168.0.207 + ip: 10.17.12.203 port: 1074 charset: gb2312 domain: 3402000000 @@ -101,17 +96,17 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 192.168.0.207 + apiHost: 10.17.12.203 # 接口端口 - apiPort: 8080 + apiPort: 30186 # 密钥 - secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G + secretKey: JvVotkdN01y4qZHlrJsdq4gD7n9rK6wV # 流id前缀 streamPrefix: # rtp ip rtpHost: 10.17.12.203 # rtp 端口 - rtpPort: 8080 + rtpPort: 30186 # 动态端口起始值 dynamicPortStart: 30150 # 动态端口结束值 From 7429c6d43f215ab6725a74024afd3d650ee94599 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Thu, 24 Apr 2025 22:18:43 +0800 Subject: [PATCH 015/143] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E9=87=87=E9=9B=86=E4=BF=A1=E6=81=AF=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=BC=BA=E9=99=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/DefectEntity.java | 44 ++++------- .../domain/entity/ImageCollectEntity.java | 74 +++++++++++++++++++ .../dite/znpt/domain/entity/ImageEntity.java | 16 +++- .../dite/znpt/domain/vo/DefectListReq.java | 27 ++----- .../dite/znpt/domain/vo/ImageCollectResp.java | 9 +++ .../java/com/dite/znpt/enums/DefectLevel.java | 9 +++ .../com/dite/znpt/enums/DefectTypeEnum.java | 9 +++ .../com/dite/znpt/enums/ImageTypeEnum.java | 43 +++++++++++ .../dite/znpt/enums/ShootingMethodEnum.java | 45 +++++++++++ .../java/com/dite/znpt/enums/WeatherEnum.java | 66 +++++++++++++++++ .../dite/znpt/mapper/ImageCollectMapper.java | 13 ++++ .../znpt/service/ImageCollectService.java | 12 +++ .../znpt/service/impl/DefectServiceImpl.java | 1 - .../service/impl/ImageCollectServiceImpl.java | 17 +++++ .../main/resources/mapper/DefectMapper.xml | 36 ++------- .../resources/mapper/ImageCollectMapper.xml | 16 ++++ 16 files changed, 355 insertions(+), 82 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/DefectLevel.java create mode 100644 core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/WeatherEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ImageCollectMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ImageCollectService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java create mode 100644 core/src/main/resources/mapper/ImageCollectMapper.xml diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index 43c5aeb..1c154af 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -32,46 +32,32 @@ public class DefectEntity extends AuditableEntity implements Serializable { @ExcelProperty("机组id") @ApiModelProperty("机组id") @TableField("turbine_code") - private String turbineCode; + private String turbineId; - @ExcelProperty("叶片号") - @ApiModelProperty("叶片号") - @TableField("blade_code") - private String bladeCode; + @ExcelProperty("部件id") + @ApiModelProperty("部件id") + @TableField("part_id") + private String partId; - @ExcelProperty("损伤面,字典surface_type") - @ApiModelProperty("损伤面,字典surface_type") - @TableField("surface_type") - private String surfaceType; - - @ExcelProperty("缺陷类型,字典defect_type") - @ApiModelProperty("缺陷类型,字典defect_type") + @ExcelProperty("缺陷类型,枚举DefectTypeEnum") + @ApiModelProperty("缺陷类型,枚举DefectTypeEnum") @TableField("defect_type") private String defectType; - @ExcelProperty("危重等级,字典defect_level") - @ApiModelProperty("危重等级,字典defect_level") + @ExcelProperty("危重等级,枚举DefectLevelEnum") + @ApiModelProperty("危重等级,枚举DefectLevelEnum") @TableField("defect_level") private String defectLevel; - @ExcelProperty("轴向长度(mm)") - @ApiModelProperty("轴向长度(mm)") - @TableField("axial_length") - private BigDecimal axialLength; - - @ExcelProperty("弦向长度(mm)") - @ApiModelProperty("弦向长度(mm)") - @TableField("chord_length") - private BigDecimal chordLength; @ExcelProperty("图片路径") @ApiModelProperty("图片路径") - @TableField("image_path") - private String imagePath; + @TableField("defect_image_path") + private String defectImagePath; - @ExcelProperty("图片详情") - @ApiModelProperty("图片详情") - @TableField("image_hash") - private String imageHash; + @ExcelProperty("说明") + @ApiModelProperty("说明") + @TableField("description") + private String description; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java new file mode 100644 index 0000000..4980ae9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java @@ -0,0 +1,74 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 20:33 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("image_collect") +@ApiModel(value="ImageEntity对象", description="图像采集信息表") +public class ImageCollectEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -2957687117182827156L; + + @ApiModelProperty("图像采集id") + @TableId(value = "collect", type = IdType.ASSIGN_UUID) + private String collectId; + + @ApiModelProperty("拍摄时间-起") + @TableField("shooting_time_begin") + private LocalDateTime shootingTimeBegin; + + @ApiModelProperty("拍摄时间-讫") + @TableField("shooting_time_end") + private LocalDateTime shootingTimeEnd; + + @ApiModelProperty("天气") + @TableField("weather,枚举:WeatherEnum") + private String weather; + + @ApiModelProperty("湿度(百分比)") + @TableField("humidness") + private Integer humidness; + + @ApiModelProperty("温度-低") + @TableField("temperature_min") + private Double temperatureMin; + + @ApiModelProperty("温度-高") + @TableField("temperature_max") + private Double temperatureMax; + + @ApiModelProperty("风力等级") + @TableField("wind_level") + private Integer windLevel; + + @ApiModelProperty("拍摄方式,枚举ShootingMethodEnum") + @TableField("shooting_method") + private String shootingMethod; + + @ApiModelProperty("拍摄方式,枚举ShootingDistanceEnum") + @TableField("shooting_distance") + private Integer shootingDistance; + + @ApiModelProperty("采集员姓名") + @TableField("collector_name") + private String collectorName; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 7d966f7..5856b03 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -23,15 +23,19 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = false) @TableName("image") @ApiModel(value="ImageEntity对象", description="图像信息表") -public class ImageEntity extends AuditableEntity implements Serializable { +public class ImageEntity extends AuditableEntity implements Serializable { @Serial private static final long serialVersionUID = -7702927820673158420L; @ApiModelProperty("图像id") - @TableId(value = "part_id", type = IdType.ASSIGN_UUID) + @TableId(value = "image_id", type = IdType.ASSIGN_UUID) private String imageId; + @ApiModelProperty("图像采集id") + @TableField("collect_id") + private String collectId; + @ApiModelProperty("部件id") @TableField("part_id") private String partId; @@ -68,4 +72,12 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("camera_model") private String cameraModel; + @ApiModelProperty("影像类型") + @TableField("image_type,枚举ImageTypeEnum") + private String imageType; + + @ApiModelProperty("图片路径") + @TableField("image_path") + private String imagePath; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 92db85e..311dd40 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -21,35 +21,20 @@ public class DefectListReq implements Serializable { @ApiModelProperty("查询关键字") private String keyword; - @ApiModelProperty("缺陷记录Id") + @ApiModelProperty("缺陷id") private String defectId; @ApiModelProperty("机组id") - private String turbineCode; + private String turbineId; - @ApiModelProperty("叶片号") - private String bladeCode; + @ApiModelProperty("部件id") + private String partId; - @ApiModelProperty("损伤面,字典surface_type") - private String surfaceType; - - @ApiModelProperty("缺陷类型,字典defect_type") + @ApiModelProperty("缺陷类型,枚举:DefectTypeEnum") private String defectType; - @ApiModelProperty("危重等级,字典defect_level") + @ApiModelProperty("危重等级,枚举:DefectLevelEnum") private String defectLevel; - @ApiModelProperty("轴向长度(mm)") - private BigDecimal axialLength; - - @ApiModelProperty("弦向长度(mm)") - private BigDecimal chordLength; - - @ApiModelProperty("图片路径") - private String imagePath; - - @ApiModelProperty("图片详情") - private String imageHash; - } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java new file mode 100644 index 0000000..6ce9002 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java @@ -0,0 +1,9 @@ +package com.dite.znpt.domain.vo; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:16 + * @Description: + */ +public class ImageCollectResp { +} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectLevel.java b/core/src/main/java/com/dite/znpt/enums/DefectLevel.java new file mode 100644 index 0000000..8c74c6d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/DefectLevel.java @@ -0,0 +1,9 @@ +package com.dite.znpt.enums; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:44 + * @Description: + */ +public enum DefectLevel { +} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java new file mode 100644 index 0000000..4aac3db --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java @@ -0,0 +1,9 @@ +package com.dite.znpt.enums; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:43 + * @Description: + */ +public enum DefectTypeEnum { +} diff --git a/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java new file mode 100644 index 0000000..a8c432c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java @@ -0,0 +1,43 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:25 + * @Description: + */ +public enum ImageTypeEnum { + DEFECT("DEFECT", "缺陷影像"), + TYPICAL("TYPICAL", "典型影像"), + OTHER("OTHER", "其他影像"); + private final String code; + private final String desc; + + ImageTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static ImageTypeEnum getByCode(String code){ + for (ImageTypeEnum e : ImageTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static List listAll(){ + List list = new ArrayList<>(ImageTypeEnum.values().length); + for (ImageTypeEnum e : ImageTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java b/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java new file mode 100644 index 0000000..5fb58d2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java @@ -0,0 +1,45 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 20:43 + * @Description: + */ +@Getter +public enum ShootingMethodEnum { + UAV("UAV", "无人机航拍"), + HANDHELD_CAMERA("HANDHELD_CAMERA", "手持相机拍摄"); + + private final String code; + private final String desc; + + ShootingMethodEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + private ShootingMethodEnum getByCode(String code){ + for (ShootingMethodEnum e : ShootingMethodEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static List listAll(){ + List list = new ArrayList<>(ShootingMethodEnum.values().length); + for (ShootingMethodEnum e : ShootingMethodEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java b/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java new file mode 100644 index 0000000..d75d026 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java @@ -0,0 +1,66 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 20:40 + * @Description: + */ +@Getter +public enum WeatherEnum { + + SUNNY("SUNNY","晴天"), + CLOUDY("CLOUDY","多云"), + OVERCAST("OVERCAST","阴天"), + LIGHT_RAIN("LIGHT_RAIN","小雨"), + MODERATE_RAIN("MODERATE_RAIN","中雨"), + HEAVY_RAIN("HEAVY_RAIN","大雨"), + CLOUDBURST("CLOUDBURST","暴雨"), + SHOWER("SHOWER","阵雨"), + THUNDERSHOWER("THUNDERSHOWER","雷阵雨"), + THUNDER("THUNDER","雷电"), + HAIL("HAIL","冰雹"), + LIGHT_FOG("LIGHT_FOG","轻雾"), + FOG("FOG","雾"), + THICK_FOG("THICK_FOG","浓雾"), + HAZE("HAZE","霾"), + SLEET("SLEET","雨夹雪"), + LIGHT_SNOW("LIGHT_SNOW","小雪"), + MODERATE_SNOW("MODERATE_SNOW","中雪"), + HEAVY_SNOW("HEAVY_SNOW","大雪"), + BLIZZARD("BLIZZARD","暴雪"), + FREEZING_RAIN("FREEZING_RAIN","冻雨"); + + private final String code; + private final String desc; + + WeatherEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static WeatherEnum getByCode(String code){ + for (WeatherEnum e : WeatherEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static List listAll(){ + List list = new ArrayList<>(WeatherEnum.values().length); + for (WeatherEnum e : WeatherEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } + +} diff --git a/core/src/main/java/com/dite/znpt/mapper/ImageCollectMapper.java b/core/src/main/java/com/dite/znpt/mapper/ImageCollectMapper.java new file mode 100644 index 0000000..c382df2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ImageCollectMapper.java @@ -0,0 +1,13 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ImageCollectEntity; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:14 + * @Description: + */ +public interface ImageCollectMapper extends BaseMapper { + +} diff --git a/core/src/main/java/com/dite/znpt/service/ImageCollectService.java b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java new file mode 100644 index 0000000..c1c3754 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java @@ -0,0 +1,12 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ImageCollectEntity; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:20 + * @Description: + */ +public interface ImageCollectService extends IService { +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index 0764847..e807ac8 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -52,7 +52,6 @@ public class DefectServiceImpl extends ServiceImpl i public DefectResp selectById(String defectId) { DefectListReq defectReq = new DefectListReq(); defectReq.setDefectId(defectId); - List list = selectList(defectReq); return list.isEmpty() ? CollUtil.getFirst(list) : new DefectResp(); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java new file mode 100644 index 0000000..c10efeb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -0,0 +1,17 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ImageCollectEntity; +import com.dite.znpt.mapper.ImageCollectMapper; +import com.dite.znpt.service.ImageCollectService; +import org.springframework.stereotype.Service; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:20 + * @Description: + */ +@Service +public class ImageCollectServiceImpl extends ServiceImpl implements ImageCollectService { + +} diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index bf76c96..ac4f67a 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -3,9 +3,7 @@ - a.defect_id, a.turbine_code, a.blade_code, a.surface_type, - a.defect_type, a.defect_level, a.axial_length, a.chord_length, - a.image_path, a.image_hash + a.defect_id, a.turbine_id, a.part_id, a.defect_code, a.defect_name, a.defect_type, a.defect_level, a.defect_image_path, a.description diff --git a/core/src/main/resources/mapper/ImageCollectMapper.xml b/core/src/main/resources/mapper/ImageCollectMapper.xml new file mode 100644 index 0000000..64a0f9d --- /dev/null +++ b/core/src/main/resources/mapper/ImageCollectMapper.xml @@ -0,0 +1,16 @@ + + + + + + a.collect_id, a.shooting_time_begin, a.shooting_time_end, a.weather, a.humidness, a.temperature_min, a.temperature_max, a.wind_level, a.shooting_method, + a.shooting_distance, a.collector_name, + + + + + From 2779278a4132bafc26d0f30093085b6340577aa0 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Thu, 24 Apr 2025 22:38:23 +0800 Subject: [PATCH 016/143] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0=E7=BB=8F=E5=BA=A6=E7=BA=AC=E5=BA=A6?= =?UTF-8?q?=E6=B5=B7=E6=8B=94=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/entity/ImageEntity.java | 12 ++++++++++++ core/src/main/resources/mapper/ImageMapper.xml | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 5856b03..d4bab7a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -72,6 +72,18 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("camera_model") private String cameraModel; + @ApiModelProperty("经度") + @TableField("longitude") + private String longitude; + + @ApiModelProperty("纬度") + @TableField("latitude") + private String latitude; + + @ApiModelProperty("海拔") + @TableField("altitude") + private String altitude; + @ApiModelProperty("影像类型") @TableField("image_type,枚举ImageTypeEnum") private String imageType; diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 9fba7da..98ee794 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -2,7 +2,9 @@ - a.image, a.part_id, a.turbine_id, a.project_id, a.image_name, a.image_size, a.focal_distance, a.shooting_time, a.camera_manufacture, a.camera_model + a.image, a.part_id, a.turbine_id, a.project_id, a.image_name, a.image_size, a.focal_distance, + a.shooting_time, a.camera_manufacture, a.camera_model, a.longitude, a.latitude, a.altitude, + a.image_type, a.image_path + select t.turbine_id as id, + + (select + case when ifnull(sum(w.status = '3'), 0) > 0 then '3' + when ifnull(sum(w.status = '2'), 0) > 0 then '2' + when ifnull(sum(w.status = '1'), 0) > 0 then '1' + when p.work_type like '%in-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_in_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as in_work_status, + (select + case when ifnull(sum(w.status = '3'), 0) > 0 then '3' + when ifnull(sum(w.status = '2'), 0) > 0 then '2' + when ifnull(sum(w.status = '1'), 0) > 0 then '1' + when p.work_type like '%out-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_out_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as out_work_status, + (select + case when ifnull(sum(w.status = '3'), 0) > 0 then '3' + when ifnull(sum(w.status = '2'), 0) > 0 then '2' + when ifnull(sum(w.status = '1'), 0) > 0 then '1' + when p.work_type like '%lightning-protection-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_anti_thunder_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as anti_thunder_work_status, + (select + case when ifnull(sum(w.status = '3'), 0) > 0 then '3' + when ifnull(sum(w.status = '2'), 0) > 0 then '2' + when ifnull(sum(w.status = '1'), 0) > 0 then '1' + when p.work_type like '%summary-report%' then '0' + else '-1' end + from gaea_job j left join gaea_job_summary_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as summary_work_status, + + + (select + case when ifnull(sum(w.safety_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%in-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_in_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as in_work_safety_status, + (select + case when ifnull(sum(w.safety_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%out-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_out_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as out_work_safety_status, + (select + case when ifnull(sum(w.safety_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%lightning-protection-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_anti_thunder_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as anti_thunder_work_safety_status, + + + (select + case when ifnull(sum(w.quality_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%in-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_in_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as in_work_quality_status, + (select + case when ifnull(sum(w.quality_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%out-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_out_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as out_work_quality_status, + (select + case when ifnull(sum(w.quality_officer_status = '1'), 0) > 0 then '1' + when p.work_type like '%lightning-protection-work%' then '0' + else '-1' end + from gaea_job j left join gaea_job_anti_thunder_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null) as anti_thunder_work_quality_status, + exists(select 1 + from gaea_job j left join gaea_job_anti_thunder_work w on j.id = w.job_id + where j.crew_id = t.turbine_id and w.id is not null and lightning_unqualified = true) as lightning_unqualified_all + from turbine t + left join project p on t.project_id = p.project_id + where t.turbine_id in + + #{item} + + group by t.turbine_id + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobAntiThunderWorkController.java b/web/src/main/java/com/dite/znpt/web/controller/JobAntiThunderWorkController.java new file mode 100644 index 0000000..bccb178 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/JobAntiThunderWorkController.java @@ -0,0 +1,70 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.TableData; +import com.dite.znpt.domain.entity.job.JobAntiThunderWork; +import com.dite.znpt.domain.vo.job.req.JobAntiThunderWorkReq; +import com.dite.znpt.domain.vo.job.req.JobInfoReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.job.JobAntiThunderWorkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author Julio + * @date 2023/2/1 14:26 + * @description 防雷工作 + */ +@Api(tags = "防雷工作", description = "防雷工作") +@RestController +@RequestMapping("/job-no-man-work") +public class JobAntiThunderWorkController { + + @Autowired + private JobAntiThunderWorkService service; + + @PostMapping(value = "getWorkContent") + @ApiOperation(value = "根据jobId查询岗位内容,未查到返回空对象") + @ResponseBody + public Result getJob(@Valid @RequestBody JobAntiThunderWorkReq dto) throws ServiceException { + List list = this.service.listByJobId(dto); + if (list.isEmpty()) { + return Result.ok(new JobAntiThunderWork()); + } + return Result.ok(list.get(0)); + } + + @PostMapping(value = "save") + @ApiOperation(value = "新增或更新") + public Result save(@Valid @RequestBody JobAntiThunderWork work) { + return Result.okM(this.service.saveInfo(work), "保存成功"); + } + + @PostMapping("/list") + @ApiOperation(value = "查询列表,组长-施工人员") + public Result> list(@RequestBody JobInfoReq request) { + List list = this.service.list(request); + return Result.ok(new TableData<>(list, request.getPage(), request.getPageSize(), list.size())); + } + + @PostMapping("/submit") + @ApiOperation(value = "组长提交/项目经理审批") + public Result> submit(@RequestBody JobInfoReq request) { + this.service.submit(request); + return Result.ok(); + } + + @PostMapping("/reject") + @ApiOperation(value = "组长驳回/项目经理驳回") + public Result> reject(@RequestBody JobInfoReq request) { + this.service.reject(request); + return Result.ok(); + } +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobController.java b/web/src/main/java/com/dite/znpt/web/controller/JobController.java new file mode 100644 index 0000000..14afbb7 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/JobController.java @@ -0,0 +1,39 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.job.JobInfo; +import com.dite.znpt.domain.vo.job.req.JobInfoReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.job.JobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author Julio + * @date 2023/2/1 14:26 + * @description 项目-机组-岗位 + */ +@Api(tags = "项目-机组-岗位", description = "项目-机组-岗位") +@RestController +@RequestMapping("/job") +public class JobController { + @Autowired + private JobService jobService; + + @PostMapping(value = "getJob") + @ApiOperation(value = "根据项目-机组-人员id查询岗位信息,未查到返回null") + @ResponseBody + public Result getJobInfo(@Valid @RequestBody JobInfoReq dto) throws ServiceException { + List list = this.jobService.page(dto); + if (list.isEmpty()) { + return Result.ok(); + } + return Result.ok(list.get(0)); + } +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobInWorkController.java b/web/src/main/java/com/dite/znpt/web/controller/JobInWorkController.java new file mode 100644 index 0000000..cdc0648 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/JobInWorkController.java @@ -0,0 +1,70 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.TableData; +import com.dite.znpt.domain.entity.job.JobAntiThunderWork; +import com.dite.znpt.domain.entity.job.JobInWork; +import com.dite.znpt.domain.vo.job.req.JobInWorkReq; +import com.dite.znpt.domain.vo.job.req.JobInfoReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.job.JobInWorkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author Julio + * @date 2023/2/1 14:26 + * @description 内部工作 + */ +@Api(tags = "内部工作", description = "内部工作") +@RestController +@RequestMapping("/job-in-work") +public class JobInWorkController { + + @Autowired + private JobInWorkService service; + + @PostMapping(value = "getWorkContent") + @ApiOperation(value = "根据jobId查询岗位内容,未查到返回空对象") + @ResponseBody + public Result getJob(@Valid @RequestBody JobInWorkReq dto) throws ServiceException { + List list = this.service.listByJobId(dto); + if (list.isEmpty()) { + return Result.ok(new JobInWork()); + } + return Result.ok(list.get(0)); + } + + @PostMapping(value = "save") + @ApiOperation(value = "新增或更新") + public Result save(@Valid @RequestBody JobInWork work) { + return Result.okM(this.service.saveInfo(work), "保存成功"); + } + + @PostMapping("/list") + @ApiOperation(value = "查询列表,组长-施工人员") + public Result> list(@RequestBody JobInfoReq request) { + List list = this.service.list(request); + return Result.ok(new TableData<>(list, request.getPage(), request.getPageSize(), list.size())); + } + + @PostMapping("/submit") + @ApiOperation(value = "组长提交/项目经理审批") + public Result> submit(@RequestBody JobInfoReq request) { + this.service.submit(request); + return Result.ok(); + } + + @PostMapping("/reject") + @ApiOperation(value = "组长驳回/项目经理驳回") + public Result> reject(@RequestBody JobInfoReq request) { + this.service.reject(request); + return Result.ok(); + } +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java b/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java new file mode 100644 index 0000000..e93c077 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java @@ -0,0 +1,73 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.TableData; +import com.dite.znpt.domain.entity.job.JobInWork; +import com.dite.znpt.domain.entity.job.JobOutWork; +import com.dite.znpt.domain.vo.job.req.JobInfoReq; +import com.dite.znpt.domain.vo.job.req.JobOutWorkReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.job.JobInWorkService; +import com.dite.znpt.service.job.JobOutWorkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author Julio + * @date 2023/2/1 14:26 + * @description 外部工作 + */ +@Api(tags = "外部工作", description = "外部工作") +@RestController +@RequestMapping("/job-out-work") +public class JobOutWorkController { + + @Autowired + private JobOutWorkService service; + + @PostMapping(value = "getWorkContent") + @ApiOperation(value = "根据jobId查询岗位内容,未查到返回空对象") + @ResponseBody + public Result getJob(@Valid @RequestBody JobOutWorkReq dto) throws ServiceException { + List list = this.service.listByJobId(dto); + if (list.isEmpty()) { + return Result.ok(new JobOutWork()); + } + return Result.ok(list.get(0)); + } + + @PostMapping(value = "save") + @ApiOperation(value = "新增或更新") + public Result save(@Valid @RequestBody JobOutWork work) { + return Result.okM(this.service.saveInfo(work), "保存成功"); + } + + @PostMapping("/list") + @ApiOperation(value = "查询列表,组长-施工人员") + public Result> list(@RequestBody JobInfoReq request) { + List list = this.service.list(request); + return Result.ok(new TableData<>(list, request.getPage(), request.getPageSize(), list.size())); + } + + @PostMapping("/submit") + @ApiOperation(value = "组长提交/项目经理审批") + public Result> submit(@RequestBody JobInfoReq request) { + this.service.submit(request); + return Result.ok(); + } + + @PostMapping("/reject") + @ApiOperation(value = "组长驳回/项目经理驳回") + public Result> reject(@RequestBody JobInfoReq request) { + this.service.reject(request); + return Result.ok(); + } + +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobSummaryWorkController.java b/web/src/main/java/com/dite/znpt/web/controller/JobSummaryWorkController.java new file mode 100644 index 0000000..f96320d --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/JobSummaryWorkController.java @@ -0,0 +1,74 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.TableData; +import com.dite.znpt.domain.entity.job.JobOutWork; +import com.dite.znpt.domain.entity.job.JobSummaryWork; +import com.dite.znpt.domain.vo.job.req.JobInfoReq; +import com.dite.znpt.domain.vo.job.req.JobSummaryWorkReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.job.JobInWorkService; +import com.dite.znpt.service.job.JobOutWorkService; +import com.dite.znpt.service.job.JobSummaryWorkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author Julio + * @date 2023/2/1 14:26 + * @description 汇总报告 + */ +@Api(tags = "汇总报告", description = "汇总报告") +@RestController +@RequestMapping("/job-summary-work") +public class JobSummaryWorkController { + + @Autowired + private JobSummaryWorkService service; + + @PostMapping(value = "getWorkContent") + @ApiOperation(value = "根据jobId查询岗位内容,未查到返回空对象") + @ResponseBody + public Result getJob(@Valid @RequestBody JobSummaryWorkReq dto) throws ServiceException { + List list = this.service.listByJobId(dto); + if (list.isEmpty()) { + return Result.ok(new JobSummaryWork()); + } + return Result.ok(list.get(0)); + } + + @PostMapping(value = "save") + @ApiOperation(value = "新增或更新") + public Result save(@Valid @RequestBody JobSummaryWork work) { + return Result.okM(this.service.saveInfo(work), "保存成功"); + } + + @PostMapping("/list") + @ApiOperation(value = "查询列表,组长-施工人员") + public Result> list(@RequestBody JobInfoReq request) { + List list = this.service.list(request); + return Result.ok(new TableData<>(list, request.getPage(), request.getPageSize(), list.size())); + } + + @PostMapping("/submit") + @ApiOperation(value = "组长提交/项目经理审批") + public Result> submit(@RequestBody JobInfoReq request) { + this.service.submit(request); + return Result.ok(); + } + + @PostMapping("/reject") + @ApiOperation(value = "组长驳回/项目经理驳回") + public Result> reject(@RequestBody JobInfoReq request) { + this.service.reject(request); + return Result.ok(); + } + +} + From f37d16e1956555e4e13339e03d01b3e2a919bccb Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Sat, 26 Apr 2025 02:28:16 +0800 Subject: [PATCH 019/143] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 11 +++ .../java/com/dite/znpt/converts/Converts.java | 25 ++++++ .../com/dite/znpt/domain/AuditableEntity.java | 1 - .../domain/entity/ImageCollectEntity.java | 12 ++- .../dite/znpt/domain/entity/ImageEntity.java | 12 --- .../dite/znpt/domain/vo/ImageCollectReq.java | 60 ++++++++++++++ .../dite/znpt/domain/vo/ImageCollectResp.java | 12 ++- .../com/dite/znpt/domain/vo/ImageListReq.java | 2 +- .../com/dite/znpt/domain/vo/ImageReq.java | 59 +++++++++++++ .../com/dite/znpt/domain/vo/ImageResp.java | 9 +- .../znpt/service/ImageCollectService.java | 2 + .../com/dite/znpt/service/ImageService.java | 3 + .../service/impl/ImageCollectServiceImpl.java | 41 ++++++++++ .../znpt/service/impl/ImageServiceImpl.java | 82 +++++++++++++++++++ .../controller/ImageCollectController.java | 33 ++++++++ .../znpt/web/controller/ImageController.java | 17 +--- web/src/main/resources/application-dev.yml | 23 ++++-- 17 files changed, 365 insertions(+), 39 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/converts/Converts.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java diff --git a/core/pom.xml b/core/pom.xml index cba752e..08bc1a5 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -140,6 +140,17 @@ metadata-extractor 2.15.0 + + + org.mapstruct + mapstruct + 1.4.1.Final + + + org.mapstruct + mapstruct-processor + 1.4.1.Final + diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java new file mode 100644 index 0000000..971f8b8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -0,0 +1,25 @@ +package com.dite.znpt.converts; + +import com.dite.znpt.domain.entity.ImageCollectEntity; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.domain.vo.ImageReq; +import org.mapstruct.Mapper; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 1:32 + * @Description: + */ +@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) +public interface Converts { + Converts INSTANCE = Mappers.getMapper(Converts.class); + + List toImageEntity(List list); + + ImageCollectEntity toImageCollectEntity(ImageCollectReq req); +} diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index a36c17e..befb37a 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -20,7 +20,6 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @Data -@SuperBuilder(toBuilder = true) public class AuditableEntity implements Serializable { private static final long serialVersionUID = 141481953116476081L; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java index 4980ae9..d6bb148 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java @@ -29,9 +29,13 @@ public class ImageCollectEntity extends AuditableEntity implements Serializable private static final long serialVersionUID = -2957687117182827156L; @ApiModelProperty("图像采集id") - @TableId(value = "collect", type = IdType.ASSIGN_UUID) + @TableId(value = "collect_id", type = IdType.ASSIGN_UUID) private String collectId; + @ApiModelProperty("部件id") + @TableField("part_id") + private String partId; + @ApiModelProperty("拍摄时间-起") @TableField("shooting_time_begin") private LocalDateTime shootingTimeBegin; @@ -64,10 +68,14 @@ public class ImageCollectEntity extends AuditableEntity implements Serializable @TableField("shooting_method") private String shootingMethod; - @ApiModelProperty("拍摄方式,枚举ShootingDistanceEnum") + @ApiModelProperty("拍摄距离") @TableField("shooting_distance") private Integer shootingDistance; + @ApiModelProperty("采集员id") + @TableField("collector_id") + private String collectorId; + @ApiModelProperty("采集员姓名") @TableField("collector_name") private String collectorName; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index d4bab7a..0a66e39 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -36,18 +36,6 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("collect_id") private String collectId; - @ApiModelProperty("部件id") - @TableField("part_id") - private String partId; - - @ApiModelProperty("项目id") - @TableField("project_id") - private String projectId; - - @ApiModelProperty("机组id") - @TableField("turbine_id") - private String turbineId; - @ApiModelProperty("图像名称") @TableField("image_name") private String imageName; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java new file mode 100644 index 0000000..2f0dbf1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -0,0 +1,60 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 1:11 + * @Description: + */ +@Data +@ApiModel("图像采集信息请求实体") +public class ImageCollectReq implements Serializable { + + @Serial + private static final long serialVersionUID = 8937301872925896770L; + + @ApiModelProperty("拍摄时间-起") + private LocalDateTime shootingTimeBegin; + + @ApiModelProperty("拍摄时间-讫") + private LocalDateTime shootingTimeEnd; + + @ApiModelProperty("天气,枚举:WeatherEnum") + private String weather; + + @ApiModelProperty("湿度(百分比)") + private Integer humidness; + + @ApiModelProperty("温度-低") + private Double temperatureMin; + + @ApiModelProperty("温度-高") + private Double temperatureMax; + + @ApiModelProperty("风力等级") + private Integer windLevel; + + @ApiModelProperty("拍摄方式,枚举ShootingMethodEnum") + private String shootingMethod; + + @ApiModelProperty("拍摄距离") + private Integer shootingDistance; + + @ApiModelProperty("采集员id") + private String collectorId; + + @ApiModelProperty("采集员姓名") + private String collectorName; + + @ApiModelProperty("图像信息") + private List imageList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java index 6ce9002..9a4a1e0 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java @@ -1,9 +1,19 @@ package com.dite.znpt.domain.vo; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + /** * @Author: gaoxiong * @Date: 2025/4/24 21:16 * @Description: */ -public class ImageCollectResp { +@Data +@ApiModel("图像采集信息响应实体") +public class ImageCollectResp implements Serializable { + @Serial + private static final long serialVersionUID = 6594307991137605975L; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index c0b8473..070bb14 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -12,7 +12,7 @@ import java.io.Serializable; * @description */ @Data -@ApiModel("图像信息列表查询实体") +@ApiModel("图像采集信息列表查询实体") public class ImageListReq implements Serializable { @Serial private static final long serialVersionUID = 671014582625089979L; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java new file mode 100644 index 0000000..4628b60 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java @@ -0,0 +1,59 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 1:18 + * @Description: + */ +@Data +@ApiModel("图像信息请求实体") +public class ImageReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1726859254176864573L; + + @ApiModelProperty("图像id") + private String imageId; + + @ApiModelProperty("图像名称") + @TableField("image_name") + private String imageName; + + @ApiModelProperty("图像尺寸") + private String imageSize; + + @ApiModelProperty("焦距") + private String focalDistance; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("相机制造商") + private String cameraManufacturer; + + @ApiModelProperty("相机型号") + private String cameraModel; + + @ApiModelProperty("经度") + private String longitude; + + @ApiModelProperty("纬度") + private String latitude; + + @ApiModelProperty("海拔") + private String altitude; + + @ApiModelProperty("图片路径") + private String imagePath; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index cce541b..dd7e001 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,10 +1,14 @@ package com.dite.znpt.domain.vo; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; /** * @author Bear.G @@ -13,7 +17,10 @@ import java.io.Serializable; */ @Data @ApiModel("图像信息响应实体") -public class ImageResp implements Serializable { +public class ImageResp extends ImageReq implements Serializable { @Serial private static final long serialVersionUID = -5215414858454232077L; + + @ApiModelProperty("影像类型,枚举ImageTypeEnum") + private String imageType; } diff --git a/core/src/main/java/com/dite/znpt/service/ImageCollectService.java b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java index c1c3754..9c6819c 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageCollectService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java @@ -2,6 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ImageCollectEntity; +import com.dite.znpt.domain.vo.ImageCollectReq; /** * @Author: gaoxiong @@ -9,4 +10,5 @@ import com.dite.znpt.domain.entity.ImageCollectEntity; * @Description: */ public interface ImageCollectService extends IService { + void save(String departId, ImageCollectReq req); } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index b956e32..284a3d8 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageListReq; import com.dite.znpt.domain.vo.ImageResp; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -15,4 +16,6 @@ import java.util.List; public interface ImageService extends IService { List selectList(ImageListReq req); + + List batchUpload(String departId, MultipartFile[] files); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index c10efeb..4e9b308 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -1,10 +1,22 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.ImageCollectReq; import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; +import com.dite.znpt.service.ImageService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.File; +import java.util.List; /** * @Author: gaoxiong @@ -14,4 +26,33 @@ import org.springframework.stereotype.Service; @Service public class ImageCollectServiceImpl extends ServiceImpl implements ImageCollectService { + @Value("${upload.perm-path}") + private String permPath; + + @Resource + private ImageService imageService; + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(String partId, ImageCollectReq req) { + ImageCollectEntity imageCollect = Converts.INSTANCE.toImageCollectEntity(req); + imageCollect.setPartId(partId); + this.save(imageCollect); + List imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); + String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); + imageList.stream().forEach(image -> { + image.setCollectId(imageCollect.getCollectId()); + String path = path_prefix + image.getImageName(); + File file = new File(image.getImagePath()); + if (file.exists()) { + byte[] bytes = FileUtil.readBytes(file); + FileUtil.writeBytes(bytes, path); + FileUtil.del(file); + image.setImagePath(path); + }else { + imageList.remove(image); + } + }); + imageService.saveOrUpdateBatch(imageList); + } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 38d5089..c973250 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -1,15 +1,32 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageListReq; import com.dite.znpt.domain.vo.ImageResp; import com.dite.znpt.mapper.ImageMapper; import com.dite.znpt.service.ImageService; +import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author Bear.G @@ -18,6 +35,10 @@ import java.util.List; */ @Service public class ImageServiceImpl extends ServiceImpl implements ImageService { + + @Value("${upload.temp-path}") + private String tempPath; + @Override public List selectList(ImageListReq req) { PageUtil.startPage(); @@ -27,4 +48,65 @@ public class ImageServiceImpl extends ServiceImpl impl }); return imageList; } + + @Transactional(rollbackFor = Exception.class) + @Override + public List batchUpload(String departId, MultipartFile[] files) { + List list = new ArrayList<>(files.length); + String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(departId).concat(StrUtil.BACKSLASH); + for (MultipartFile file : files) { + if (!file.isEmpty()) { + try { + String path = path_prefix + file.getOriginalFilename(); + FileUtil.writeBytes(file.getBytes(),path); + list.add(imageRespBuilder(path)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return list; + } + + private ImageResp imageRespBuilder(String path) throws Exception { + ImageResp resp = new ImageResp(); + File file = new File(path); + JSONObject obj = EXIFUtil.printImageTags(file); + resp.setCameraManufacturer(obj.getStr("Make")); + resp.setCameraModel(obj.getStr("Model")); + resp.setImageName(obj.getStr("File Name")); + resp.setImagePath(path); + resp.setImageSize(extractDigit(obj.getStr("Image Width")).concat("*").concat(extractDigit(obj.getStr("Image Height")))); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); + resp.setShootingTime(LocalDateTime.parse( obj.getStr("Date/Time Original"),formatter)); + resp.setFocalDistance(extractDigit(obj.getStr("Focal Length"))); + resp.setLatitude(obj.getStr("GPS Latitude").concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref")))); + resp.setLongitude(obj.getStr("GPS Longitude").concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref")))); + resp.setAltitude(extractDigit(obj.getStr("GPS Altitude")).concat("m")); + return resp; + } + + private String directionTranslator(String direction){ + if(direction.equalsIgnoreCase("N")){ + return "北"; + } else if (direction.equalsIgnoreCase("S")) { + return "南"; + } else if (direction.equalsIgnoreCase("E")) { + return "东"; + }else if (direction.equalsIgnoreCase("W")) { + return "西"; + }else { + return "未知"; + } + } + + private static String extractDigit(String str) { + Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?"); + Matcher matcher = pattern.matcher(str); + if (matcher.find()) { + return matcher.group(); + } else { + return null; + } + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java new file mode 100644 index 0000000..d798a88 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java @@ -0,0 +1,33 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.domain.vo.ImageResp; +import com.dite.znpt.service.ImageCollectService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 1:34 + * @Description: + */ +@Api(tags = "图像采集信息") +@RestController +@RequestMapping("/image-collect") +public class ImageCollectController { + + @Resource + private ImageCollectService imageCollectService; + @ApiOperation(value = "保存图像采集信息", httpMethod = "POST") + @PostMapping("/{departId}") + public Result save(@PathVariable String departId, @RequestBody ImageCollectReq req) { + imageCollectService.save(departId, req); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 00cb1ec..bde3bf2 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -2,6 +2,7 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ImageListReq; import com.dite.znpt.domain.vo.ImageResp; import com.dite.znpt.service.ImageService; @@ -39,19 +40,7 @@ public class ImageController { @ApiOperation(value = "批量上传图像", httpMethod = "POST") @PostMapping("/upload-batch/{departId}") - public List uploadBatch(@PathVariable String departId, @RequestParam("files") MultipartFile[] files) { - for (MultipartFile file : files) { - if (!file.isEmpty()) { - try { - byte[] bytes = file.getBytes(); - java.nio.file.Path path = Paths.get("G:\\Image/" + file.getOriginalFilename()); - Files.write(path, bytes); - System.out.println("Uploaded: " + file.getOriginalFilename()); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return null; + public Result> uploadBatch(@PathVariable String departId, @RequestParam("files") MultipartFile[] files) { + return Result.ok(imageService.batchUpload(departId, files)); } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index f53ac7c..f819151 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8080 + port: 8888 # 数据源配置 spring: @@ -10,7 +10,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: h67&E98HS8^6 + password: BUw8YW6%@^8q druid: # 初始连接数 initialSize: 5 @@ -59,11 +59,15 @@ spring: max-wait: 3000 host: 39.99.201.243 port: 6379 - password: yfeng@123 + password: diTeZn@123 timeout: 3000 # 0 gaea系统,3 gaea-dev/gaea-test系统,4 znpt开发,5 znpt测试 6 znpt生产 database: 4 - + rabbitmq: + host: 39.99.201.243 + port: 3389 + username: dite + password: diTezN@123 ## MINIO配置 #minio: # url: http://10.20.32.11:9000 @@ -80,7 +84,7 @@ spring: sip-config: name: 信令服务 - ip: 10.17.12.203 + ip: 127.0.0.1 port: 1074 charset: gb2312 domain: 3402000000 @@ -96,7 +100,7 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 10.17.12.203 + apiHost: 127.0.0.1 # 接口端口 apiPort: 30186 # 密钥 @@ -104,10 +108,15 @@ zlm-config: # 流id前缀 streamPrefix: # rtp ip - rtpHost: 10.17.12.203 + rtpHost: 127.0.0.1 # rtp 端口 rtpPort: 30186 # 动态端口起始值 dynamicPortStart: 30150 # 动态端口结束值 dynamicPortEnd: 30185 + +upload: + temp-path: D:\Upload\Temp + perm-path: D:\Upload\Perm + From e912f0c91cb74396c4d5a90b1d077ab5f7a34f42 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Sun, 27 Apr 2025 01:32:48 +0800 Subject: [PATCH 020/143] =?UTF-8?q?=E5=B7=A5=E4=B8=9A=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E5=88=A0=E9=99=A4=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E3=80=81=E6=9F=A5=E7=9C=8B=E5=9B=BE=E5=83=8F=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 18 +++ .../domain/entity/ImageCollectEntity.java | 4 +- .../dite/znpt/domain/entity/ImageEntity.java | 37 +++++- .../dite/znpt/domain/vo/ImageCollectInfo.java | 50 ++++++++ .../dite/znpt/domain/vo/ImageCollectReq.java | 3 + .../dite/znpt/domain/vo/ImageCollectResp.java | 19 --- .../dite/znpt/domain/vo/ImageExifInfo.java | 67 +++++++++++ .../com/dite/znpt/domain/vo/ImageListReq.java | 8 ++ .../dite/znpt/domain/vo/ImageListResp.java | 86 ++++++++++++++ .../com/dite/znpt/domain/vo/ImageReq.java | 31 ++--- .../com/dite/znpt/domain/vo/ImageResp.java | 25 +++- .../com/dite/znpt/enums/ImageTypeEnum.java | 5 + .../dite/znpt/enums/ShootingMethodEnum.java | 7 +- .../java/com/dite/znpt/enums/WeatherEnum.java | 5 + .../com/dite/znpt/mapper/ImageMapper.java | 9 +- .../com/dite/znpt/service/ImageService.java | 12 +- .../service/impl/ImageCollectServiceImpl.java | 9 ++ .../znpt/service/impl/ImageServiceImpl.java | 111 ++++++++++++++---- .../resources/mapper/ImageCollectMapper.xml | 2 +- .../src/main/resources/mapper/ImageMapper.xml | 67 +++++++++-- .../controller/ImageCollectController.java | 33 ------ .../znpt/web/controller/ImageController.java | 42 +++++-- 22 files changed, 514 insertions(+), 136 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/constant/Message.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageExifInfo.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java new file mode 100644 index 0000000..2e87a9f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -0,0 +1,18 @@ +package com.dite.znpt.constant; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 23:19 + * @Description: + */ +public class Message implements Serializable { + @Serial + private static final long serialVersionUID = 4010434089386946123L; + + public static final String IMAGE_IS_EMPTY = "图像信息为空"; + public static final String IMAGE_PATH_IS_NOT_EXIST = "图像地址不存在"; + public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java index d6bb148..b87a04c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java @@ -44,8 +44,8 @@ public class ImageCollectEntity extends AuditableEntity implements Serializable @TableField("shooting_time_end") private LocalDateTime shootingTimeEnd; - @ApiModelProperty("天气") - @TableField("weather,枚举:WeatherEnum") + @ApiModelProperty("天气,枚举:WeatherEnum") + @TableField("weather") private String weather; @ApiModelProperty("湿度(百分比)") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 0a66e39..8a87c8c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -12,6 +12,7 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -40,14 +41,42 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("image_name") private String imageName; - @ApiModelProperty("图像尺寸") + @ApiModelProperty("图像大小") @TableField("image_size") private String imageSize; + @ApiModelProperty("图像宽") + @TableField("image_width") + private String imageWidth; + + @ApiModelProperty("图像高") + @TableField("image_height") + private String imageHeight; + + @ApiModelProperty("图像分辨率") + @TableField("image_resolution") + private String imageResolution; + + @ApiModelProperty("焦平面X轴分辨率") + @TableField("x_resolution") + private String xResolution; + + @ApiModelProperty("焦平面Y轴分辨率") + @TableField("y_resolution") + private String YResolution; + + @ApiModelProperty("焦平面分辨率单位") + @TableField("resolution_units") + private String ResolutionUnits; + @ApiModelProperty("焦距") @TableField("focal_distance") private String focalDistance; + @ApiModelProperty("35毫米焦距") + @TableField("focal_distance35") + private String focalDistance35; + @ApiModelProperty("拍摄时间") @TableField("shooting_time") private LocalDateTime shootingTime; @@ -72,8 +101,12 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("altitude") private String altitude; + @ApiModelProperty("GPS") + @TableField("GPS") + private String GPS; + @ApiModelProperty("影像类型") - @TableField("image_type,枚举ImageTypeEnum") + @TableField("image_type") private String imageType; @ApiModelProperty("图片路径") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java new file mode 100644 index 0000000..1c7811f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java @@ -0,0 +1,50 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:16 + * @Description: + */ +@Data +@ApiModel("图像拍摄信息") +public class ImageCollectInfo implements Serializable { + @Serial + private static final long serialVersionUID = 6594307991137605975L; + + @ApiModelProperty("图像采集信息id") + private String collectId; + + @ApiModelProperty("天气,枚举:WeatherEnum") + private String weather; + + @ApiModelProperty("天气描述") + private String weatherLabel; + + @ApiModelProperty("湿度(百分比)") + private Integer humidness; + + @ApiModelProperty("温度") + private String temperature; + + @ApiModelProperty("风力等级") + private Integer windLevel; + + @ApiModelProperty("拍摄方式,枚举ShootingMethodEnum") + private String shootingMethod; + + @ApiModelProperty("拍摄方式描述") + private String shootingMethodLabel; + + @ApiModelProperty("拍摄距离") + private Integer shootingDistance; + + @ApiModelProperty("采集员姓名") + private String collectorName; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java index 2f0dbf1..0c6eba2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,9 +23,11 @@ public class ImageCollectReq implements Serializable { @Serial private static final long serialVersionUID = 8937301872925896770L; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("拍摄时间-起") private LocalDateTime shootingTimeBegin; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("拍摄时间-讫") private LocalDateTime shootingTimeEnd; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java deleted file mode 100644 index 9a4a1e0..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectResp.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * @Author: gaoxiong - * @Date: 2025/4/24 21:16 - * @Description: - */ -@Data -@ApiModel("图像采集信息响应实体") -public class ImageCollectResp implements Serializable { - @Serial - private static final long serialVersionUID = 6594307991137605975L; -} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageExifInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageExifInfo.java new file mode 100644 index 0000000..1a0b8aa --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageExifInfo.java @@ -0,0 +1,67 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 23:35 + * @Description: + */ +@Data +@ApiModel("图像Exif信息") +public class ImageExifInfo implements Serializable { + + @ApiModelProperty("图像宽") + private String imageWidth; + + @ApiModelProperty("图像高") + private String imageHeight; + + @ApiModelProperty("图像分辨率") + private String imageResolution; + + @ApiModelProperty("焦距") + private String focalDistance; + + @ApiModelProperty("35毫米焦距") + private String focalDistance35; + + @ApiModelProperty("焦平面X轴分辨率") + @TableField("x_resolution") + private String xResolution; + + @ApiModelProperty("焦平面Y轴分辨率") + @TableField("y_resolution") + private String yResolution; + + @ApiModelProperty("焦平面分辨率单位") + @TableField("resolution_units") + private String resolutionUnits; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("相机制造商") + private String cameraManufacturer; + + @ApiModelProperty("相机型号") + private String cameraModel; + + @ApiModelProperty("经度") + private String longitude; + + @ApiModelProperty("纬度") + private String latitude; + + @ApiModelProperty("海拔") + private String altitude; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index 070bb14..e51f90c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; @@ -16,4 +17,11 @@ import java.io.Serializable; public class ImageListReq implements Serializable { @Serial private static final long serialVersionUID = 671014582625089979L; + + @ApiModelProperty("关键字") + private String keyword; + + @ApiModelProperty("图像类型") + private String[] imageTypes; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java new file mode 100644 index 0000000..e632fda --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -0,0 +1,86 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/4/26 21:07 + * @Description: + */ +@Data +@ApiModel("图像列表信息响应实体") +public class ImageListResp implements Serializable { + + @Serial + private static final long serialVersionUID = 3168482118066685077L; + + @ApiModelProperty("图像id") + private String imageId; + + @ApiModelProperty("图像名称") + @TableField("image_name") + private String imageName; + + @ApiModelProperty("部件名称") + private String partName; + + @ApiModelProperty("图像分辨率") + private String imageResolution; + + @ApiModelProperty("焦距") + private String focalDistance; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("相机制造商") + private String cameraManufacturer; + + @ApiModelProperty("相机型号") + private String cameraModel; + + @ApiModelProperty("GPS") + private String GPS; + + @ApiModelProperty("天气,枚举:WeatherEnum") + private String weather; + + @ApiModelProperty("天气描述") + private String weatherLabel; + + @ApiModelProperty("湿度(百分比)") + private Integer humidness; + + @ApiModelProperty("温度") + private String temperature; + + @ApiModelProperty("风力等级") + private Integer windLevel; + + @ApiModelProperty("拍摄方式,枚举ShootingMethodEnum") + private String shootingMethod; + + @ApiModelProperty("拍摄方式描述") + private String shootingMethodLabel; + + @ApiModelProperty("拍摄距离") + private Integer shootingDistance; + + @ApiModelProperty("采集员姓名") + private String collectorName; + + @ApiModelProperty("影像类型,枚举ImageTypeEnum") + private String imageType; + + @ApiModelProperty("影像类型描述") + private String imageTypeLabel; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java index 4628b60..7a360d1 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageReq.java @@ -17,7 +17,7 @@ import java.time.LocalDateTime; */ @Data @ApiModel("图像信息请求实体") -public class ImageReq implements Serializable { +public class ImageReq extends ImageExifInfo implements Serializable { @Serial private static final long serialVersionUID = -1726859254176864573L; @@ -29,31 +29,16 @@ public class ImageReq implements Serializable { @TableField("image_name") private String imageName; - @ApiModelProperty("图像尺寸") + @ApiModelProperty("图像大小") private String imageSize; - @ApiModelProperty("焦距") - private String focalDistance; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("拍摄时间") - private LocalDateTime shootingTime; - - @ApiModelProperty("相机制造商") - private String cameraManufacturer; - - @ApiModelProperty("相机型号") - private String cameraModel; - - @ApiModelProperty("经度") - private String longitude; - - @ApiModelProperty("纬度") - private String latitude; - - @ApiModelProperty("海拔") - private String altitude; + @ApiModelProperty("图像分辨率") + private String imageResolution; @ApiModelProperty("图片路径") private String imagePath; + + @ApiModelProperty("GPS") + private String GPS; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index dd7e001..8784839 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -17,10 +17,29 @@ import java.time.LocalDateTime; */ @Data @ApiModel("图像信息响应实体") -public class ImageResp extends ImageReq implements Serializable { +public class ImageResp implements Serializable { @Serial private static final long serialVersionUID = -5215414858454232077L; - @ApiModelProperty("影像类型,枚举ImageTypeEnum") - private String imageType; + @ApiModelProperty("图像id") + private String imageId; + + @ApiModelProperty("图像名称") + private String imageName; + + @ApiModelProperty("图像路径") + private String imagePath; + + @ApiModelProperty("图像大小") + private String imageSize; + + @ApiModelProperty("图像分辨率") + private String imageResolution; + + @ApiModelProperty("图像Exif信息") + private ImageExifInfo imageExifInfo; + + @ApiModelProperty("图像拍摄信息") + private ImageCollectInfo imageCollectInfo; + } diff --git a/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java index a8c432c..9141afd 100644 --- a/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java @@ -31,6 +31,11 @@ public enum ImageTypeEnum { return null; } + public static String getDescByCode(String code){ + ImageTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + public static List listAll(){ List list = new ArrayList<>(ImageTypeEnum.values().length); for (ImageTypeEnum e : ImageTypeEnum.values() ) { diff --git a/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java b/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java index 5fb58d2..7c74c03 100644 --- a/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ShootingMethodEnum.java @@ -24,7 +24,7 @@ public enum ShootingMethodEnum { this.desc = desc; } - private ShootingMethodEnum getByCode(String code){ + public static ShootingMethodEnum getByCode(String code){ for (ShootingMethodEnum e : ShootingMethodEnum.values() ) { if(e.code.equals(code)){ return e; @@ -33,6 +33,11 @@ public enum ShootingMethodEnum { return null; } + public static String getDescByCode(String code){ + ShootingMethodEnum e = getByCode(code); + return null == e ? null : e.desc; + } + public static List listAll(){ List list = new ArrayList<>(ShootingMethodEnum.values().length); for (ShootingMethodEnum e : ShootingMethodEnum.values() ) { diff --git a/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java b/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java index d75d026..9c2be8c 100644 --- a/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/WeatherEnum.java @@ -53,6 +53,11 @@ public enum WeatherEnum { return null; } + public static String getDescByCode(String code){ + WeatherEnum e = getByCode(code); + return null == e ? null : e.desc; + } + public static List listAll(){ List list = new ArrayList<>(WeatherEnum.values().length); for (WeatherEnum e : WeatherEnum.values() ) { diff --git a/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java index 14ec3d4..133691f 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ImageMapper.java @@ -2,10 +2,7 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ImageEntity; -import com.dite.znpt.domain.vo.ImageListReq; -import com.dite.znpt.domain.vo.ImageResp; -import com.dite.znpt.domain.vo.PartListReq; -import com.dite.znpt.domain.vo.PartResp; +import com.dite.znpt.domain.vo.*; import java.util.List; @@ -15,5 +12,7 @@ import java.util.List; * @description */ public interface ImageMapper extends BaseMapper { - List queryBySelective(ImageListReq req); + List queryImageList(ImageListReq req); + + ImageResp detail(String imageId); } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 284a3d8..cd24553 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -3,6 +3,8 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageListReq; +import com.dite.znpt.domain.vo.ImageListResp; +import com.dite.znpt.domain.vo.ImageReq; import com.dite.znpt.domain.vo.ImageResp; import org.springframework.web.multipart.MultipartFile; @@ -15,7 +17,13 @@ import java.util.List; */ public interface ImageService extends IService { - List selectList(ImageListReq req); + List list(ImageListReq req); - List batchUpload(String departId, MultipartFile[] files); + List page(ImageListReq req); + + ImageResp detail(String imageId); + + List batchUpload(String departId, MultipartFile[] files); + + void delete(String imageId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 4e9b308..8fbe3d3 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -1,12 +1,15 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; @@ -35,6 +38,9 @@ public class ImageCollectServiceImpl extends ServiceImpl implements ImageService { + @Resource + private ImageCollectService imageCollectService; + @Value("${upload.temp-path}") private String tempPath; @Override - public List selectList(ImageListReq req) { - PageUtil.startPage(); - List imageList= this.baseMapper.queryBySelective(req); - imageList.forEach(resp -> { - + public List list(ImageListReq req) { + List partList= this.baseMapper.queryImageList(req); + partList.forEach(resp -> { + resp.setWeatherLabel(WeatherEnum.getDescByCode(resp.getWeather())); + resp.setShootingMethodLabel(ShootingMethodEnum.getDescByCode(resp.getShootingMethod())); + resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); }); - return imageList; + return partList; + } + + @Override + public List page(ImageListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public ImageResp detail(String imageId) { + ImageResp imageResp = this.baseMapper.detail(imageId); + imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); + imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + return imageResp; } @Transactional(rollbackFor = Exception.class) @Override - public List batchUpload(String departId, MultipartFile[] files) { - List list = new ArrayList<>(files.length); + public List batchUpload(String departId, MultipartFile[] files) { + if(null == files || files.length == 0){ + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + List list = new ArrayList<>(files.length); String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(departId).concat(StrUtil.BACKSLASH); for (MultipartFile file : files) { if (!file.isEmpty()) { @@ -68,22 +98,52 @@ public class ImageServiceImpl extends ServiceImpl impl return list; } - private ImageResp imageRespBuilder(String path) throws Exception { - ImageResp resp = new ImageResp(); + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(String imageId) { + ImageEntity image = this.getById(imageId); + if(null ==image){ + throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); + } + this.removeById(image); + List imageList = this.list(Wrappers.lambdaQuery().eq(ImageEntity::getCollectId, image.getCollectId())); + if(CollUtil.isEmpty(imageList)){ + imageCollectService.removeById(image.getCollectId()); + } + File file = new File(image.getImagePath()); + if (file.exists()) { + FileUtil.del(file); + } + } + + private ImageReq imageRespBuilder(String path) throws Exception { + ImageReq req = new ImageReq(); File file = new File(path); JSONObject obj = EXIFUtil.printImageTags(file); - resp.setCameraManufacturer(obj.getStr("Make")); - resp.setCameraModel(obj.getStr("Model")); - resp.setImageName(obj.getStr("File Name")); - resp.setImagePath(path); - resp.setImageSize(extractDigit(obj.getStr("Image Width")).concat("*").concat(extractDigit(obj.getStr("Image Height")))); + req.setCameraManufacturer(obj.getStr("Make")); + req.setCameraModel(obj.getStr("Model")); + req.setImageName(obj.getStr("File Name")); + req.setImagePath(path); + BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); + req.setImageSize(imageSize.toString().concat("M")); + req.setImageWidth(extractDigit(obj.getStr("Image Width"))); + req.setImageHeight(extractDigit(obj.getStr("Image Height"))); + req.setImageResolution(req.getImageWidth().concat("x").concat(req.getImageHeight())); + req.setFocalDistance35(extractDigit(obj.getStr("Focal Length 35"))); + req.setXResolution(extractDigit(obj.getStr("X Resolution"))); + req.setYResolution(extractDigit(obj.getStr("Y Resolution"))); + req.setResolutionUnits(obj.getStr("Resolution Units")); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); - resp.setShootingTime(LocalDateTime.parse( obj.getStr("Date/Time Original"),formatter)); - resp.setFocalDistance(extractDigit(obj.getStr("Focal Length"))); - resp.setLatitude(obj.getStr("GPS Latitude").concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref")))); - resp.setLongitude(obj.getStr("GPS Longitude").concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref")))); - resp.setAltitude(extractDigit(obj.getStr("GPS Altitude")).concat("m")); - return resp; + req.setShootingTime(LocalDateTime.parse( obj.getStr("Date/Time Original"),formatter)); + req.setFocalDistance(extractDigit(obj.getStr("Focal Length"))); + req.setLatitude(obj.getStr("GPS Latitude")); + req.setLongitude(obj.getStr("GPS Longitude")); + req.setAltitude(extractDigit(obj.getStr("GPS Altitude"))); + String gps = req.getLatitude().concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref"))).concat(StrUtil.COMMA) + .concat(req.getLongitude()).concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref"))).concat(StrUtil.COMMA) + .concat("海拔").concat(req.getAltitude()).concat("m"); + req.setGPS(gps); + return req; } private String directionTranslator(String direction){ @@ -109,4 +169,5 @@ public class ImageServiceImpl extends ServiceImpl impl return null; } } + } diff --git a/core/src/main/resources/mapper/ImageCollectMapper.xml b/core/src/main/resources/mapper/ImageCollectMapper.xml index 64a0f9d..5d3e173 100644 --- a/core/src/main/resources/mapper/ImageCollectMapper.xml +++ b/core/src/main/resources/mapper/ImageCollectMapper.xml @@ -7,7 +7,7 @@ a.shooting_distance, a.collector_name, - select from image_collect_info a diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 98ee794..022d42d 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -1,20 +1,65 @@ - - a.image, a.part_id, a.turbine_id, a.project_id, a.image_name, a.image_size, a.focal_distance, - a.shooting_time, a.camera_manufacture, a.camera_model, a.longitude, a.latitude, a.altitude, - a.image_type, a.image_path - - - + SELECT + i.image_id, i.image_name, ic.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, + i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type + FROM image i + LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id + LEFT JOIN part p ON ic.part_id = p.part_id - and a.image_name like concat('%', #{keyword,jdbcType=VARCHAR}, '%') + AND i.image_name LIKE concat('%', #{keyword}, '%') + + + AND i.image_type in #{imageType} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java deleted file mode 100644 index d798a88..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageCollectController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dite.znpt.web.controller; - -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.ImageCollectReq; -import com.dite.znpt.domain.vo.ImageResp; -import com.dite.znpt.service.ImageCollectService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @Author: gaoxiong - * @Date: 2025/4/26 1:34 - * @Description: - */ -@Api(tags = "图像采集信息") -@RestController -@RequestMapping("/image-collect") -public class ImageCollectController { - - @Resource - private ImageCollectService imageCollectService; - @ApiOperation(value = "保存图像采集信息", httpMethod = "POST") - @PostMapping("/{departId}") - public Result save(@PathVariable String departId, @RequestBody ImageCollectReq req) { - imageCollectService.save(departId, req); - return Result.ok(); - } -} diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index bde3bf2..773713f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -3,19 +3,15 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.ImageListReq; -import com.dite.znpt.domain.vo.ImageResp; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.List; /** @@ -31,16 +27,44 @@ public class ImageController { @Resource private ImageService imageService; + @Resource + private ImageCollectService imageCollectService; + @ApiOperation(value = "分页查询图像列表", httpMethod = "GET") @GetMapping("/page") - public PageResult list(ImageListReq req) { - return PageResult.ok(imageService.selectList(req)); + public PageResult page(@RequestBody ImageListReq req) { + return PageResult.ok(imageService.page(req)); } + @ApiOperation(value = "查询图像列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestBody ImageListReq req){ + return Result.ok(imageService.list(req)); + } + + @ApiOperation(value = "查询图像详情", httpMethod = "GET") + @GetMapping("/detail/{imageId}") + public Result detail(@PathVariable String imageId){ + return Result.ok(imageService.detail(imageId)); + } @ApiOperation(value = "批量上传图像", httpMethod = "POST") @PostMapping("/upload-batch/{departId}") - public Result> uploadBatch(@PathVariable String departId, @RequestParam("files") MultipartFile[] files) { + public Result> uploadBatch(@PathVariable String departId, @RequestParam("files") MultipartFile[] files) { return Result.ok(imageService.batchUpload(departId, files)); } + + @ApiOperation(value = "设置信息", httpMethod = "POST") + @PostMapping("/setting-info/{departId}") + public Result save(@PathVariable String departId, @RequestBody ImageCollectReq req) { + imageCollectService.save(departId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除图像", httpMethod = "DELETE") + @DeleteMapping("/{imageId}") + public Result remove(@PathVariable String imageId){ + imageService.delete(imageId); + return Result.ok(); + } } From b68e4489fd7d6101ebdd8242dff98eb18ffc6912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Sun, 27 Apr 2025 17:31:57 +0800 Subject: [PATCH 021/143] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/DefectEntity.java | 53 +++++++++++++++---- .../java/com/dite/znpt/enums/DefectLevel.java | 9 ---- .../com/dite/znpt/enums/DefectLevelEnum.java | 50 +++++++++++++++++ .../com/dite/znpt/enums/DefectTypeEnum.java | 49 +++++++++++++++++ web/src/main/resources/application-dev.yml | 16 +++--- 5 files changed, 151 insertions(+), 26 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/enums/DefectLevel.java create mode 100644 core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index 1c154af..134baf1 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -2,6 +2,7 @@ package com.dite.znpt.domain.entity; import java.math.BigDecimal; import java.io.Serializable; +import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import com.dite.znpt.domain.AuditableEntity; @@ -29,16 +30,26 @@ public class DefectEntity extends AuditableEntity implements Serializable { @TableId(value = "defect_id", type = IdType.ASSIGN_UUID) private String defectId; - @ExcelProperty("机组id") - @ApiModelProperty("机组id") - @TableField("turbine_code") - private String turbineId; - @ExcelProperty("部件id") @ApiModelProperty("部件id") @TableField("part_id") private String partId; + @ExcelProperty("缺陷编码") + @ApiModelProperty("缺陷编码") + @TableField("defect_code") + private String defectCode; + + @ExcelProperty("缺陷名称") + @ApiModelProperty("缺陷名称") + @TableField("defect_name") + private String defectName; + + @ExcelProperty("缺陷部位") + @ApiModelProperty("缺陷部位") + @TableField("defect_position") + private String defectPosition; + @ExcelProperty("缺陷类型,枚举DefectTypeEnum") @ApiModelProperty("缺陷类型,枚举DefectTypeEnum") @TableField("defect_type") @@ -49,11 +60,35 @@ public class DefectEntity extends AuditableEntity implements Serializable { @TableField("defect_level") private String defectLevel; + @ExcelProperty("维修状态,枚举RepairStatusEnum") + @ApiModelProperty("维修状态,枚举RepairStatusEnum") + @TableField("repair_status") + private String repairStatus; - @ExcelProperty("图片路径") - @ApiModelProperty("图片路径") - @TableField("defect_image_path") - private String defectImagePath; + @ExcelProperty("检测时间") + @ApiModelProperty("检测时间") + @TableField("detection_time") + private LocalDateTime detectionTime; + + @ExcelProperty("来源") + @ApiModelProperty("来源") + @TableField("source") + private String source; + + @ExcelProperty("弦向") + @ApiModelProperty("弦向") + @TableField("chordwise") + private Integer chordwise; + + @ExcelProperty("轴向") + @ApiModelProperty("轴向") + @TableField("axial") + private Integer axial; + + @ExcelProperty("标注信息") + @ApiModelProperty("标注信息") + @TableField("label_info") + private String labelInfo; @ExcelProperty("说明") @ApiModelProperty("说明") diff --git a/core/src/main/java/com/dite/znpt/enums/DefectLevel.java b/core/src/main/java/com/dite/znpt/enums/DefectLevel.java deleted file mode 100644 index 8c74c6d..0000000 --- a/core/src/main/java/com/dite/znpt/enums/DefectLevel.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dite.znpt.enums; - -/** - * @Author: gaoxiong - * @Date: 2025/4/24 21:44 - * @Description: - */ -public enum DefectLevel { -} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java new file mode 100644 index 0000000..3866d85 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java @@ -0,0 +1,50 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:44 + * @Description: + */ +public enum DefectLevelEnum { + SLIGHT("SLIGHT", "轻微缺陷"), + GENERAL("GENERAL", "一般缺陷"), + SERIOUS("SERIOUS", "比较严重"), + CRITICAL("CRITICAL", "非常严重"); + + private final String code; + private final String desc; + + DefectLevelEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static DefectLevelEnum getByCode(String code){ + for (DefectLevelEnum e : DefectLevelEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + DefectLevelEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(DefectLevelEnum.values().length); + for (DefectLevelEnum e : DefectLevelEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java index 4aac3db..e3de0f6 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java @@ -1,9 +1,58 @@ package com.dite.znpt.enums; +import cn.hutool.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + /** * @Author: gaoxiong * @Date: 2025/4/24 21:43 * @Description: */ public enum DefectTypeEnum { + CRAZE("CRAZE", "合缝开裂"), + ABRASION("ABRASION", "合缝磨损"), + LEATHER_BREAKAGE("LEATHER_BREAKAGE", "蒙皮破损"), + FABRIC_BREAKAGE("FABRIC_BREAKAGE", "布层破损"), + PART_BREAKAGE(" PART_BREAKAGE", "局部破损"), + TOTAL_DAMAGE("TOTAL_DAMAGE", "累计损伤"), + LAYER_SHED("LAYER_SHED", "涂层脱落"), + PAINT_SHEDDING("PAINT_SHEDDING", "风损掉漆"), + SURFACE_CRACK("SURFACE_CRACK", "表面裂纹"), + CHORDWISE_CRACK("CHORDWISE_CRACK", "弦向裂纹"), + AXIAL_CRACK("AXIAL_CRACK", "轴向裂纹"), + WRINKLE("WRINKLE", "褶皱"); + + private final String code; + private final String desc; + + DefectTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static DefectTypeEnum getByCode(String code){ + for (DefectTypeEnum e : DefectTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + DefectTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(DefectTypeEnum.values().length); + for (DefectTypeEnum e : DefectTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index f819151..f4933c6 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -84,7 +84,7 @@ spring: sip-config: name: 信令服务 - ip: 127.0.0.1 + ip: 192.168.0.207 port: 1074 charset: gb2312 domain: 3402000000 @@ -100,23 +100,23 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 127.0.0.1 + apiHost: 192.168.0.207 # 接口端口 - apiPort: 30186 + apiPort: 8080 # 密钥 - secretKey: JvVotkdN01y4qZHlrJsdq4gD7n9rK6wV + secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G # 流id前缀 streamPrefix: # rtp ip - rtpHost: 127.0.0.1 + rtpHost: 192.168.0.207 # rtp 端口 - rtpPort: 30186 + rtpPort: 8080 # 动态端口起始值 dynamicPortStart: 30150 # 动态端口结束值 dynamicPortEnd: 30185 upload: - temp-path: D:\Upload\Temp - perm-path: D:\Upload\Perm + temp-path: F:\Upload\Temp + perm-path: F:\Upload\Perm From 44e0f6748dd32c641facf6c2040efc476cf2b914 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Sun, 27 Apr 2025 22:40:40 +0800 Subject: [PATCH 022/143] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=EF=BC=8C=E7=BC=96=E8=BE=91=E7=BC=BA=E9=99=B7=EF=BC=8C=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=E5=88=97=E8=A1=A8=EF=BC=8C=E7=BC=BA=E9=99=B7=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=92=8C=E5=88=A0=E9=99=A4=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../java/com/dite/znpt/converts/Converts.java | 7 ++ .../dite/znpt/domain/entity/DefectEntity.java | 14 ++-- .../dite/znpt/domain/vo/DefectListReq.java | 3 - .../dite/znpt/domain/vo/DefectListResp.java | 35 ++++++++++ .../com/dite/znpt/domain/vo/DefectReq.java | 59 ++++++++++++++++ .../com/dite/znpt/domain/vo/DefectResp.java | 33 +++++++-- .../com/dite/znpt/domain/vo/ImageListReq.java | 3 + .../com/dite/znpt/enums/DefectLevelEnum.java | 2 + .../com/dite/znpt/enums/DefectSourceEnum.java | 50 ++++++++++++++ .../com/dite/znpt/enums/DefectTypeEnum.java | 2 + .../com/dite/znpt/enums/ImageTypeEnum.java | 2 + .../com/dite/znpt/enums/RepairStatusEnum.java | 51 ++++++++++++++ .../com/dite/znpt/mapper/DefectMapper.java | 1 + .../com/dite/znpt/service/DefectService.java | 19 ++++-- .../znpt/service/impl/DefectServiceImpl.java | 68 +++++++++++++------ .../main/resources/mapper/DefectMapper.xml | 32 +++++---- .../resources/mapper/ImageCollectMapper.xml | 10 --- .../src/main/resources/mapper/ImageMapper.xml | 3 + .../znpt/web/controller/DefectController.java | 39 ++++++----- 20 files changed, 356 insertions(+), 78 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/RepairStatusEnum.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 2e87a9f..7529768 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -15,4 +15,5 @@ public class Message implements Serializable { public static final String IMAGE_IS_EMPTY = "图像信息为空"; public static final String IMAGE_PATH_IS_NOT_EXIST = "图像地址不存在"; public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; + public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 971f8b8..55a918b 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -1,7 +1,10 @@ package com.dite.znpt.converts; +import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.DefectReq; +import com.dite.znpt.domain.vo.DefectResp; import com.dite.znpt.domain.vo.ImageCollectReq; import com.dite.znpt.domain.vo.ImageReq; import org.mapstruct.Mapper; @@ -22,4 +25,8 @@ public interface Converts { List toImageEntity(List list); ImageCollectEntity toImageCollectEntity(ImageCollectReq req); + + DefectEntity toDefectEntity(DefectReq req); + + DefectResp toDefectResp(DefectEntity entity); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index 134baf1..e412486 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -30,10 +30,10 @@ public class DefectEntity extends AuditableEntity implements Serializable { @TableId(value = "defect_id", type = IdType.ASSIGN_UUID) private String defectId; - @ExcelProperty("部件id") - @ApiModelProperty("部件id") - @TableField("part_id") - private String partId; + @ExcelProperty("图像id") + @ApiModelProperty("图像id") + @TableField("image_id") + private String imageId; @ExcelProperty("缺陷编码") @ApiModelProperty("缺陷编码") @@ -94,5 +94,11 @@ public class DefectEntity extends AuditableEntity implements Serializable { @ApiModelProperty("说明") @TableField("description") private String description; + + @ExcelProperty("维修建议") + @ApiModelProperty("维修建议") + @TableField("repair_idea") + private String repairIdea; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 311dd40..7d06d01 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -27,9 +27,6 @@ public class DefectListReq implements Serializable { @ApiModelProperty("机组id") private String turbineId; - @ApiModelProperty("部件id") - private String partId; - @ApiModelProperty("缺陷类型,枚举:DefectTypeEnum") private String defectType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java new file mode 100644 index 0000000..cabef9b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java @@ -0,0 +1,35 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/4/27 21:23 + * @Description: + */ +@Data +@ApiModel("缺陷记录列表响应实体") +public class DefectListResp implements Serializable { + + @ApiModelProperty("缺陷id") + private String defectId; + + @ApiModelProperty("缺陷名称") + private String defectName; + + @ApiModelProperty("缺陷编码") + private String defectCode; + + @ApiModelProperty("部件名称") + private String partName; + + @ApiModelProperty("缺陷未知") + private String defectPosition; + + @ApiModelProperty("说明") + private String description; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java new file mode 100644 index 0000000..f34d318 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java @@ -0,0 +1,59 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @Author: gaoxiong + * @Date: 2025/4/27 21:16 + * @Description: + */ +@Data +@ApiModel("缺陷记录请求实体") +public class DefectReq implements Serializable { + + @ApiModelProperty("缺陷编码") + private String defectCode; + + @ApiModelProperty("缺陷名称") + private String defectName; + + @ApiModelProperty("缺陷部位") + private String defectPosition; + + @ApiModelProperty("缺陷类型,枚举DefectTypeEnum") + private String defectType; + + @ApiModelProperty("危重等级,枚举DefectLevelEnum") + private String defectLevel; + + @ApiModelProperty("维修状态,枚举RepairStatusEnum") + private String repairStatus; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("检测时间") + private LocalDate detectionDate; + + @ApiModelProperty("来源,枚举:DefectSourceEnum") + private String source; + + @ApiModelProperty("弦向") + private Integer chordwise; + + @ApiModelProperty("轴向") + private Integer axial; + + @ApiModelProperty("标注信息") + private String labelInfo; + + @ApiModelProperty("说明") + private String description; + + @ApiModelProperty("维修建议") + private String repairIdea; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java index 0a4ffac..73f6444 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java @@ -1,9 +1,16 @@ package com.dite.znpt.domain.vo; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.DefectEntity; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; /** * @author huise23 @@ -11,8 +18,26 @@ import com.dite.znpt.domain.entity.DefectEntity; * @Description: 缺陷记录响应实体 */ @Data -@EqualsAndHashCode(callSuper = true) @ApiModel("缺陷记录响应实体") -public class DefectResp extends DefectEntity { +public class DefectResp extends DefectReq implements Serializable { + + @Serial + private static final long serialVersionUID = 7723957970600470768L; + + @ApiModelProperty("缺陷id") + private String defectId; + + @ApiModelProperty("缺陷类型描述") + private String defectTypeLabel; + + @ApiModelProperty("危重等级描述") + private String defectLevelLabel; + + @ApiModelProperty("维修状态描述") + private String repairStatusLabel; + + @ApiModelProperty("来源描述") + private String sourceLabel; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index e51f90c..c507576 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -21,6 +21,9 @@ public class ImageListReq implements Serializable { @ApiModelProperty("关键字") private String keyword; + @ApiModelProperty("机组id") + private String turbineId; + @ApiModelProperty("图像类型") private String[] imageTypes; diff --git a/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java index 3866d85..713e90f 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectLevelEnum.java @@ -1,6 +1,7 @@ package com.dite.znpt.enums; import cn.hutool.json.JSONObject; +import lombok.Getter; import java.util.ArrayList; import java.util.List; @@ -10,6 +11,7 @@ import java.util.List; * @Date: 2025/4/24 21:44 * @Description: */ +@Getter public enum DefectLevelEnum { SLIGHT("SLIGHT", "轻微缺陷"), GENERAL("GENERAL", "一般缺陷"), diff --git a/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java new file mode 100644 index 0000000..e05bcdd --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java @@ -0,0 +1,50 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/27 20:55 + * @Description: + */ +@Getter +public enum DefectSourceEnum { + AI("AI", "智能识别"), + MANUAL("MANUAL", "人工标注"); + + private final String code; + private final String desc; + + DefectSourceEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static DefectSourceEnum getByCode(String code){ + for (DefectSourceEnum e : DefectSourceEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + DefectSourceEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(DefectSourceEnum.values().length); + for (DefectSourceEnum e : DefectSourceEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java index e3de0f6..4d44f20 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java @@ -1,6 +1,7 @@ package com.dite.znpt.enums; import cn.hutool.json.JSONObject; +import lombok.Getter; import java.util.ArrayList; import java.util.List; @@ -10,6 +11,7 @@ import java.util.List; * @Date: 2025/4/24 21:43 * @Description: */ +@Getter public enum DefectTypeEnum { CRAZE("CRAZE", "合缝开裂"), ABRASION("ABRASION", "合缝磨损"), diff --git a/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java index 9141afd..6f629b0 100644 --- a/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ImageTypeEnum.java @@ -1,6 +1,7 @@ package com.dite.znpt.enums; import cn.hutool.json.JSONObject; +import lombok.Getter; import java.util.ArrayList; import java.util.List; @@ -10,6 +11,7 @@ import java.util.List; * @Date: 2025/4/24 21:25 * @Description: */ +@Getter public enum ImageTypeEnum { DEFECT("DEFECT", "缺陷影像"), TYPICAL("TYPICAL", "典型影像"), diff --git a/core/src/main/java/com/dite/znpt/enums/RepairStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/RepairStatusEnum.java new file mode 100644 index 0000000..2be9c6b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/RepairStatusEnum.java @@ -0,0 +1,51 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/27 20:55 + * @Description: + */ +@Getter +public enum RepairStatusEnum { + INCOMPLETE("INCOMPLETE","未维修"), + COMPLETED("COMPLETED","已维修"), + UNKNOWN("UNKNOWN","未知"); + + private final String code; + private final String desc; + + RepairStatusEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static RepairStatusEnum getByCode(String code){ + for (RepairStatusEnum e : RepairStatusEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + RepairStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(RepairStatusEnum.values().length); + for (RepairStatusEnum e : RepairStatusEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java b/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java index bce5487..4a9e2c9 100644 --- a/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java @@ -15,5 +15,6 @@ import java.util.List; */ public interface DefectMapper extends BaseMapper { List queryBySelective(DefectListReq defectReq); + DefectResp detail(String defectId); } diff --git a/core/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java index e850720..b29c40d 100644 --- a/core/src/main/java/com/dite/znpt/service/DefectService.java +++ b/core/src/main/java/com/dite/znpt/service/DefectService.java @@ -3,6 +3,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; import java.util.List; @@ -17,12 +18,14 @@ public interface DefectService extends IService { /** * 功能描述:查询缺陷记录列表 * - * @param defectReq 缺陷记录 + * @param req 缺陷记录 * @return {@link List }<{@link DefectEntity }> * @author huise23 * @date 2025/04/11 23:17 **/ - List selectList(DefectListReq defectReq); + List page(DefectListReq req); + + List list(DefectListReq req); /** * 功能描述:查询单条缺陷记录 @@ -32,25 +35,27 @@ public interface DefectService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - DefectResp selectById(String defectId); + DefectResp detail(String defectId); /** * 功能描述:新增缺陷记录 * - * @param defect 缺陷记录 + * @param imageId 缺陷记录 + * @param req 缺陷记录 * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(DefectEntity defect); + void save(String imageId, DefectReq req); /** * 功能描述:更新缺陷记录 * - * @param defect 缺陷记录 + * @param defectId 缺陷记录 + * @param req 缺陷记录 * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(DefectEntity defect); + void update(String defectId, DefectReq req); /** * 功能描述:删除缺陷记录 diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index e807ac8..ac08810 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -1,16 +1,26 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.enums.DefectSourceEnum; +import com.dite.znpt.enums.DefectTypeEnum; +import com.dite.znpt.enums.RepairStatusEnum; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.DefectService; import com.dite.znpt.mapper.DefectMapper; +import com.dite.znpt.service.ImageService; import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** @@ -21,22 +31,26 @@ import java.util.List; @Service @RequiredArgsConstructor public class DefectServiceImpl extends ServiceImpl implements DefectService { + @Resource + private ImageService imageService; /** * 功能描述:查询缺陷记录列表 * - * @param defectReq 缺陷记录信息 + * @param req 缺陷记录信息 * @return {@link List }<{@link DefectResp }> * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public List selectList(DefectListReq defectReq) { + public List page(DefectListReq req) { PageUtil.startPage(); - List defectList= this.baseMapper.queryBySelective(defectReq); - defectList.forEach(resp -> { - - }); + return this.list(req); + } + + @Override + public List list(DefectListReq req) { + List defectList= this.baseMapper.queryBySelective(req); return defectList; } @@ -49,37 +63,49 @@ public class DefectServiceImpl extends ServiceImpl i * @date 2025/04/11 23:17 **/ @Override - public DefectResp selectById(String defectId) { - DefectListReq defectReq = new DefectListReq(); - defectReq.setDefectId(defectId); - List list = selectList(defectReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new DefectResp(); + public DefectResp detail(String defectId) { + DefectResp defectResp = this.baseMapper.detail(defectId); + defectResp.setDefectTypeLabel(DefectTypeEnum.getDescByCode(defectResp.getDefectType())); + defectResp.setDefectLevel(DefectTypeEnum.getDescByCode(defectResp.getDefectLevel())); + defectResp.setRepairStatusLabel(RepairStatusEnum.getDescByCode(defectResp.getRepairStatus())); + defectResp.setSourceLabel(DefectSourceEnum.getDescByCode(defectResp.getSourceLabel())); + return defectResp; } /** * 功能描述:新增缺陷记录 * - * @param defect 缺陷记录 + * @param imageId + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void saveData(DefectEntity defect) { -// todo 校验 - save(defect); + public void save(String imageId, DefectReq req) { + if(null == imageService.getById(imageId)){ + throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); + } + DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); + this.save(defectEntity); } /** * 功能描述:更新缺陷记录 * - * @param defect 缺陷记录 + * @param defectId + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void updateData(DefectEntity defect) { -// todo 校验 - updateById(defect); + public void update(String defectId, DefectReq req) { + if(null == this.getById(defectId)){ + throw new ServiceException(Message.DEFECT_ID_IS_NOT_EXIST); + } + DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); + this.updateById(defectEntity); } /** @@ -89,10 +115,10 @@ public class DefectServiceImpl extends ServiceImpl i * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String defectId) { -// todo 校验 - removeById(defectId); + this.removeById(defectId); } } diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index ac4f67a..525b015 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -2,29 +2,35 @@ - - a.defect_id, a.turbine_id, a.part_id, a.defect_code, a.defect_name, a.defect_type, a.defect_level, a.defect_image_path, a.description - - + SELECT + d.defect_id, d.defect_name, d.defect_code, p.part_name, d.defect_position, d.description + FROM defect d + LEFT JOIN image i ON d.image_id = i.image_id + LEFT JOIN image_collect ic ON ic.collect_id = i.collect_id + LEFT JOIN part p ON ic.part_id = p.part_id -# and (a.defect_name like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.defect_code like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) +# AND (d.defect_name LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%') OR d.defect_code LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - and a.part_id = #{turbineCode} + + AND p.turbine_id = #{turbineId} - - and a.defect_type = #{defectType} + AND d.defect_type = #{defectType} - and a.defect_level = #{defectLevel} + AND d.defect_level = #{defectLevel} + diff --git a/core/src/main/resources/mapper/ImageCollectMapper.xml b/core/src/main/resources/mapper/ImageCollectMapper.xml index 5d3e173..8cc0c0d 100644 --- a/core/src/main/resources/mapper/ImageCollectMapper.xml +++ b/core/src/main/resources/mapper/ImageCollectMapper.xml @@ -2,15 +2,5 @@ - - a.collect_id, a.shooting_time_begin, a.shooting_time_end, a.weather, a.humidness, a.temperature_min, a.temperature_max, a.wind_level, a.shooting_method, - a.shooting_distance, a.collector_name, - - - diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 022d42d..231499c 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -13,6 +13,9 @@ AND i.image_name LIKE concat('%', #{keyword}, '%') + + AND p.turbine_id = #{turbineId} + AND i.image_type in #{imageType} diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 57c4ee5..6e15b6c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -3,6 +3,7 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.service.DefectService; @@ -30,35 +31,41 @@ public class DefectController { @Resource private DefectService defectService; - @ApiOperation(value = "获取缺陷记录列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(DefectListReq defectReq) { - return PageResult.ok(defectService.selectList(defectReq)); + @ApiOperation(value = "分页查询缺陷记录列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestBody DefectListReq req) { + return PageResult.ok(defectService.page(req)); } - @ApiOperation(value = "根据缺陷记录Id获取详细信息", httpMethod = "GET") - @GetMapping("/{defectId}") - public Result getInfo(@PathVariable String defectId) { - return Result.ok(defectService.selectById(defectId)); + @ApiOperation(value = "查询缺陷记录列表", httpMethod = "GET") + @GetMapping("/page") + public Result> list(@RequestBody DefectListReq req) { + return Result.ok(defectService.list(req)); + } + + @ApiOperation(value = "查询缺详细", httpMethod = "GET") + @GetMapping("/detail/{defectId}") + public Result detail(@PathVariable String defectId) { + return Result.ok(defectService.detail(defectId)); } @ApiOperation(value = "新增缺陷记录", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody DefectEntity defect) { - defectService.saveData(defect); + @PostMapping("/{imageId}") + public Result save(@PathVariable String imageId, @RequestBody DefectReq req) { + defectService.save(imageId, req); return Result.ok(); } @ApiOperation(value = "修改缺陷记录", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody DefectEntity defect) { - defectService.updateData(defect); + @PutMapping("/{defectId}") + public Result edit(@PathVariable String defectId, @RequestBody DefectReq req) { + defectService.update(defectId, req); return Result.ok(); } @ApiOperation(value = "删除缺陷记录", httpMethod = "DELETE") @DeleteMapping("/{defectId}") - public Result remove(@PathVariable String defectId) { + public Result remove(@PathVariable String defectId) { defectService.deleteById(defectId); return Result.ok(); } @@ -67,7 +74,7 @@ public class DefectController { @GetMapping("/export") @ResponseExcel(name = "缺陷记录") public List export(DefectListReq defectReq) { - return defectService.selectList(defectReq); + return defectService.page(defectReq); } @ApiOperation(value = "导入缺陷记录", httpMethod = "POST") From 42ae4dbb557c809111d183806940106cca0929f7 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 28 Apr 2025 09:37:43 +0800 Subject: [PATCH 023/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E3=80=81=E6=9C=BA?= =?UTF-8?q?=E7=BB=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/PersonnelEntity.java | 5 - .../domain/entity/ProjectCompanyEntity.java | 41 ------- .../znpt/domain/entity/ProjectEntity.java | 103 ++++++++++++++++-- .../znpt/domain/entity/TCompanyEntity.java | 51 --------- .../znpt/domain/entity/TurbineEntity.java | 8 ++ .../znpt/domain/vo/ProjectCompanyListReq.java | 33 ------ .../znpt/domain/vo/ProjectCompanyResp.java | 18 --- .../dite/znpt/domain/vo/TCompanyListReq.java | 39 ------- .../com/dite/znpt/domain/vo/TCompanyResp.java | 18 --- .../com/dite/znpt/domain/vo/TurbineResp.java | 43 ++++++++ .../znpt/mapper/ProjectCompanyMapper.java | 19 ---- .../com/dite/znpt/mapper/TCompanyMapper.java | 19 ---- .../znpt/service/ProjectCompanyService.java | 64 ----------- .../dite/znpt/service/TCompanyService.java | 64 ----------- .../impl/ProjectCompanyServiceImpl.java | 99 ----------------- .../service/impl/TCompanyServiceImpl.java | 99 ----------------- .../resources/mapper/ProjectCompanyMapper.xml | 29 ----- .../main/resources/mapper/TCompanyMapper.xml | 36 ------ web/pom.xml | 10 +- .../znpt/web/controller/PartController.java | 2 +- .../controller/ProjectCompanyController.java | 84 -------------- .../web/controller/TCompanyController.java | 84 -------------- .../web/controller/TurbineController.java | 4 +- 23 files changed, 156 insertions(+), 816 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/TCompanyService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java delete mode 100644 core/src/main/resources/mapper/ProjectCompanyMapper.xml delete mode 100644 core/src/main/resources/mapper/TCompanyMapper.xml delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java index 956a4ea..b1ac0d4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java @@ -38,11 +38,6 @@ public class PersonnelEntity extends AuditableEntity implements Serializable { @TableField("role_type") private String roleType; - @ExcelProperty("公司id") - @ApiModelProperty("公司id") - @TableField("company_id") - private String companyId; - @ExcelProperty("密码") @ApiModelProperty("密码") @TableField("password") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java deleted file mode 100644 index 6155e9e..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectCompanyEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dite.znpt.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("project_company") -@ApiModel(value="ProjectCompanyEntity对象", description="项目-公司关联信息表") -public class ProjectCompanyEntity extends AuditableEntity implements Serializable { - - private static final long serialVersionUID = -98876147355655939L; - - @ExcelProperty("项目id") - @ApiModelProperty("项目id") - @TableId(value = "project_id", type = IdType.ASSIGN_UUID) - private String projectId; - - @ExcelProperty("公司id") - @ApiModelProperty("公司id") - @TableField("company_id") - private String companyId; - - @ExcelProperty("单位类型(检查/委托)") - @ApiModelProperty("单位类型(检查/委托)") - @TableField("relation_type") - private String relationType; -} - diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 621e3d8..97d3eee 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -4,6 +4,7 @@ import java.io.Serializable; import com.baomidou.mybatisplus.annotation.*; import com.dite.znpt.domain.AuditableEntity; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -33,6 +34,10 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("project_name") private String projectName; + @ApiModelProperty("项目封面") + @TableField("cover_url") + private String coverUrl; + @ExcelProperty("风场名称") @ApiModelProperty("风场名称") @TableField("farm_name") @@ -43,10 +48,29 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("farm_address") private String farmAddress; - @ExcelProperty("检查方式,字典method_id") - @ApiModelProperty("检查方式,字典method_id") - @TableField("method_id") - private String methodId; + @ApiModelProperty("委托单位") + @TableField("client") + private String client; + + @ApiModelProperty("委托单位联系人") + @TableField("client_contact") + private String clientContact; + + @ApiModelProperty("委托单位联系电话") + @TableField("client_phone") + private String clientPhone; + + @ApiModelProperty("检查单位") + @TableField("inspection_unit") + private String inspectionUnit; + + @ApiModelProperty("检查单位联系人") + @TableField("inspection_contact") + private String inspectionContact; + + @ApiModelProperty("检查单位联系电话") + @TableField("inspection_phone") + private String inspectionPhone; @ExcelProperty("项目规模") @ApiModelProperty("项目规模") @@ -58,9 +82,74 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("turbine_model") private String turbineModel; - @ExcelProperty("项目状态,字典project_status") - @ApiModelProperty("项目状态,字典project_status") + @ApiModelProperty("施工人员") + @TableField("construction_personnel") + private String constructionPersonnel; + + @ApiModelProperty("施工人员id") + @TableField("construction_personnel_id") + private String constructionPersonnelId; + + @ApiModelProperty("安全员id") + @TableField("auditor_id") + private String auditorId; + + @ApiModelProperty("质量员id") + @TableField("quality_officer_id") + private String qualityOfficerId; + + @ApiModelProperty("项目经理id") + @TableField("project_manager_id") + private String projectManagerId; + + @ApiModelProperty("施工组长id") + @TableField("construction_team_leader_id") + private String constructionTeamLeaderId; + + @ApiModelProperty("技术方案图片,多个用逗号隔开") + @JsonIgnore + @TableField("technical_image") + private String technicalImage; + + @ApiModelProperty("技术方案内容") + @TableField("technical_content") + private String technicalContent; + + @ApiModelProperty("安全措施图片,多个用逗号隔开") + @JsonIgnore + @TableField("safety_image") + private String safetyImage; + + @ApiModelProperty("安全措施内容") + @TableField("safety_content") + private String safetyContent; + + @ApiModelProperty("交底内容") + @TableField("disclose_content") + private String discloseContent; + + @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") @TableField("status") - private String status; + private Integer status; + + @ApiModelProperty("项目工作类型 可能有多项,逗号分隔") + @TableField("work_type") + private String workType; + + @ApiModelProperty("项目工作岗位 可能有多项,json对象保存") + @TableField("job") + private String job; + + @ApiModelProperty(value = "项目工作类型 可能有多项,逗号分隔", example = "1", notes = "项目工作类型 可能有多项,逗号分隔") + @TableField("work_type") + private String workType; + + @ApiModelProperty(value = "项目工作岗位 可能有多项,逗号分隔", example = "1", notes = "项目工作岗位 可能有多项,逗号分隔") + @TableField("job") + private String job; + + @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") + @TableField("safety_risk_point") + private String safetyRiskPoint; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java deleted file mode 100644 index fac6d37..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TCompanyEntity.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.dite.znpt.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("t_company") -@ApiModel(value="TCompanyEntity对象", description="公司信息表") -public class TCompanyEntity extends AuditableEntity implements Serializable { - - private static final long serialVersionUID = 348031306551320799L; - - @ExcelProperty("公司id") - @ApiModelProperty("公司id") - @TableId(value = "company_id", type = IdType.ASSIGN_UUID) - private String companyId; - - @ExcelProperty("公司名称") - @ApiModelProperty("公司名称") - @TableField("company_name") - private String companyName; - - @ExcelProperty("公司地址") - @ApiModelProperty("公司地址") - @TableField("address") - private String address; - - @ExcelProperty("联系人") - @ApiModelProperty("联系人") - @TableField("contact") - private String contact; - - @ExcelProperty("电话") - @ApiModelProperty("电话") - @TableField("phone") - private String phone; -} - diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index a308925..2be3ef6 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -52,5 +52,13 @@ public class TurbineEntity extends AuditableEntity implements Serializable { @ApiModelProperty("机组型号") @TableField("model") private String model; + + @ApiModelProperty("封面图") + @TableField("cover_url") + private String coverUrl; + + @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") + @TableField("status") + private Integer status; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java deleted file mode 100644 index 315760e..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyListReq.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dite.znpt.domain.vo; - -import java.io.Serializable; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息请求实体 - */ -@Data -@ApiModel("项目-公司关联信息列表请求实体") -public class ProjectCompanyListReq implements Serializable { - - private static final long serialVersionUID = 598388421634125600L; - - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("项目-公司关联信息Id") - private String projectId; - - @ApiModelProperty("公司id") - private String companyId; - - @ApiModelProperty("单位类型(检查/委托)") - private String relationType; - -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java deleted file mode 100644 index 5acb104..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectCompanyResp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.ProjectCompanyEntity; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息响应实体 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("项目-公司关联信息响应实体") -public class ProjectCompanyResp extends ProjectCompanyEntity { -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java deleted file mode 100644 index d8fbd73..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TCompanyListReq.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dite.znpt.domain.vo; - -import java.io.Serializable; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息请求实体 - */ -@Data -@ApiModel("公司信息列表请求实体") -public class TCompanyListReq implements Serializable { - - private static final long serialVersionUID = 710069618133737043L; - - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("公司信息Id") - private String companyId; - - @ApiModelProperty("公司名称") - private String companyName; - - @ApiModelProperty("公司地址") - private String address; - - @ApiModelProperty("联系人") - private String contact; - - @ApiModelProperty("电话") - private String phone; - -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java deleted file mode 100644 index 77735d0..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TCompanyResp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.TCompanyEntity; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息响应实体 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("公司信息响应实体") -public class TCompanyResp extends TCompanyEntity { -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java index 2d9e8d4..ebc5c48 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java @@ -1,10 +1,14 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.domain.entity.PartEntity; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import com.dite.znpt.domain.entity.TurbineEntity; +import java.util.List; + /** * @author huise23 * @date 2025/04/11 23:17 @@ -14,5 +18,44 @@ import com.dite.znpt.domain.entity.TurbineEntity; @EqualsAndHashCode(callSuper = true) @ApiModel("机组-项目关联响应实体") public class TurbineResp extends TurbineEntity { + + @ApiModelProperty("部件") + private List partsList; + + @ApiModelProperty("内部工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") + private String antiThunderWorkStatus; + + @ApiModelProperty("外部工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") + private String inWorkStatus; + + @ApiModelProperty("防雷工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") + private String outWorkStatus; + + @ApiModelProperty("数据报告工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") + private String summaryWorkStatus; + + @ApiModelProperty("内部工作安全员审核状态, -1不存在,0未审核、1审核通过") + private String antiThunderWorkSafetyStatus; + + @ApiModelProperty("外部工作安全员审核状态, -1不存在,0未审核、1审核通过") + private String inWorkSafetyStatus; + + @ApiModelProperty("防雷工作安全员审核状态, -1不存在,0未审核、1审核通过") + private String outWorkSafetyStatus; + + @ApiModelProperty("内部工作质量员审核状态, -1不存在,0未审核、1审核通过") + private String antiThunderWorkQualityStatus; + + @ApiModelProperty("外部工作质量员审核状态, -1不存在,0未审核、1审核通过") + private String inWorkQualityStatus; + + @ApiModelProperty("防雷工作质量员审核状态, -1不存在,0未审核、1审核通过") + private String outWorkQualityStatus; + + @ApiModelProperty("防雷是否不合格,1不合格,0合格") + private Boolean lightningUnqualified; + + @ApiModelProperty("来源, app,backend后台,不传参默认后台") + private String source; } diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java deleted file mode 100644 index bbbab25..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/ProjectCompanyMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.ProjectCompanyEntity; -import com.dite.znpt.domain.vo.ProjectCompanyListReq; -import com.dite.znpt.domain.vo.ProjectCompanyResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息表数据库访问层 - */ -public interface ProjectCompanyMapper extends BaseMapper { - List queryBySelective(ProjectCompanyListReq projectCompanyReq); -} - diff --git a/core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java b/core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java deleted file mode 100644 index a1fd45f..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TCompanyMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TCompanyEntity; -import com.dite.znpt.domain.vo.TCompanyListReq; -import com.dite.znpt.domain.vo.TCompanyResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息表数据库访问层 - */ -public interface TCompanyMapper extends BaseMapper { - List queryBySelective(TCompanyListReq tCompanyReq); -} - diff --git a/core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java b/core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java deleted file mode 100644 index f6b0754..0000000 --- a/core/src/main/java/com/dite/znpt/service/ProjectCompanyService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.ProjectCompanyEntity; -import com.dite.znpt.domain.vo.ProjectCompanyListReq; -import com.dite.znpt.domain.vo.ProjectCompanyResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息表服务接口 - */ -public interface ProjectCompanyService extends IService { - - /** - * 功能描述:查询项目-公司关联信息列表 - * - * @param projectCompanyReq 项目-公司关联信息 - * @return {@link List }<{@link ProjectCompanyEntity }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - List selectList(ProjectCompanyListReq projectCompanyReq); - - /** - * 功能描述:查询单条项目-公司关联信息 - * - * @param projectId 项目-公司关联信息Id - * @return {@link ProjectCompanyResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - ProjectCompanyResp selectById(String projectId); - - /** - * 功能描述:新增项目-公司关联信息 - * - * @param projectCompany 项目-公司关联信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void saveData(ProjectCompanyEntity projectCompany); - - /** - * 功能描述:更新项目-公司关联信息 - * - * @param projectCompany 项目-公司关联信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void updateData(ProjectCompanyEntity projectCompany); - - /** - * 功能描述:删除项目-公司关联信息 - * - * @param projectId 项目-公司关联信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void deleteById(String projectId); -} - diff --git a/core/src/main/java/com/dite/znpt/service/TCompanyService.java b/core/src/main/java/com/dite/znpt/service/TCompanyService.java deleted file mode 100644 index 99bba5c..0000000 --- a/core/src/main/java/com/dite/znpt/service/TCompanyService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.TCompanyEntity; -import com.dite.znpt.domain.vo.TCompanyListReq; -import com.dite.znpt.domain.vo.TCompanyResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息表服务接口 - */ -public interface TCompanyService extends IService { - - /** - * 功能描述:查询公司信息列表 - * - * @param tCompanyReq 公司信息 - * @return {@link List }<{@link TCompanyEntity }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - List selectList(TCompanyListReq tCompanyReq); - - /** - * 功能描述:查询单条公司信息 - * - * @param companyId 公司信息Id - * @return {@link TCompanyResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - TCompanyResp selectById(String companyId); - - /** - * 功能描述:新增公司信息 - * - * @param tCompany 公司信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void saveData(TCompanyEntity tCompany); - - /** - * 功能描述:更新公司信息 - * - * @param tCompany 公司信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void updateData(TCompanyEntity tCompany); - - /** - * 功能描述:删除公司信息 - * - * @param companyId 公司信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void deleteById(String companyId); -} - diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java deleted file mode 100644 index 67cacd8..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectCompanyServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.ProjectCompanyEntity; -import com.dite.znpt.domain.vo.ProjectCompanyListReq; -import com.dite.znpt.domain.vo.ProjectCompanyResp; -import com.dite.znpt.service.ProjectCompanyService; -import com.dite.znpt.mapper.ProjectCompanyMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 项目-公司关联信息表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class ProjectCompanyServiceImpl extends ServiceImpl implements ProjectCompanyService { - - /** - * 功能描述:查询项目-公司关联信息列表 - * - * @param projectCompanyReq 项目-公司关联信息信息 - * @return {@link List }<{@link ProjectCompanyResp }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public List selectList(ProjectCompanyListReq projectCompanyReq) { - PageUtil.startPage(); - List projectCompanyList= this.baseMapper.queryBySelective(projectCompanyReq); - projectCompanyList.forEach(resp -> { - - }); - return projectCompanyList; - } - - /** - * 功能描述:查询单条项目-公司关联信息 - * - * @param projectId 项目-公司关联信息Id - * @return {@link ProjectCompanyResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public ProjectCompanyResp selectById(String projectId) { - ProjectCompanyListReq projectCompanyReq = new ProjectCompanyListReq(); - projectCompanyReq.setProjectId(projectId); - - List list = selectList(projectCompanyReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectCompanyResp(); - } - - /** - * 功能描述:新增项目-公司关联信息 - * - * @param projectCompany 项目-公司关联信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void saveData(ProjectCompanyEntity projectCompany) { -// todo 校验 - save(projectCompany); - } - - /** - * 功能描述:更新项目-公司关联信息 - * - * @param projectCompany 项目-公司关联信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void updateData(ProjectCompanyEntity projectCompany) { -// todo 校验 - updateById(projectCompany); - } - - /** - * 功能描述:删除项目-公司关联信息 - * - * @param projectId 项目-公司关联信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void deleteById(String projectId) { -// todo 校验 - removeById(projectId); - } - -} diff --git a/core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java deleted file mode 100644 index 4e368e2..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/TCompanyServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.TCompanyEntity; -import com.dite.znpt.domain.vo.TCompanyListReq; -import com.dite.znpt.domain.vo.TCompanyResp; -import com.dite.znpt.service.TCompanyService; -import com.dite.znpt.mapper.TCompanyMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 公司信息表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class TCompanyServiceImpl extends ServiceImpl implements TCompanyService { - - /** - * 功能描述:查询公司信息列表 - * - * @param tCompanyReq 公司信息信息 - * @return {@link List }<{@link TCompanyResp }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public List selectList(TCompanyListReq tCompanyReq) { - PageUtil.startPage(); - List tCompanyList= this.baseMapper.queryBySelective(tCompanyReq); - tCompanyList.forEach(resp -> { - - }); - return tCompanyList; - } - - /** - * 功能描述:查询单条公司信息 - * - * @param companyId 公司信息Id - * @return {@link TCompanyResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public TCompanyResp selectById(String companyId) { - TCompanyListReq tCompanyReq = new TCompanyListReq(); - tCompanyReq.setCompanyId(companyId); - - List list = selectList(tCompanyReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new TCompanyResp(); - } - - /** - * 功能描述:新增公司信息 - * - * @param tCompany 公司信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void saveData(TCompanyEntity tCompany) { -// todo 校验 - save(tCompany); - } - - /** - * 功能描述:更新公司信息 - * - * @param tCompany 公司信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void updateData(TCompanyEntity tCompany) { -// todo 校验 - updateById(tCompany); - } - - /** - * 功能描述:删除公司信息 - * - * @param companyId 公司信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void deleteById(String companyId) { -// todo 校验 - removeById(companyId); - } - -} diff --git a/core/src/main/resources/mapper/ProjectCompanyMapper.xml b/core/src/main/resources/mapper/ProjectCompanyMapper.xml deleted file mode 100644 index c1b6531..0000000 --- a/core/src/main/resources/mapper/ProjectCompanyMapper.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - a.project_id, a.company_id, a.relation_type - - - - - diff --git a/core/src/main/resources/mapper/TCompanyMapper.xml b/core/src/main/resources/mapper/TCompanyMapper.xml deleted file mode 100644 index 82f9437..0000000 --- a/core/src/main/resources/mapper/TCompanyMapper.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - a.company_id, a.company_name, a.address, a.contact, - a.phone - - - - - diff --git a/web/pom.xml b/web/pom.xml index 38137db..f10802f 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -29,10 +29,10 @@ core 1.0.0-SNAPSHOT - - com.dite.znpt - data-bus - 1.0.0-SNAPSHOT - + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/PartController.java b/web/src/main/java/com/dite/znpt/web/controller/PartController.java index 03c77c0..f46d8a0 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PartController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PartController.java @@ -23,7 +23,7 @@ import java.util.List; * @author huise23 * @date 2025/04/11 23:17 */ -@Api(tags = "") +@Api(tags = "部件信息") @RestController @RequestMapping("/part") public class PartController { diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java deleted file mode 100644 index 1cbbc4e..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectCompanyController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.ProjectCompanyListReq; -import com.dite.znpt.domain.vo.ProjectCompanyResp; -import com.dite.znpt.domain.entity.ProjectCompanyEntity; -import com.dite.znpt.service.ProjectCompanyService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "项目-公司关联信息") -@RestController -@RequestMapping("/project-company") -public class ProjectCompanyController { - @Resource - private ProjectCompanyService projectCompanyService; - - @ApiOperation(value = "获取项目-公司关联信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(ProjectCompanyListReq projectCompanyReq) { - return PageResult.ok(projectCompanyService.selectList(projectCompanyReq)); - } - - @ApiOperation(value = "根据项目-公司关联信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{projectId}") - public Result getInfo(@PathVariable String projectId) { - return Result.ok(projectCompanyService.selectById(projectId)); - } - - @ApiOperation(value = "新增项目-公司关联信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody ProjectCompanyEntity projectCompany) { - projectCompanyService.saveData(projectCompany); - return Result.ok(); - } - - @ApiOperation(value = "修改项目-公司关联信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody ProjectCompanyEntity projectCompany) { - projectCompanyService.updateData(projectCompany); - return Result.ok(); - } - - @ApiOperation(value = "删除项目-公司关联信息", httpMethod = "DELETE") - @DeleteMapping("/{projectId}") - public Result remove(@PathVariable String projectId) { - projectCompanyService.deleteById(projectId); - return Result.ok(); - } - - @ApiOperation(value = "导出项目-公司关联信息", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "项目-公司关联信息") - public List export(ProjectCompanyListReq projectCompanyReq) { - return projectCompanyService.selectList(projectCompanyReq); - } - - @ApiOperation(value = "导入项目-公司关联信息", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - diff --git a/web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java b/web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java deleted file mode 100644 index b2f89af..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/TCompanyController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.TCompanyListReq; -import com.dite.znpt.domain.vo.TCompanyResp; -import com.dite.znpt.domain.entity.TCompanyEntity; -import com.dite.znpt.service.TCompanyService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "公司信息") -@RestController -@RequestMapping("/t-company") -public class TCompanyController { - @Resource - private TCompanyService tCompanyService; - - @ApiOperation(value = "获取公司信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(TCompanyListReq tCompanyReq) { - return PageResult.ok(tCompanyService.selectList(tCompanyReq)); - } - - @ApiOperation(value = "根据公司信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{companyId}") - public Result getInfo(@PathVariable String companyId) { - return Result.ok(tCompanyService.selectById(companyId)); - } - - @ApiOperation(value = "新增公司信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody TCompanyEntity tCompany) { - tCompanyService.saveData(tCompany); - return Result.ok(); - } - - @ApiOperation(value = "修改公司信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody TCompanyEntity tCompany) { - tCompanyService.updateData(tCompany); - return Result.ok(); - } - - @ApiOperation(value = "删除公司信息", httpMethod = "DELETE") - @DeleteMapping("/{companyId}") - public Result remove(@PathVariable String companyId) { - tCompanyService.deleteById(companyId); - return Result.ok(); - } - - @ApiOperation(value = "导出公司信息", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "公司信息") - public List export(TCompanyListReq tCompanyReq) { - return tCompanyService.selectList(tCompanyReq); - } - - @ApiOperation(value = "导入公司信息", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - diff --git a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java index b35f20f..2b970bd 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java @@ -5,6 +5,7 @@ import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.TurbineListReq; import com.dite.znpt.domain.vo.TurbineResp; import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.TurbineService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; @@ -17,6 +18,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; /** @@ -31,7 +33,7 @@ public class TurbineController { private TurbineService turbineService; @ApiOperation(value = "获取机组-项目关联列表", httpMethod = "GET") - @GetMapping("/list") + @GetMapping({"/list", "/getByProjectId"}) public PageResult list(TurbineListReq turbineReq) { return PageResult.ok(turbineService.selectList(turbineReq)); } From e7bb22e1265703d884f50313f8a1f2a8b1aa248f Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 29 Apr 2025 23:38:35 +0800 Subject: [PATCH 024/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=AA=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/ProjectEntity.java | 8 -- .../dite/znpt/domain/vo/ProjectListReq.java | 27 +++-- .../dite/znpt/domain/vo/ProjectListResp.java | 88 +++++++++++++++ .../com/dite/znpt/domain/vo/ProjectReq.java | 102 ++++++++++++++++++ .../com/dite/znpt/domain/vo/ProjectResp.java | 18 +++- .../dite/znpt/enums/ProjectStatusEnum.java | 52 +++++++++ .../dite/znpt/enums/ProjectWorkJobEnum.java | 66 ++++++++++++ .../dite/znpt/enums/ProjectWorkTypeEnum.java | 51 +++++++++ .../com/dite/znpt/service/ProjectService.java | 16 +-- .../znpt/service/impl/ProjectServiceImpl.java | 39 ++++--- .../znpt/web/controller/CommonController.java | 79 ++++++++++++++ .../web/controller/ProjectController.java | 30 +++--- 12 files changed, 519 insertions(+), 57 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectWorkJobEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectWorkTypeEnum.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/CommonController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 97d3eee..fd346ad 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -140,14 +140,6 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("job") private String job; - @ApiModelProperty(value = "项目工作类型 可能有多项,逗号分隔", example = "1", notes = "项目工作类型 可能有多项,逗号分隔") - @TableField("work_type") - private String workType; - - @ApiModelProperty(value = "项目工作岗位 可能有多项,逗号分隔", example = "1", notes = "项目工作岗位 可能有多项,逗号分隔") - @TableField("job") - private String job; - @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") @TableField("safety_risk_point") private String safetyRiskPoint; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java index 1802c44..6f7343c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -1,11 +1,13 @@ package com.dite.znpt.domain.vo; -import java.io.Serializable; - +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; +import java.time.LocalDate; + /** * @author huise23 * @date 2025/04/11 23:17 @@ -20,9 +22,6 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("查询关键字") private String keyword; - @ApiModelProperty("项目信息Id") - private String projectId; - @ApiModelProperty("项目名称") private String projectName; @@ -32,17 +31,17 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("风场地址") private String farmAddress; - @ApiModelProperty("检查方式,字典method_id") - private String methodId; + @ApiModelProperty("委托单位") + private String client; - @ApiModelProperty("项目规模") - private String scale; - - @ApiModelProperty("风机型号") - private String turbineModel; - - @ApiModelProperty("项目状态,字典project_status") + @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") private String status; + @ApiModelProperty("创建日期-起") + private LocalDate createDateBegin; + + @ApiModelProperty("创建日期-讫") + private LocalDate createDateEnd; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java new file mode 100644 index 0000000..a1e763f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java @@ -0,0 +1,88 @@ +package com.dite.znpt.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 21:27 + * @Description: + */ +@Data +@ApiModel("项目信息列表响应实体") +public class ProjectListResp implements Serializable { + @Serial + private static final long serialVersionUID = 2638755916020263971L; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") + private String status; + + @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") + private String statusLabel; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("委托单位") + private String client; + + @ApiModelProperty("委托单位联系人") + private String clientContact; + + @ApiModelProperty("委托单位联系电话") + private String clientPhone; + + @ApiModelProperty("检查单位") + private String inspectionUnit; + + @ApiModelProperty("检查单位联系人") + private String inspectionContact; + + @ApiModelProperty("检查单位联系电话") + private String inspectionPhone; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("项目经理id") + private String projectManagerId; + + @ApiModelProperty("项目经理") + private String projectManagerName; + + @ApiModelProperty("施工人员id") + private String constructionPersonnelId; + + @ApiModelProperty("施工人员") + private String constructionPersonnelName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java new file mode 100644 index 0000000..67a517f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -0,0 +1,102 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 21:28 + * @Description: + */ +@Data +@ApiModel("项目信息请求实体") +public class ProjectReq implements Serializable { + + @Serial + private static final long serialVersionUID = 740685592879189406L; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("委托单位") + private String client; + + @ApiModelProperty("委托单位联系人") + private String clientContact; + + @ApiModelProperty("委托单位联系电话") + private String clientPhone; + + @ApiModelProperty("检查单位") + private String inspectionUnit; + + @ApiModelProperty("检查单位联系人") + private String inspectionContact; + + @ApiModelProperty("检查单位联系电话") + private String inspectionPhone; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("施工人员") + private String constructionPersonnel; + + @ApiModelProperty("施工人员id") + private String constructionPersonnelId; + + @ApiModelProperty("安全员id") + private String auditorId; + + @ApiModelProperty("质量员id") + private String qualityOfficerId; + + @ApiModelProperty("项目经理id") + private String projectManagerId; + + @ApiModelProperty("施工组长id") + private String constructionTeamLeaderId; + + @ApiModelProperty("技术方案图片,多个用逗号隔开") + private String technicalImage; + + @ApiModelProperty("技术方案内容") + private String technicalContent; + + @ApiModelProperty("安全措施图片,多个用逗号隔开") + private String safetyImage; + + @ApiModelProperty("安全措施内容") + private String safetyContent; + + @ApiModelProperty("交底内容") + private String discloseContent; + + @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") + private Integer status; + + @ApiModelProperty("项目工作类型 可能有多项,逗号分隔") + private String workType; + + @ApiModelProperty("项目工作岗位 可能有多项,json对象保存") + private String job; + + @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") + private String safetyRiskPoint; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java index e09d322..eff73b7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java @@ -1,18 +1,32 @@ package com.dite.znpt.domain.vo; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import com.dite.znpt.domain.entity.ProjectEntity; +import java.io.Serial; +import java.io.Serializable; + /** * @author huise23 * @date 2025/04/11 23:17 * @Description: 项目信息响应实体 */ @Data -@EqualsAndHashCode(callSuper = true) @ApiModel("项目信息响应实体") -public class ProjectResp extends ProjectEntity { +public class ProjectResp extends ProjectReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1883901559600186726L; + + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java new file mode 100644 index 0000000..58ab7bb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java @@ -0,0 +1,52 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 21:32 + * @Description: + */ +@Getter +public enum ProjectStatusEnum { + PENDING("PENDING","待施工"), + IN_PROGRESS("IN_PROGRESS","施工中"), + COMPLETED("COMPLETED","已完工"), + AUDITED("AUDITED","已审核"), + ACCEPTED("ACCEPTED","已验收"); + private final String code; + private final String desc; + + ProjectStatusEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static ProjectStatusEnum getByCode(String code){ + for (ProjectStatusEnum e : ProjectStatusEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectStatusEnum.values().length); + for (ProjectStatusEnum e : ProjectStatusEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectWorkJobEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectWorkJobEnum.java new file mode 100644 index 0000000..4ed5b1a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectWorkJobEnum.java @@ -0,0 +1,66 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 22:34 + * @Description: + */ +@Getter +public enum ProjectWorkJobEnum { + OUT_WORK_DRONE_FLYER("out-work__drone-flyer", "飞手", ProjectWorkTypeEnum.OUT_WORK), + OUT_WORK_FLYAID("out-work__flyaid", "飞助", ProjectWorkTypeEnum.OUT_WORK), + OUT_WORK_ASCEND_HEIGHT("out-work__ascend-height", "登高", ProjectWorkTypeEnum.OUT_WORK), + OUT_WORK_DRIVER("out-work__driver", "司机", ProjectWorkTypeEnum.OUT_WORK), + OUT_WORK_GROUND_SERVICE("out-work__ground-service", "地勤", ProjectWorkTypeEnum.OUT_WORK), + IN_WORK_ASCEND_HEIGHT("in-work__ascend-height", "登高", ProjectWorkTypeEnum.IN_WORK), + IN_WORK_DRIVER("in-work__driver", "司机", ProjectWorkTypeEnum.IN_WORK), + IN_WORK_GROUND_SERVICE("in-work__ground-service", "地勤", ProjectWorkTypeEnum.IN_WORK), + LIGHTNING_PROTECTING_WORK_METER_READING("lightning-protection-work__meter_reading","抄表",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK), + LIGHTNING_PROTECTING_WORK_UNMAN_OPERATION("lightning-protection-work__unman_operation","无人化装备操作",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK), + LIGHTNING_PROTECTING_WORK_UNMAN_ANTI_THUNDER("lightning-protection-work__unman_anti_thunder","无人机防雷",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK), + LIGHTNING_PROTECTING_WORK_GROUND_SERVICE("lightning-protection-work__ascend-height","登高",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK), + LIGHTNING_PROTECTING_WORK_DRIVER("lightning-protection-work__driver","司机",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK), + LIGHTNING_PROTECTING_SERVICE("lightning-protection-work__ground_service","地勤",ProjectWorkTypeEnum.LIGHTNING_PROTECTING_WORK); + + private String code; + private String desc; + private ProjectWorkTypeEnum projectWorkType; + + private ProjectWorkJobEnum(String code, String desc, ProjectWorkTypeEnum projectWorkType){ + this.code = code; + this.desc = desc; + this.projectWorkType = projectWorkType; + } + + public static ProjectWorkJobEnum getByCode(String code){ + for (ProjectWorkJobEnum e : ProjectWorkJobEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectWorkJobEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listByWorkType(String workType){ + List list = new ArrayList<>(ProjectWorkJobEnum.values().length); + for (ProjectWorkJobEnum e : ProjectWorkJobEnum.values() ) { + if(workType.equals(e.projectWorkType.getCode())){ + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectWorkTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectWorkTypeEnum.java new file mode 100644 index 0000000..013aa96 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectWorkTypeEnum.java @@ -0,0 +1,51 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 22:27 + * @Description: + */ +@Getter +public enum ProjectWorkTypeEnum { + LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作"), + OUT_WORK("out-work", "外部工作"), + SUMMARY_WORK("summary-report", "汇总报告"), + IN_WORK("in-work", "内部工作"); + private final String code; + private final String desc; + + ProjectWorkTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static ProjectWorkTypeEnum getByCode(String code){ + for (ProjectWorkTypeEnum e : ProjectWorkTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectWorkTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectWorkTypeEnum.values().length); + for (ProjectWorkTypeEnum e : ProjectWorkTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/service/ProjectService.java b/core/src/main/java/com/dite/znpt/service/ProjectService.java index ef5e305..2227e32 100644 --- a/core/src/main/java/com/dite/znpt/service/ProjectService.java +++ b/core/src/main/java/com/dite/znpt/service/ProjectService.java @@ -3,6 +3,8 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectListResp; +import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectResp; import java.util.List; @@ -22,7 +24,8 @@ public interface ProjectService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List selectList(ProjectListReq projectReq); + List page(ProjectListReq projectReq); + List list(ProjectListReq projectReq); /** * 功能描述:查询单条项目信息 @@ -32,25 +35,26 @@ public interface ProjectService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - ProjectResp selectById(String projectId); + ProjectResp detail(String projectId); /** * 功能描述:新增项目信息 * - * @param project 项目信息 + * @param req 项目信息 * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(ProjectEntity project); + void save(ProjectReq req); /** * 功能描述:更新项目信息 * - * @param project 项目信息 + * @param projectId 项目id + * @param req 项目信息 * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(ProjectEntity project); + void update(String projectId, ProjectReq req); /** * 功能描述:删除项目信息 diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java index 2a8d42f..baacd13 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -3,6 +3,8 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectListResp; +import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectResp; import com.dite.znpt.service.ProjectService; import com.dite.znpt.mapper.ProjectMapper; @@ -10,6 +12,7 @@ import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -31,13 +34,22 @@ public class ProjectServiceImpl extends ServiceImpl selectList(ProjectListReq projectReq) { + public List page(ProjectListReq projectReq) { PageUtil.startPage(); List projectList= this.baseMapper.queryBySelective(projectReq); projectList.forEach(resp -> { }); - return projectList; + return null; + } + + @Override + public List list(ProjectListReq projectReq) { + List projectList= this.baseMapper.queryBySelective(projectReq); + projectList.forEach(resp -> { + + }); + return null; } /** @@ -49,38 +61,38 @@ public class ProjectServiceImpl extends ServiceImpl list = selectList(projectReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectResp(); + return null; } /** * 功能描述:新增项目信息 * - * @param project 项目信息 + * @param req 项目信息 * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void saveData(ProjectEntity project) { + public void save(ProjectReq req) { // todo 校验 - save(project); + } /** * 功能描述:更新项目信息 * - * @param project 项目信息 + * @param projectId 项目信息 + * @param req 项目信息 * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void updateData(ProjectEntity project) { + public void update(String projectId, ProjectReq req) { // todo 校验 - updateById(project); + } /** @@ -90,6 +102,7 @@ public class ProjectServiceImpl extends ServiceImpl list(ProjectListReq projectReq) { - return PageResult.ok(projectService.selectList(projectReq)); + @GetMapping("/page") + public PageResult page(@RequestBody ProjectListReq req) { + return PageResult.ok(projectService.page(req)); } - @ApiOperation(value = "根据项目信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{projectId}") - public Result getInfo(@PathVariable String projectId) { - return Result.ok(projectService.selectById(projectId)); + @ApiOperation(value = "查询项目信息详细信息", httpMethod = "GET") + @GetMapping("/detail/{projectId}") + public Result detail(@PathVariable String projectId) { + return Result.ok(projectService.detail(projectId)); } @ApiOperation(value = "新增项目信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody ProjectEntity project) { - projectService.saveData(project); + public Result add(@RequestBody ProjectReq req) { + projectService.save(req); return Result.ok(); } @ApiOperation(value = "修改项目信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody ProjectEntity project) { - projectService.updateData(project); + @PutMapping("/{projectId}") + public Result edit(@PathVariable String projectId, @RequestBody ProjectReq req) { + projectService.update(projectId, req); return Result.ok(); } @@ -66,8 +68,8 @@ public class ProjectController { @ApiOperation(value = "导出项目信息", httpMethod = "GET") @GetMapping("/export") @ResponseExcel(name = "项目信息") - public List export(ProjectListReq projectReq) { - return projectService.selectList(projectReq); + public List export(ProjectListReq req) { + return null; } @ApiOperation(value = "导入项目信息", httpMethod = "POST") From 061ed776f180aa3b17a8555fa2e9a5b2e345c159 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 30 Apr 2025 17:29:42 +0800 Subject: [PATCH 025/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E3=80=81=E6=9C=BA?= =?UTF-8?q?=E7=BB=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/dto/OutWorkDefectDTO.java | 34 +++ .../dite/znpt/domain/entity/DefectEntity.java | 14 +- .../domain/entity/OutWorkDefectEntity.java | 46 ++++ .../znpt/domain/entity/ProjectEntity.java | 4 - .../znpt/domain/entity/job/DefectDTO.java | 58 ++++ .../znpt/domain/entity/job/JobOutWork.java | 8 +- .../dite/znpt/mapper/OutWorkDefectMapper.java | 13 + .../znpt/service/OutWorkDefectService.java | 13 + .../impl/OutWorkDefectServiceImpl.java | 18 ++ .../znpt/service/job/JobOutWorkService.java | 3 +- .../impl/JobAntiThunderWorkServiceImpl.java | 6 +- .../job/impl/JobInWorkServiceImpl.java | 6 +- .../job/impl/JobOutWorkServiceImpl.java | 256 ++++++++++-------- .../job/impl/JobSummaryWorkServiceImpl.java | 67 ++--- .../resources/mapper/OutWorkDefectMapper.xml | 9 + .../media/zlm/impl/ZlmServiceImpl.java | 2 +- .../web/controller/JobOutWorkController.java | 9 +- 17 files changed, 396 insertions(+), 170 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/OutWorkDefectDTO.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/OutWorkDefectEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/job/DefectDTO.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/OutWorkDefectMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/OutWorkDefectService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/OutWorkDefectServiceImpl.java create mode 100644 core/src/main/resources/mapper/OutWorkDefectMapper.xml diff --git a/core/src/main/java/com/dite/znpt/domain/dto/OutWorkDefectDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/OutWorkDefectDTO.java new file mode 100644 index 0000000..c4bfd9f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/OutWorkDefectDTO.java @@ -0,0 +1,34 @@ +package com.dite.znpt.domain.dto; + +import com.dite.znpt.annotations.MatchType; +import com.dite.znpt.annotations.QueryCondition; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.domain.entity.OutWorkDefectEntity; +import com.dite.znpt.domain.entity.job.DefectDTO; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class OutWorkDefectDTO extends OutWorkDefectEntity { + + @ApiModelProperty(value = "部件编号", example = "GG1", notes = "部件编号") + @QueryCondition(func = MatchType.like) + private String code; + + @ApiModelProperty("图片地址") + @QueryCondition(func = MatchType.like) + @JsonIgnore + private String urls; + + @ApiModelProperty("是否有缺陷:1有,0无") + @QueryCondition(func = MatchType.equal) + private Integer status; + + @ApiModelProperty("缺陷列表") + private List defectList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index e412486..37e26bd 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -78,12 +78,12 @@ public class DefectEntity extends AuditableEntity implements Serializable { @ExcelProperty("弦向") @ApiModelProperty("弦向") @TableField("chordwise") - private Integer chordwise; + private String chordwise; @ExcelProperty("轴向") @ApiModelProperty("轴向") @TableField("axial") - private Integer axial; + private String axial; @ExcelProperty("标注信息") @ApiModelProperty("标注信息") @@ -100,5 +100,15 @@ public class DefectEntity extends AuditableEntity implements Serializable { @TableField("repair_idea") private String repairIdea; + @ExcelProperty("距离叶根/叶尖") + @ApiModelProperty("距离叶根/叶尖") + @TableField("with_leaf") + private String withLeaf; + + @ExcelProperty("距离叶根/叶尖xx米") + @ApiModelProperty("距离叶根/叶尖xx米") + @TableField("with_leaf_distance") + private String withLeafDistance; + } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutWorkDefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutWorkDefectEntity.java new file mode 100644 index 0000000..ba16a77 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutWorkDefectEntity.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/04/30 15:54 + * @Description: 外部工作-缺陷关联表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("gaea_out_work_defect") +@ApiModel(value="OutWorkDefectEntity对象", description="外部工作-缺陷关联表") +public class OutWorkDefectEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 869306338404475124L; + + @ExcelProperty("id") + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ExcelProperty("外部工作id") + @ApiModelProperty("外部工作id") + @TableField("out_work_id") + private String outWorkId; + + @ExcelProperty("缺陷id") + @ApiModelProperty("缺陷id") + @TableField("defect_ids") + private String defectIds; + + @ExcelProperty("岗位类型") + @ApiModelProperty("岗位类型") + @TableField("job_code") + private String jobCode; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index fd346ad..a818bd4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -139,9 +139,5 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty("项目工作岗位 可能有多项,json对象保存") @TableField("job") private String job; - - @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") - @TableField("safety_risk_point") - private String safetyRiskPoint; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/job/DefectDTO.java b/core/src/main/java/com/dite/znpt/domain/entity/job/DefectDTO.java new file mode 100644 index 0000000..583377e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/job/DefectDTO.java @@ -0,0 +1,58 @@ +package com.dite.znpt.domain.entity.job; + +import com.dite.znpt.annotations.MatchType; +import com.dite.znpt.annotations.QueryCondition; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@Deprecated +public class DefectDTO { + + @ApiModelProperty(value = "缺陷详情", example = "缺陷详情", notes = "缺陷详情") + @QueryCondition(func = MatchType.like) + private String content; + + @ApiModelProperty(value = "缺陷图片", example = "123.png", notes = "缺陷图片") + @QueryCondition(func = MatchType.like) + @JsonIgnore + private String flawUrl; + + @ApiModelProperty(value = "封面图片", example = "123.png", notes = "封面图片") + @QueryCondition(func = MatchType.like) + private String coverUrl; + + @ApiModelProperty(value = "缺陷类型编码", example = "A123", notes = "缺陷类型编码") + @QueryCondition(func = MatchType.like) + private String defectTypeCode; + + @ApiModelProperty(value = "缺陷位置1", example = "GG1", notes = "缺陷位置1") + @QueryCondition(func = MatchType.like) + private String defectLocation1; + + @ApiModelProperty(value = "缺陷位置1尺寸", example = "1.5", notes = "缺陷位置1尺寸") + @QueryCondition(func = MatchType.like) + private String defectLocation1Size; + + @ApiModelProperty(value = "缺陷位置2", example = "GG1", notes = "缺陷位置2") + @QueryCondition(func = MatchType.like) + private String defectLocation2; + + @ApiModelProperty(value = "缺陷尺寸", example = "10", notes = "缺陷尺寸") + @QueryCondition(func = MatchType.like) + private String defectSize; + + @ApiModelProperty(value = "缺陷尺寸2", example = "10", notes = "缺陷尺寸2") + @QueryCondition(func = MatchType.like) + private String defectSize2; + + @ApiModelProperty(value = "缺陷等级编码", example = "aa", notes = "缺陷等级编码") + @QueryCondition(func = MatchType.equal) + private String criticalityLevelCode; + + @ApiModelProperty(value = "缺陷图片,多个逗号隔开", example = "[https://123.png]", notes = "缺陷图片,多个逗号隔开") + private List flawUrlList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/job/JobOutWork.java b/core/src/main/java/com/dite/znpt/domain/entity/job/JobOutWork.java index 7a77dfd..60e449c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/job/JobOutWork.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/job/JobOutWork.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.annotations.MatchType; import com.dite.znpt.annotations.QueryCondition; import com.dite.znpt.domain.AuditableEntity; -import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.dto.OutWorkDefectDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -110,7 +110,7 @@ public class JobOutWork extends AuditableEntity implements Serializable { @ApiModelProperty(value = "飞手部件列表", example = "[]", notes = "部件列表") @TableField(exist = false) - private List droneFlyerPartsList; + private List droneFlyerPartsList; @ApiModelProperty(value = "飞助工作描述", example = "工作描述工作描述", notes = "飞助工作描述") private String flyAidJobDesc; @@ -144,7 +144,7 @@ public class JobOutWork extends AuditableEntity implements Serializable { @ApiModelProperty(value = "飞助部件列表", example = "[]", notes = "部件列表") @TableField(exist = false) - private List flyAidPartsList; + private List flyAidPartsList; @ApiModelProperty(value = "登高工作描述", example = "工作描述工作描述", notes = "登高工作描述") private String ascendingJobDesc; @@ -182,7 +182,7 @@ public class JobOutWork extends AuditableEntity implements Serializable { @ApiModelProperty(value = "登高部件列表", example = "[]", notes = "部件列表") @TableField(exist = false) - private List ascendingPartsList; + private List ascendingPartsList; @ApiModelProperty(value = "状态", example = "0草稿 1已提交 2组长提交 3项目经理审批通过", notes = "状态") @QueryCondition(func = MatchType.equal) diff --git a/core/src/main/java/com/dite/znpt/mapper/OutWorkDefectMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutWorkDefectMapper.java new file mode 100644 index 0000000..895d666 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/OutWorkDefectMapper.java @@ -0,0 +1,13 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.OutWorkDefectEntity; + +/** + * @author huise23 + * @date 2025/04/30 15:54 + * @Description: 外部工作-缺陷关联表数据库访问层 + */ +public interface OutWorkDefectMapper extends BaseMapper { +} + diff --git a/core/src/main/java/com/dite/znpt/service/OutWorkDefectService.java b/core/src/main/java/com/dite/znpt/service/OutWorkDefectService.java new file mode 100644 index 0000000..1d99715 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/OutWorkDefectService.java @@ -0,0 +1,13 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.OutWorkDefectEntity; + +/** + * @author huise23 + * @date 2025/04/30 15:54 + * @Description: 外部工作-缺陷关联表服务接口 + */ +public interface OutWorkDefectService extends IService { +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutWorkDefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutWorkDefectServiceImpl.java new file mode 100644 index 0000000..cb14b5d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/OutWorkDefectServiceImpl.java @@ -0,0 +1,18 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.OutWorkDefectEntity; +import com.dite.znpt.mapper.OutWorkDefectMapper; +import com.dite.znpt.service.OutWorkDefectService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * @author huise23 + * @date 2025/04/30 15:54 + * @Description: 外部工作-缺陷关联表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class OutWorkDefectServiceImpl extends ServiceImpl implements OutWorkDefectService { +} diff --git a/core/src/main/java/com/dite/znpt/service/job/JobOutWorkService.java b/core/src/main/java/com/dite/znpt/service/job/JobOutWorkService.java index 161e8a1..7afced1 100644 --- a/core/src/main/java/com/dite/znpt/service/job/JobOutWorkService.java +++ b/core/src/main/java/com/dite/znpt/service/job/JobOutWorkService.java @@ -2,7 +2,6 @@ package com.dite.znpt.service.job; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.job.JobOutWork; -import com.dite.znpt.domain.entity.job.JobOutWork; import com.dite.znpt.domain.vo.job.req.JobInfoReq; import com.dite.znpt.domain.vo.job.req.JobOutWorkReq; @@ -38,5 +37,5 @@ public interface JobOutWorkService extends IService { **/ public void reject(JobInfoReq request); - List listByJobId(JobOutWorkReq dto); + JobOutWork getByJobId(JobOutWorkReq dto); } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java index 8ef09ea..dc4fecb 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java @@ -45,7 +45,7 @@ public class JobAntiThunderWorkServiceImpl extends ServiceImpl linkList = outWorkDefectService.lambdaQuery().eq(OutWorkDefectEntity::getOutWorkId, entity.getId()).list(); + if (CollUtil.isNotEmpty(linkList)) { + defectService.lambdaUpdate().in(DefectEntity::getDefectId, linkList.stream().map(OutWorkDefectEntity::getDefectIds) + .flatMap(s -> StrUtil.split(s, ",").stream()).collect(Collectors.toList())).remove(); + } // 飞手部件列表 if (CollUtil.isNotEmpty(entity.getDroneFlyerPartsList())) { - List idList = entity.getDroneFlyerPartsList().stream().map(Parts::getId).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(idList)) { -// partService.lambdaUpdate(). - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.DRONE_FLYER.getValue()); - } else { - partService.delByReportIdAndIdNotInAndJobCode(entity.getId(), idList, Enums.EOutWorkType.DRONE_FLYER.getValue()); - } - JobInfo job = jobService.findByIdAndS(entity.getJobId(), Enums.S.Yes.getValue()); - entity.getDroneFlyerPartsList().forEach(item -> { - item.setProjectId(job.getProjectId()); - item.setCrewId(job.getCrewId()); - item.setReportId(entity.getId()); - item.setJobCode(Enums.EOutWorkType.DRONE_FLYER.getValue()); - }); - partService.save(entity.getDroneFlyerPartsList()); - } else { - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.DRONE_FLYER.getValue()); + saveDefect(entity.getDroneFlyerPartsList(), entity.getId(), Enums.EOutWorkType.DRONE_FLYER); } // 飞助部件列表 if (CollUtil.isNotEmpty(entity.getFlyAidPartsList())) { - List idList = entity.getFlyAidPartsList().stream().map(Parts::getId).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(idList)) { - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.FLYAID.getValue()); - } else { - partService.delByReportIdAndIdNotInAndJobCode(entity.getId(), idList, Enums.EOutWorkType.FLYAID.getValue()); - } - Job job = jobService.findByIdAndS(entity.getJobId(), Enums.S.Yes.getValue()); - entity.getFlyAidPartsList().forEach(item -> { - item.setProjectId(job.getProjectId()); - item.setCrewId(job.getCrewId()); - item.setReportId(entity.getId()); - item.setJobCode(Enums.EOutWorkType.FLYAID.getValue()); - }); - partService.save(entity.getFlyAidPartsList()); - } else { - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.FLYAID.getValue()); + saveDefect(entity.getFlyAidPartsList(), entity.getId(), Enums.EOutWorkType.FLYAID); } // 登高部件列表 if (CollUtil.isNotEmpty(entity.getAscendingPartsList())) { - List idList = entity.getAscendingPartsList().stream().map(Parts::getId).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(idList)) { - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.ASCEND_HEIGHT.getValue()); - } else { - partService.delByReportIdAndIdNotInAndJobCode(entity.getId(), idList, Enums.EOutWorkType.ASCEND_HEIGHT.getValue()); - } - Job job = jobService.findByIdAndS(entity.getJobId(), Enums.S.Yes.getValue()); - entity.getAscendingPartsList().forEach(item -> { - item.setProjectId(job.getProjectId()); - item.setCrewId(job.getCrewId()); - item.setReportId(entity.getId()); - item.setJobCode(Enums.EOutWorkType.ASCEND_HEIGHT.getValue()); - }); - partService.save(entity.getAscendingPartsList()); - } else { - partService.delByReportIdAndJobCode(entity.getId(), Enums.EOutWorkType.ASCEND_HEIGHT.getValue()); + saveDefect(entity.getAscendingPartsList(), entity.getId(), Enums.EOutWorkType.ASCEND_HEIGHT); } - Job job = jobService.findByIdAndS(entity.getJobId(), 1); - crewService.updateStatusNew(job.getCrewId()); + JobInfo jobInfo = jobService.getById(entity.getJobId()); + turbineService.updateStatus(jobInfo.getCrewId()); // 施工人员提交后更新该工作类型状态及提交时间 if (entity.getStatus().equals(Enums.EWorkStatus.SUBMITTED.getValue())) { - job.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); - job.setSubmitTime(new Date()); - jobService.save(job); + jobInfo.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); + jobInfo.setSubmitTime(new Date()); + jobService.updateById(jobInfo); + } + return entity; + } + + /** + * 功能描述:保存缺陷 + * + * @param defectDTOList 实体 + * @param outWorkId outWorkId + * @param workType 无人机飞行 + * @author cuizhibin + * @date 2025/04/30 16:37 + **/ + private void saveDefect(List defectDTOList, String outWorkId, Enums.EOutWorkType workType) { + List defectList = new ArrayList<>(); + List list = defectDTOList.stream().filter(defectDTO -> CollUtil.isNotEmpty(defectDTO.getDefectList())).map(item -> { + List defectIds = new ArrayList<>(); + item.getDefectList().forEach(defectDTO -> { + DefectEntity defect = new DefectEntity(); + defect.setDefectId(IdUtil.simpleUUID()); + defect.setDescription(defectDTO.getContent()); + defect.setDefectType(defectDTO.getDefectTypeCode()); + defect.setDefectLevel(defectDTO.getCriticalityLevelCode()); + defect.setDefectPosition(defectDTO.getDefectLocation2()); + defect.setAxial(defectDTO.getDefectSize()); + defect.setChordwise(defectDTO.getDefectSize2()); +// todo 若部件不存在,还需要创建部件或查询第一个部件,此处只有叶片的 + defectList.add(defect); + defectIds.add(defect.getDefectId()); + }); + + OutWorkDefectEntity workDefect = BeanUtil.copyProperties(item, OutWorkDefectEntity.class); + workDefect.setOutWorkId(outWorkId); + workDefect.setJobCode(workType.getValue()); + workDefect.setDefectIds(StrUtil.join(",", defectIds)); + return workDefect; + }).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(defectList)) { + outWorkDefectService.saveBatch(list); + defectService.saveBatch(defectList); + } + } + + @Override + public JobOutWork getByJobId(JobOutWorkReq dto) { + List list = lambdaQuery().eq(JobOutWork::getJobId, dto.getJobId()).list(); + if (CollUtil.isEmpty(list)) { + return new JobOutWork(); + } else { + JobOutWork work = list.get(0); + getDefectList(work); + return work; + } + } + + /** + * 功能描述:查询缺陷 + * + * @author cuizhibin + * @date 2025/04/30 16:37 + **/ + private void getDefectList(JobOutWork outWork) { + List linkList = outWorkDefectService.lambdaQuery().eq(OutWorkDefectEntity::getOutWorkId, outWork.getId()).list(); + Map defectMap = defectService.listByIds(linkList.stream().flatMap(outWorkDefect -> StrUtil.split(outWorkDefect.getDefectIds(), ",").stream()) + .collect(Collectors.toList())) + .stream().collect(Collectors.toMap(DefectEntity::getDefectId, Function.identity())); + outWork.setAscendingPartsList(new ArrayList<>()); + outWork.setFlyAidPartsList(new ArrayList<>()); + outWork.setAscendingPartsList(new ArrayList<>()); + for (OutWorkDefectEntity workDefect : linkList) { + OutWorkDefectDTO dto = BeanUtil.copyProperties(workDefect, OutWorkDefectDTO.class); + dto.setCode(""); + dto.setUrls(""); + dto.setStatus(0); + dto.setDefectList(new ArrayList<>()); + + if (workDefect.getJobCode().equals(Enums.EOutWorkType.DRONE_FLYER.getValue())) { + + } else if (workDefect.getJobCode().equals(Enums.EOutWorkType.FLYAID.getValue())) { + + } else if (workDefect.getJobCode().equals(Enums.EOutWorkType.ASCEND_HEIGHT.getValue())) { + + } } - return outWork; } /** @@ -133,38 +188,19 @@ public class JobOutWorkServiceImpl extends ServiceImpl jobIds = jobList.stream().map(Job::getId).collect(Collectors.toList()); - Map jobId2Job = jobList.stream().collect(Collectors.toMap(Job::getId, i -> i)); - List list = this.repository.findByJobIdInAndStatusIn(jobIds, statusList); - list.forEach(work -> { - Job job = jobId2Job.get(work.getJobId()); + List jobIds = jobList.stream().map(JobInfo::getId).collect(Collectors.toList()); + Map jobId2Job = jobList.stream().collect(Collectors.toMap(JobInfo::getId, i -> i)); + List workList = lambdaQuery().in(JobOutWork::getStatus, statusList).in(JobOutWork::getJobId, jobList.stream().map(JobInfo::getId).collect(Collectors.toList())).list(); + workList.forEach(work -> { + JobInfo job = jobId2Job.get(work.getJobId()); work.setConstructionPersonnel(job.getConstructionPersonnel()); work.setJobCode(job.getJobCode()); - - work.setDroneFlyerPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.DRONE_FLYER.getValue())); - work.setFlyAidPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.FLYAID.getValue())); - work.setAscendingPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.ASCEND_HEIGHT.getValue())); }); - return list; + return workList; } return new ArrayList<>(); } - /** - * @param vo - * @return {@link Page}<{@link JobOutWork}> - */ - @Override - public Page list(JobOutWorkReq vo) { - Page page = super.page(vo); - page.getContent().forEach(work -> { - work.setDroneFlyerPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.DRONE_FLYER.getValue())); - work.setFlyAidPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.FLYAID.getValue())); - work.setAscendingPartsList(partService.getByReportIdAndJobCode(IdVo.builder().id(work.getId()).build(), Enums.EOutWorkType.ASCEND_HEIGHT.getValue())); - }); - return page; - } - /** * 功能描述:组长提交/项目经理审批 * @@ -179,9 +215,9 @@ public class JobOutWorkServiceImpl extends ServiceImpl workList = this.repository.findByJobIdIn(jobList.stream().map(Job::getId).collect(Collectors.toList())); + JobInfo jobInfo = jobList.get(0); + ProjectEntity project = projectService.getById(jobInfo.getProjectId()); + List workList = lambdaQuery().in(JobOutWork::getJobId, jobList.stream().map(JobInfo::getId).collect(Collectors.toList())).list(); // 如果是项目经理 if (Enums.ERoleCode.ProjectManager.getName().equals(UserContext.getRoleCode())) { if (StrUtil.isNotBlank(project.getAuditorId())) { @@ -197,20 +233,20 @@ public class JobOutWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue())); - job.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue()); } else if (Enums.ERoleCode.SafetyOfficer.getName().equals(UserContext.getRoleCode())) { workList.forEach(item -> item.setSafetyOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal())); - job.setSafetyOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); + jobInfo.setSafetyOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); } else if (Enums.ERoleCode.QualityOfficer.getName().equals(UserContext.getRoleCode())) { workList.forEach(item -> item.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal())); - job.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); - } else if (project.getConstructionTeamLeaderId().equals(this.getCurrentUserId())) { + jobInfo.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); + } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getPersonId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); - job.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } - this.repository.saveAll(workList); - crewService.updateStatusNew(job.getCrewId()); - jobService.save(job); + saveOrUpdateBatch(workList); + turbineService.updateStatus(jobInfo.getCrewId()); + jobService.save(jobInfo); } /** @@ -227,26 +263,22 @@ public class JobOutWorkServiceImpl extends ServiceImpl workList = this.repository.findByJobIdIn(jobList.stream().map(Job::getId).collect(Collectors.toList())); + JobInfo jobInfo = jobList.get(0); + ProjectEntity project = projectService.getById(jobInfo.getProjectId()); + List workList = lambdaQuery().in(JobOutWork::getJobId, jobList.stream().map(JobInfo::getId).collect(Collectors.toList())).list(); // 如果是项目经理 if (Enums.ERoleCode.ProjectManager.getName().equals(UserContext.getRoleCode())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.SUBMITTED.getValue())); - job.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); } else if (Enums.ERoleCode.SafetyOfficer.getName().equals(UserContext.getRoleCode()) || Enums.ERoleCode.QualityOfficer.getName().equals(UserContext.getRoleCode()) - || project.getConstructionTeamLeaderId().equals(this.getCurrentUserId())) { + || project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getPersonId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); - job.setStatus(Enums.EWorkStatus.DRAFT.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } - this.repository.saveAll(workList); - crewService.updateStatusNew(job.getCrewId()); - jobService.save(job); + saveOrUpdateBatch(workList); + turbineService.updateStatus(jobInfo.getCrewId()); + jobService.save(jobInfo); } - @Override - public List listByJobId(JobOutWorkReq dto) { - return lambdaQuery().eq(JobOutWork::getJobId, dto.getJobId()).list(); - } } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java index eaa9146..0bd2650 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.context.UserContext; import com.dite.znpt.domain.QueryWrapperBuilder; +import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.job.*; import com.dite.znpt.domain.entity.job.JobSummaryWork; import com.dite.znpt.domain.entity.job.JobSummaryWork; @@ -13,6 +14,8 @@ import com.dite.znpt.domain.vo.job.req.JobSummaryWorkReq; import com.dite.znpt.enums.Enums; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.JobSummaryWorkMapper; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.TurbineService; import com.dite.znpt.service.job.JobService; import com.dite.znpt.service.job.JobSummaryWorkService; import org.springframework.beans.factory.annotation.Autowired; @@ -26,9 +29,11 @@ import java.util.stream.Collectors; @Transactional(rollbackFor = Exception.class) public class JobSummaryWorkServiceImpl extends ServiceImpl implements JobSummaryWorkService { @Autowired - private CrewService crewService; + private TurbineService turbineService; @Autowired private JobService jobService; + @Autowired + private ProjectService projectService; @Override public JobSummaryWork saveInfo(JobSummaryWork entity) { @@ -39,15 +44,15 @@ public class JobSummaryWorkServiceImpl extends ServiceImpl jobIds = jobList.stream().map(Job::getId).collect(Collectors.toList()); - Map jobId2Job = jobList.stream().collect(Collectors.toMap(Job::getId, i -> i)); - List list = this.repository.findByJobIdInAndStatusIn(jobIds, statusList); - list.forEach(work -> { - Job job = jobId2Job.get(work.getJobId()); + List jobIds = jobList.stream().map(JobInfo::getId).collect(Collectors.toList()); + Map jobId2Job = jobList.stream().collect(Collectors.toMap(JobInfo::getId, i -> i)); + List workList = lambdaQuery().in(JobSummaryWork::getStatus, statusList).in(JobSummaryWork::getJobId, jobIds).list(); + workList.forEach(work -> { + JobInfo job = jobId2Job.get(work.getJobId()); work.setConstructionPersonnel(job.getConstructionPersonnel()); work.setJobCode(job.getJobCode()); }); - return list; + return workList; } return new ArrayList<>(); } @@ -92,20 +97,20 @@ public class JobSummaryWorkServiceImpl extends ServiceImpl workList = this.repository.findByJobIdIn(jobList.stream().map(Job::getId).collect(Collectors.toList())); + JobInfo jobInfo = jobList.get(0); + ProjectEntity project = projectService.getById(jobInfo.getProjectId()); + List workList = lambdaQuery().in(JobSummaryWork::getJobId, jobList.stream().map(JobInfo::getId).collect(Collectors.toList())).list(); // 如果是项目经理 if (Enums.ERoleCode.ProjectManager.getName().equals(UserContext.getRoleCode())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue())); - job.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue()); - } else if (project.getConstructionTeamLeaderId().equals(this.getCurrentUserId())) { + jobInfo.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue()); + } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getPersonId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); - job.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } - this.repository.saveAll(workList); - crewService.updateStatusNew(job.getCrewId()); - jobRepository.save(job); + saveOrUpdateBatch(workList); + turbineService.updateStatus(jobInfo.getCrewId()); + jobService.save(jobInfo); } /** @@ -122,20 +127,20 @@ public class JobSummaryWorkServiceImpl extends ServiceImpl workList = this.repository.findByJobIdIn(jobList.stream().map(Job::getId).collect(Collectors.toList())); + JobInfo jobInfo = jobList.get(0); + ProjectEntity project = projectService.getById(jobInfo.getProjectId()); + List workList = lambdaQuery().in(JobSummaryWork::getJobId, jobList.stream().map(JobInfo::getId).collect(Collectors.toList())).list(); // 如果是项目经理 if (Enums.ERoleCode.ProjectManager.getName().equals(UserContext.getRoleCode())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.SUBMITTED.getValue())); - job.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); - } else if (project.getConstructionTeamLeaderId().equals(this.getCurrentUserId())) { + jobInfo.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); + } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getPersonId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); - job.setStatus(Enums.EWorkStatus.DRAFT.getValue()); + jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } - this.repository.saveAll(workList); - crewService.updateStatusNew(job.getCrewId()); - jobRepository.save(job); + saveOrUpdateBatch(workList); + turbineService.updateStatus(jobInfo.getCrewId()); + jobService.save(jobInfo); } @Override diff --git a/core/src/main/resources/mapper/OutWorkDefectMapper.xml b/core/src/main/resources/mapper/OutWorkDefectMapper.xml new file mode 100644 index 0000000..3fe4c0e --- /dev/null +++ b/core/src/main/resources/mapper/OutWorkDefectMapper.xml @@ -0,0 +1,9 @@ + + + + + + a.id, a.out_work_id, a.defect_id, a.out_work_type + + + diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java index aa27940..b4b52de 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java @@ -87,7 +87,7 @@ public class ZlmServiceImpl implements ZlmService, ApplicationRunner { serverCache.putLoad(item); } - @Scheduled(cron = "*/10 * * * * ?") +// @Scheduled(cron = "*/10 * * * * ?") public void heartbeat1() { log.debug("开始心跳检查..."); ServerItem item = serverCache.getLoad(); diff --git a/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java b/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java index e93c077..638c180 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/JobOutWorkController.java @@ -2,17 +2,14 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.TableData; -import com.dite.znpt.domain.entity.job.JobInWork; import com.dite.znpt.domain.entity.job.JobOutWork; import com.dite.znpt.domain.vo.job.req.JobInfoReq; import com.dite.znpt.domain.vo.job.req.JobOutWorkReq; import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.service.job.JobInWorkService; import com.dite.znpt.service.job.JobOutWorkService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -35,11 +32,7 @@ public class JobOutWorkController { @ApiOperation(value = "根据jobId查询岗位内容,未查到返回空对象") @ResponseBody public Result getJob(@Valid @RequestBody JobOutWorkReq dto) throws ServiceException { - List list = this.service.listByJobId(dto); - if (list.isEmpty()) { - return Result.ok(new JobOutWork()); - } - return Result.ok(list.get(0)); + return Result.ok(this.service.getByJobId(dto)); } @PostMapping(value = "save") From 79cd4f89f1b758754df712b18067b2bcc08dbc0a Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 6 May 2025 15:19:03 +0800 Subject: [PATCH 026/143] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E6=9A=82=E6=97=B6=E5=85=B3=E9=97=AD?= =?UTF-8?q?zlm=E7=9A=84=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../media/zlm/impl/ZlmServiceImpl.java | 2 +- web/pom.xml | 19 ++++++++++++++++++- .../znpt/web/controller/DefectController.java | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java index aa27940..b4b52de 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java @@ -87,7 +87,7 @@ public class ZlmServiceImpl implements ZlmService, ApplicationRunner { serverCache.putLoad(item); } - @Scheduled(cron = "*/10 * * * * ?") +// @Scheduled(cron = "*/10 * * * * ?") public void heartbeat1() { log.debug("开始心跳检查..."); ServerItem item = serverCache.getLoad(); diff --git a/web/pom.xml b/web/pom.xml index f10802f..011cbcf 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -11,6 +11,7 @@ web 1.0.0-SNAPSHOT + jar 17 @@ -35,4 +36,20 @@ - \ No newline at end of file + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 6e15b6c..1654703 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -38,7 +38,7 @@ public class DefectController { } @ApiOperation(value = "查询缺陷记录列表", httpMethod = "GET") - @GetMapping("/page") + @GetMapping("/list") public Result> list(@RequestBody DefectListReq req) { return Result.ok(defectService.list(req)); } From ca877877847d6ddbcde340b61deab85f00edcf51 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 6 May 2025 22:29:29 +0800 Subject: [PATCH 027/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90=EF=BC=8C=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=BE=85=E6=98=8E=E7=A1=AE=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../java/com/dite/znpt/converts/Converts.java | 10 ++- ...PersonnelEntity.java => PersonEntity.java} | 6 +- .../znpt/domain/entity/ProjectEntity.java | 8 +- ...rsonnelListReq.java => PersonListReq.java} | 2 +- .../{PersonnelResp.java => PersonResp.java} | 4 +- .../dite/znpt/domain/vo/ProjectListReq.java | 10 +-- .../com/dite/znpt/domain/vo/ProjectReq.java | 16 ++-- .../com/dite/znpt/domain/vo/ProjectResp.java | 16 ++++ .../com/dite/znpt/mapper/PersonnelMapper.java | 11 ++- .../com/dite/znpt/mapper/ProjectMapper.java | 3 +- ...rsonnelService.java => PersonService.java} | 20 ++--- ...erviceImpl.java => PersonServiceImpl.java} | 30 +++---- .../znpt/service/impl/ProjectServiceImpl.java | 81 ++++++++++++++----- .../main/resources/mapper/PersonnelMapper.xml | 2 +- .../main/resources/mapper/ProjectMapper.xml | 42 ++++------ ...lController.java => PersonController.java} | 38 ++++----- .../web/controller/ProjectController.java | 14 +++- web/src/main/resources/application-dev.yml | 6 +- 19 files changed, 191 insertions(+), 129 deletions(-) rename core/src/main/java/com/dite/znpt/domain/entity/{PersonnelEntity.java => PersonEntity.java} (87%) rename core/src/main/java/com/dite/znpt/domain/vo/{PersonnelListReq.java => PersonListReq.java} (93%) rename core/src/main/java/com/dite/znpt/domain/vo/{PersonnelResp.java => PersonResp.java} (74%) rename core/src/main/java/com/dite/znpt/service/{PersonnelService.java => PersonService.java} (67%) rename core/src/main/java/com/dite/znpt/service/impl/{PersonnelServiceImpl.java => PersonServiceImpl.java} (67%) rename web/src/main/java/com/dite/znpt/web/controller/{PersonnelController.java => PersonController.java} (63%) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 7529768..6f5babc 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -16,4 +16,5 @@ public class Message implements Serializable { public static final String IMAGE_PATH_IS_NOT_EXIST = "图像地址不存在"; public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; + public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 55a918b..d3c3905 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -3,10 +3,8 @@ package com.dite.znpt.converts; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; -import com.dite.znpt.domain.vo.DefectReq; -import com.dite.znpt.domain.vo.DefectResp; -import com.dite.znpt.domain.vo.ImageCollectReq; -import com.dite.znpt.domain.vo.ImageReq; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.vo.*; import org.mapstruct.Mapper; import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.factory.Mappers; @@ -29,4 +27,8 @@ public interface Converts { DefectEntity toDefectEntity(DefectReq req); DefectResp toDefectResp(DefectEntity entity); + + ProjectResp toProjectResp(ProjectEntity entity); + + ProjectEntity toProjectEntity(ProjectReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PersonEntity.java similarity index 87% rename from core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java rename to core/src/main/java/com/dite/znpt/domain/entity/PersonEntity.java index b1ac0d4..730480e 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PersonnelEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PersonEntity.java @@ -17,9 +17,9 @@ import com.alibaba.excel.annotation.ExcelProperty; */ @Data @EqualsAndHashCode(callSuper = false) -@TableName("personnel") -@ApiModel(value="PersonnelEntity对象", description="人员信息表") -public class PersonnelEntity extends AuditableEntity implements Serializable { +@TableName("person") +@ApiModel(value="PersonEntity对象", description="人员信息表") +public class PersonEntity extends AuditableEntity implements Serializable { private static final long serialVersionUID = -62273861742734411L; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index fd346ad..36d3d07 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -83,12 +83,12 @@ public class ProjectEntity extends AuditableEntity implements Serializable { private String turbineModel; @ApiModelProperty("施工人员") - @TableField("construction_personnel") - private String constructionPersonnel; + @TableField("construction_person") + private String constructionPerson; @ApiModelProperty("施工人员id") - @TableField("construction_personnel_id") - private String constructionPersonnelId; + @TableField("construction_person_id") + private String constructionPersonId; @ApiModelProperty("安全员id") @TableField("auditor_id") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PersonListReq.java similarity index 93% rename from core/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java rename to core/src/main/java/com/dite/znpt/domain/vo/PersonListReq.java index 5ab3c92..8cf43c2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PersonnelListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PersonListReq.java @@ -13,7 +13,7 @@ import lombok.Data; */ @Data @ApiModel("人员信息列表请求实体") -public class PersonnelListReq implements Serializable { +public class PersonListReq implements Serializable { private static final long serialVersionUID = -10363935468256543L; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PersonResp.java similarity index 74% rename from core/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java rename to core/src/main/java/com/dite/znpt/domain/vo/PersonResp.java index c66e1fa..587c10c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PersonnelResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PersonResp.java @@ -3,7 +3,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.PersonnelEntity; +import com.dite.znpt.domain.entity.PersonEntity; /** * @author huise23 @@ -13,6 +13,6 @@ import com.dite.znpt.domain.entity.PersonnelEntity; @Data @EqualsAndHashCode(callSuper = true) @ApiModel("人员信息响应实体") -public class PersonnelResp extends PersonnelEntity { +public class PersonResp extends PersonEntity { } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java index 6f7343c..46ad94b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -19,9 +20,6 @@ public class ProjectListReq implements Serializable { private static final long serialVersionUID = -74121355744234753L; - @ApiModelProperty("查询关键字") - private String keyword; - @ApiModelProperty("项目名称") private String projectName; @@ -37,11 +35,13 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") private String status; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("创建日期-起") - private LocalDate createDateBegin; + private String createDateBegin; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("创建日期-讫") - private LocalDate createDateEnd; + private String createDateEnd; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java index 67a517f..c59c45e 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -19,15 +20,18 @@ public class ProjectReq implements Serializable { @Serial private static final long serialVersionUID = 740685592879189406L; + @ExcelProperty("项目名称") @ApiModelProperty("项目名称") private String projectName; @ApiModelProperty("项目封面") private String coverUrl; + @ExcelProperty("风场名称") @ApiModelProperty("风场名称") private String farmName; + @ExcelProperty("风场地址") @ApiModelProperty("风场地址") private String farmAddress; @@ -49,17 +53,19 @@ public class ProjectReq implements Serializable { @ApiModelProperty("检查单位联系电话") private String inspectionPhone; + @ExcelProperty("项目规模") @ApiModelProperty("项目规模") private String scale; + @ExcelProperty("风机型号") @ApiModelProperty("风机型号") private String turbineModel; - @ApiModelProperty("施工人员") - private String constructionPersonnel; - @ApiModelProperty("施工人员id") - private String constructionPersonnelId; + private String constructionPersonId; + + @ApiModelProperty("施工人员") + private String constructionPersonName; @ApiModelProperty("安全员id") private String auditorId; @@ -89,7 +95,7 @@ public class ProjectReq implements Serializable { private String discloseContent; @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") - private Integer status; + private String status; @ApiModelProperty("项目工作类型 可能有多项,逗号分隔") private String workType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java index eff73b7..8bdfd18 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java @@ -26,7 +26,23 @@ public class ProjectResp extends ProjectReq implements Serializable { @Serial private static final long serialVersionUID = -1883901559600186726L; + @ExcelProperty("项目id") @ApiModelProperty("项目id") private String projectId; + + @ApiModelProperty("安全员") + private String auditorName; + + @ApiModelProperty("质量员") + private String qualityOfficerName; + + @ApiModelProperty("项目经理") + private String projectManagerName; + + @ApiModelProperty("施工组长") + private String constructionTeamLeaderName; + + @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") + private String statusLabel; } diff --git a/core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java b/core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java index dbe7318..5a8d6d7 100644 --- a/core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/PersonnelMapper.java @@ -1,10 +1,9 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.PersonnelEntity; -import com.dite.znpt.domain.vo.PersonnelListReq; -import com.dite.znpt.domain.vo.PersonnelResp; -import org.apache.ibatis.annotations.Param; +import com.dite.znpt.domain.entity.PersonEntity; +import com.dite.znpt.domain.vo.PersonListReq; +import com.dite.znpt.domain.vo.PersonResp; import java.util.List; @@ -13,7 +12,7 @@ import java.util.List; * @date 2025/04/11 23:17 * @Description: 人员信息表数据库访问层 */ -public interface PersonnelMapper extends BaseMapper { - List queryBySelective(PersonnelListReq personnelReq); +public interface PersonnelMapper extends BaseMapper { + List queryBySelective(PersonListReq personnelReq); } diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java index 5616a49..c1bebbf 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMapper.java @@ -3,6 +3,7 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.vo.ProjectListReq; +import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectResp; import org.apache.ibatis.annotations.Param; @@ -14,6 +15,6 @@ import java.util.List; * @Description: 项目信息表数据库访问层 */ public interface ProjectMapper extends BaseMapper { - List queryBySelective(ProjectListReq projectReq); + List queryBySelective(ProjectListReq projectReq); } diff --git a/core/src/main/java/com/dite/znpt/service/PersonnelService.java b/core/src/main/java/com/dite/znpt/service/PersonService.java similarity index 67% rename from core/src/main/java/com/dite/znpt/service/PersonnelService.java rename to core/src/main/java/com/dite/znpt/service/PersonService.java index 2717734..6a7ac97 100644 --- a/core/src/main/java/com/dite/znpt/service/PersonnelService.java +++ b/core/src/main/java/com/dite/znpt/service/PersonService.java @@ -1,9 +1,9 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.PersonnelEntity; -import com.dite.znpt.domain.vo.PersonnelListReq; -import com.dite.znpt.domain.vo.PersonnelResp; +import com.dite.znpt.domain.entity.PersonEntity; +import com.dite.znpt.domain.vo.PersonListReq; +import com.dite.znpt.domain.vo.PersonResp; import java.util.List; @@ -12,27 +12,27 @@ import java.util.List; * @date 2025/04/11 23:17 * @Description: 人员信息表服务接口 */ -public interface PersonnelService extends IService { +public interface PersonService extends IService { /** * 功能描述:查询人员信息列表 * * @param personnelReq 人员信息 - * @return {@link List }<{@link PersonnelEntity }> + * @return {@link List }<{@link PersonEntity }> * @author huise23 * @date 2025/04/11 23:17 **/ - List selectList(PersonnelListReq personnelReq); + List selectList(PersonListReq personnelReq); /** * 功能描述:查询单条人员信息 * * @param personId 人员信息Id - * @return {@link PersonnelResp } + * @return {@link PersonResp } * @author huise23 * @date 2025/04/11 23:17 **/ - PersonnelResp selectById(String personId); + PersonResp selectById(String personId); /** * 功能描述:新增人员信息 @@ -41,7 +41,7 @@ public interface PersonnelService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(PersonnelEntity personnel); + void saveData(PersonEntity personnel); /** * 功能描述:更新人员信息 @@ -50,7 +50,7 @@ public interface PersonnelService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(PersonnelEntity personnel); + void updateData(PersonEntity personnel); /** * 功能描述:删除人员信息 diff --git a/core/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PersonServiceImpl.java similarity index 67% rename from core/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java rename to core/src/main/java/com/dite/znpt/service/impl/PersonServiceImpl.java index f352d90..e28061c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PersonnelServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PersonServiceImpl.java @@ -1,10 +1,10 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.PersonnelEntity; -import com.dite.znpt.domain.vo.PersonnelListReq; -import com.dite.znpt.domain.vo.PersonnelResp; -import com.dite.znpt.service.PersonnelService; +import com.dite.znpt.domain.entity.PersonEntity; +import com.dite.znpt.domain.vo.PersonListReq; +import com.dite.znpt.domain.vo.PersonResp; +import com.dite.znpt.service.PersonService; import com.dite.znpt.mapper.PersonnelMapper; import org.springframework.stereotype.Service; import cn.hutool.core.collection.CollUtil; @@ -20,20 +20,20 @@ import java.util.List; */ @Service @RequiredArgsConstructor -public class PersonnelServiceImpl extends ServiceImpl implements PersonnelService { +public class PersonServiceImpl extends ServiceImpl implements PersonService { /** * 功能描述:查询人员信息列表 * * @param personnelReq 人员信息信息 - * @return {@link List }<{@link PersonnelResp }> + * @return {@link List }<{@link PersonResp }> * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public List selectList(PersonnelListReq personnelReq) { + public List selectList(PersonListReq personnelReq) { PageUtil.startPage(); - List personnelList= this.baseMapper.queryBySelective(personnelReq); + List personnelList= this.baseMapper.queryBySelective(personnelReq); personnelList.forEach(resp -> { }); @@ -44,17 +44,17 @@ public class PersonnelServiceImpl extends ServiceImpl list = selectList(personnelReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new PersonnelResp(); + List list = selectList(personnelReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new PersonResp(); } /** @@ -65,7 +65,7 @@ public class PersonnelServiceImpl extends ServiceImpl implements ProjectService { + @Resource + private PersonService personService; /** * 功能描述:查询项目信息列表 * - * @param projectReq 项目信息信息 + * @param req 项目信息信息 * @return {@link List }<{@link ProjectResp }> * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public List page(ProjectListReq projectReq) { + public List page(ProjectListReq req) { PageUtil.startPage(); - List projectList= this.baseMapper.queryBySelective(projectReq); - projectList.forEach(resp -> { - - }); - return null; + return this.list(req); } @Override - public List list(ProjectListReq projectReq) { - List projectList= this.baseMapper.queryBySelective(projectReq); - projectList.forEach(resp -> { - + public List list(ProjectListReq req) { + List list= this.baseMapper.queryBySelective(req); + list.forEach(resp -> { + resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); }); - return null; + return list; } /** @@ -62,8 +73,35 @@ public class ProjectServiceImpl extends ServiceImpl personIds = new ArrayList<>(); + if(StrUtil.isNotEmpty(resp.getAuditorId())){ + personIds.add(resp.getAuditorId()); + } + if(StrUtil.isNotEmpty(resp.getQualityOfficerId())){ + personIds.add(resp.getQualityOfficerId()); + } + if(StrUtil.isNotEmpty(resp.getConstructionTeamLeaderId())){ + personIds.add(resp.getConstructionTeamLeaderId()); + } + if(StrUtil.isNotEmpty(resp.getProjectManagerId())){ + personIds.add(resp.getProjectManagerId()); + } + if(CollUtil.isNotEmpty(personIds)){ + Map personIdMap = personService.listByIds(personIds).stream().collect(Collectors.toMap(k->k.getPersonId(), Function.identity())); + if(CollUtil.isNotEmpty(personIdMap)){ + resp.setAuditorName(personIdMap.containsKey(resp.getAuditorId()) ? personIdMap.get(resp.getAuditorId()).getName() : null); + resp.setProjectManagerName(personIdMap.containsKey(resp.getProjectManagerId()) ? personIdMap.get(resp.getProjectManagerId()).getName() : null); + resp.setConstructionTeamLeaderName(personIdMap.containsKey(resp.getConstructionTeamLeaderId()) ? personIdMap.get(resp.getConstructionTeamLeaderId()).getName() : null); + resp.setQualityOfficerName(personIdMap.containsKey(resp.getQualityOfficerId()) ? personIdMap.get(resp.getQualityOfficerId()).getName() : null); + } + } + return resp; } /** @@ -76,8 +114,8 @@ public class ProjectServiceImpl extends ServiceImpl - select from personnel a diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index d3b28cc..76d66a5 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -2,42 +2,32 @@ - - a.project_id, a.project_name, a.farm_name, a.farm_address, - a.method_id, a.scale, a.turbine_model, a.status - - + SELECT + prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, + prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.construction_person_id, prj.construction_person_name , prj.create_time + FROM project prj + LEFT JOIN person pm ON pm.person_id = prj.project_manager_id - -# and (a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - - and a.project_id like concat ('%', #{projectId}, '%') - - and a.project_name like concat ('%', #{projectName}, '%') + AND prj.project_name LIKE concat ('%', #{projectName}, '%') - and a.farm_name like concat ('%', #{farmName}, '%') + AND prj.farm_name LIKE concat ('%', #{farmName}, '%') - and a.farm_address like concat ('%', #{farmAddress}, '%') + AND prj.farm_address LIKE concat ('%', #{farmAddress}, '%') - - and a.method_id like concat ('%', #{methodId}, '%') - - - and a.scale like concat ('%', #{scale}, '%') - - - and a.turbine_model like concat ('%', #{turbineModel}, '%') + + AND prj.client LIKE concat ('%', #{client}, '%') - and a.status like concat ('%', #{status}, '%') + AND prj.status = #{status} + + + AND prj.create_time BETWEEN #{createDateBegin} AND #{createDateEnd} diff --git a/web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java b/web/src/main/java/com/dite/znpt/web/controller/PersonController.java similarity index 63% rename from web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java rename to web/src/main/java/com/dite/znpt/web/controller/PersonController.java index 6b83171..f1d82f8 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PersonnelController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PersonController.java @@ -2,10 +2,10 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.PersonnelListReq; -import com.dite.znpt.domain.vo.PersonnelResp; -import com.dite.znpt.domain.entity.PersonnelEntity; -import com.dite.znpt.service.PersonnelService; +import com.dite.znpt.domain.vo.PersonListReq; +import com.dite.znpt.domain.vo.PersonResp; +import com.dite.znpt.domain.entity.PersonEntity; +import com.dite.znpt.service.PersonService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; import com.pig4cloud.plugin.excel.annotation.RequestExcel; @@ -25,54 +25,54 @@ import java.util.List; */ @Api(tags = "人员信息") @RestController -@RequestMapping("/personnel") -public class PersonnelController { +@RequestMapping("/person") +public class PersonController { @Resource - private PersonnelService personnelService; + private PersonService personService; @ApiOperation(value = "获取人员信息列表", httpMethod = "GET") @GetMapping("/list") - public PageResult list(PersonnelListReq personnelReq) { - return PageResult.ok(personnelService.selectList(personnelReq)); + public PageResult list(PersonListReq personnelReq) { + return PageResult.ok(personService.selectList(personnelReq)); } @ApiOperation(value = "根据人员信息Id获取详细信息", httpMethod = "GET") @GetMapping("/{personId}") - public Result getInfo(@PathVariable String personId) { - return Result.ok(personnelService.selectById(personId)); + public Result getInfo(@PathVariable String personId) { + return Result.ok(personService.selectById(personId)); } @ApiOperation(value = "新增人员信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody PersonnelEntity personnel) { - personnelService.saveData(personnel); + public Result add(@RequestBody PersonEntity personnel) { + personService.saveData(personnel); return Result.ok(); } @ApiOperation(value = "修改人员信息", httpMethod = "PUT") @PutMapping - public Result edit(@RequestBody PersonnelEntity personnel) { - personnelService.updateData(personnel); + public Result edit(@RequestBody PersonEntity personnel) { + personService.updateData(personnel); return Result.ok(); } @ApiOperation(value = "删除人员信息", httpMethod = "DELETE") @DeleteMapping("/{personId}") public Result remove(@PathVariable String personId) { - personnelService.deleteById(personId); + personService.deleteById(personId); return Result.ok(); } @ApiOperation(value = "导出人员信息", httpMethod = "GET") @GetMapping("/export") @ResponseExcel(name = "人员信息") - public List export(PersonnelListReq personnelReq) { - return personnelService.selectList(personnelReq); + public List export(PersonListReq personnelReq) { + return personService.selectList(personnelReq); } @ApiOperation(value = "导入人员信息", httpMethod = "POST") @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); if (errorMessageList != null && !errorMessageList.isEmpty()) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java index 7061609..182e0b1 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java @@ -32,12 +32,18 @@ public class ProjectController { @Resource private ProjectService projectService; - @ApiOperation(value = "获取项目信息列表", httpMethod = "GET") + @ApiOperation(value = "分页查询项目信息列表", httpMethod = "GET") @GetMapping("/page") - public PageResult page(@RequestBody ProjectListReq req) { + public PageResult page(ProjectListReq req) { return PageResult.ok(projectService.page(req)); } + @ApiOperation(value = "查询项目信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(ProjectListReq req) { + return Result.ok(projectService.list(req)); + } + @ApiOperation(value = "查询项目信息详细信息", httpMethod = "GET") @GetMapping("/detail/{projectId}") public Result detail(@PathVariable String projectId) { @@ -65,14 +71,14 @@ public class ProjectController { return Result.ok(); } - @ApiOperation(value = "导出项目信息", httpMethod = "GET") + @ApiOperation(value = "导出项目信息-需求待明确", httpMethod = "GET") @GetMapping("/export") @ResponseExcel(name = "项目信息") public List export(ProjectListReq req) { return null; } - @ApiOperation(value = "导入项目信息", httpMethod = "POST") + @ApiOperation(value = "导入项目信息-需求待明确", httpMethod = "POST") @PostMapping("/import") public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index f4933c6..e2663b3 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -84,7 +84,7 @@ spring: sip-config: name: 信令服务 - ip: 192.168.0.207 + ip: 192.168.0.112 port: 1074 charset: gb2312 domain: 3402000000 @@ -100,7 +100,7 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 192.168.0.207 + apiHost: 192.168.0.112 # 接口端口 apiPort: 8080 # 密钥 @@ -108,7 +108,7 @@ zlm-config: # 流id前缀 streamPrefix: # rtp ip - rtpHost: 192.168.0.207 + rtpHost: 192.168.0.112 # rtp 端口 rtpPort: 8080 # 动态端口起始值 From 47a3e7e76422cd1dd40396a3a3077d5c973384a2 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 6 May 2025 22:37:02 +0800 Subject: [PATCH 028/143] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=97=B6=E5=85=A5=E5=8F=82=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/web/controller/DefectController.java | 4 ++-- .../java/com/dite/znpt/web/controller/ImageController.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 1654703..67e5c19 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -33,13 +33,13 @@ public class DefectController { @ApiOperation(value = "分页查询缺陷记录列表", httpMethod = "GET") @GetMapping("/page") - public PageResult page(@RequestBody DefectListReq req) { + public PageResult page(DefectListReq req) { return PageResult.ok(defectService.page(req)); } @ApiOperation(value = "查询缺陷记录列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(@RequestBody DefectListReq req) { + public Result> list(DefectListReq req) { return Result.ok(defectService.list(req)); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 773713f..609b0c9 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -32,13 +32,13 @@ public class ImageController { @ApiOperation(value = "分页查询图像列表", httpMethod = "GET") @GetMapping("/page") - public PageResult page(@RequestBody ImageListReq req) { + public PageResult page(ImageListReq req) { return PageResult.ok(imageService.page(req)); } @ApiOperation(value = "查询图像列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(@RequestBody ImageListReq req){ + public Result> list(ImageListReq req){ return Result.ok(imageService.list(req)); } From bd28cd577a3027d1e0ae03ebf77267f5bbd433b9 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Thu, 8 May 2025 00:16:08 +0800 Subject: [PATCH 029/143] =?UTF-8?q?=E6=9C=BA=E7=BB=84=E5=92=8C=E9=83=A8?= =?UTF-8?q?=E4=BB=B6=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=9070%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 2 + .../java/com/dite/znpt/converts/Converts.java | 13 +- .../dite/znpt/domain/entity/PartEntity.java | 17 +- .../znpt/domain/entity/TurbineEntity.java | 17 +- .../com/dite/znpt/domain/vo/PartListReq.java | 24 +-- .../com/dite/znpt/domain/vo/PartListResp.java | 48 ++++++ .../java/com/dite/znpt/domain/vo/PartReq.java | 42 +++++ .../com/dite/znpt/domain/vo/PartResp.java | 50 +++++- .../dite/znpt/domain/vo/TurbineInfoResp.java | 25 +++ .../dite/znpt/domain/vo/TurbineListReq.java | 18 +-- .../dite/znpt/domain/vo/TurbineListResp.java | 57 +++++++ .../com/dite/znpt/domain/vo/TurbineReq.java | 45 ++++++ .../com/dite/znpt/domain/vo/TurbineResp.java | 67 ++++---- .../com/dite/znpt/enums/PartTypeEnum.java | 53 +++++++ .../java/com/dite/znpt/mapper/PartMapper.java | 3 +- .../com/dite/znpt/mapper/TurbineMapper.java | 8 +- .../com/dite/znpt/service/PartService.java | 38 ++++- .../com/dite/znpt/service/TurbineService.java | 73 +++++++-- .../znpt/service/impl/PartServiceImpl.java | 119 ++++++++++---- .../znpt/service/impl/TurbineServiceImpl.java | 149 ++++++++++++++---- core/src/main/resources/mapper/PartMapper.xml | 43 ++--- .../main/resources/mapper/TurbineMapper.xml | 91 ++++++++--- .../znpt/web/controller/PartController.java | 40 +++-- .../web/controller/TurbineController.java | 73 +++++---- 24 files changed, 834 insertions(+), 281 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/PartListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/PartReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TurbineInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TurbineListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/PartTypeEnum.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 6f5babc..f1ed7a3 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -17,4 +17,6 @@ public class Message implements Serializable { public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; + public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; + public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index d3c3905..3998a5d 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -1,9 +1,6 @@ package com.dite.znpt.converts; -import com.dite.znpt.domain.entity.DefectEntity; -import com.dite.znpt.domain.entity.ImageCollectEntity; -import com.dite.znpt.domain.entity.ImageEntity; -import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.*; import com.dite.znpt.domain.vo.*; import org.mapstruct.Mapper; import org.mapstruct.NullValuePropertyMappingStrategy; @@ -31,4 +28,12 @@ public interface Converts { ProjectResp toProjectResp(ProjectEntity entity); ProjectEntity toProjectEntity(ProjectReq req); + + TurbineEntity toTurbineEntity(TurbineReq req); + + TurbineResp toTurbineResp(TurbineEntity entity); + + PartEntity toPartEntity(PartReq req); + + PartResp toPartResp(PartEntity entity); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java index 032b56c..f602cbf 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java @@ -28,11 +28,6 @@ public class PartEntity extends AuditableEntity implements Serializable { @TableId(value = "part_id", type = IdType.ASSIGN_UUID) private String partId; - @ExcelProperty("项目id") - @ApiModelProperty("项目id") - @TableField("project_id") - private String projectId; - @ExcelProperty("机组id") @ApiModelProperty("机组id") @TableField("turbine_id") @@ -48,8 +43,8 @@ public class PartEntity extends AuditableEntity implements Serializable { @TableField("part_code") private String partCode; - @ExcelProperty("类型,字典part_type") - @ApiModelProperty("类型,字典part_type") + @ExcelProperty("类型,枚举PartTypeEnum") + @ApiModelProperty("类型,枚举PartTypeEnum") @TableField("part_type") private String partType; @@ -60,12 +55,12 @@ public class PartEntity extends AuditableEntity implements Serializable { @ExcelProperty("厂商") @ApiModelProperty("厂商") - @TableField("manufacturer") - private String manufacturer; + @TableField("part_manufacturer") + private String partManufacturer; @ExcelProperty("型号") @ApiModelProperty("型号") - @TableField("model") - private String model; + @TableField("part_model") + private String partModel; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java index 2be3ef6..4be4628 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TurbineEntity.java @@ -38,6 +38,11 @@ public class TurbineEntity extends AuditableEntity implements Serializable { @TableField("turbine_name") private String turbineName; + @ExcelProperty("机组编码") + @ApiModelProperty("机组编码") + @TableField("turbine_code") + private String turbineCode; + @ExcelProperty("机组描述") @ApiModelProperty("机组描述") @TableField("turbine_desc") @@ -45,17 +50,17 @@ public class TurbineEntity extends AuditableEntity implements Serializable { @ExcelProperty("机组厂商") @ApiModelProperty("机组厂商") - @TableField("manufacturer") - private String manufacturer; + @TableField("turbine_manufacturer") + private String turbineManufacturer; @ExcelProperty("机组型号") @ApiModelProperty("机组型号") - @TableField("model") - private String model; + @TableField("turbine_model") + private String turbineModel; @ApiModelProperty("封面图") - @TableField("cover_url") - private String coverUrl; + @TableField("turbine_cover_url") + private String turbineCoverUrl; @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") @TableField("status") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java index 8f69872..d209d6d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java @@ -12,7 +12,7 @@ import lombok.Data; * @Description: 请求实体 */ @Data -@ApiModel("列表请求实体") +@ApiModel("部件列表请求实体") public class PartListReq implements Serializable { private static final long serialVersionUID = 118135700439578757L; @@ -20,32 +20,20 @@ public class PartListReq implements Serializable { @ApiModelProperty("查询关键字") private String keyword; - @ApiModelProperty("Id") - private String partId; - - @ApiModelProperty("项目id") + @ApiModelProperty(name = "项目id", required = true) private String projectId; - @ApiModelProperty("机组id") + @ApiModelProperty(name = "机组id", required = true) private String turbineId; - @ApiModelProperty("名称") - private String partName; - - @ApiModelProperty("编号") - private String partCode; - - @ApiModelProperty("类型,字典part_type") + @ApiModelProperty("类型,枚举PartTypeEnum") private String partType; - @ApiModelProperty("描述") - private String partDesc; - @ApiModelProperty("厂商") - private String manufacturer; + private String partManufacturer; @ApiModelProperty("型号") - private String model; + private String partModel; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListResp.java new file mode 100644 index 0000000..84bd689 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartListResp.java @@ -0,0 +1,48 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 21:50 + * @Description: + */ +@Data +@ApiModel("部件列表响应实体") +public class PartListResp implements Serializable { + + @Serial + private static final long serialVersionUID = -8081226536055269084L; + + @ApiModelProperty("部件id") + private String partId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("机组id") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("名称") + private String partName; + + @ApiModelProperty("编号") + private String partCode; + + @ApiModelProperty("类型,枚举PartTypeEnum") + private String partType; + + @ApiModelProperty("类型,枚举PartTypeEnum") + private String partTypeLabel; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java new file mode 100644 index 0000000..7357675 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java @@ -0,0 +1,42 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 21:51 + * @Description: + */ +@Data +@ApiModel("部件请求实体") +public class PartReq implements Serializable { + + @Serial + private static final long serialVersionUID = -585044340118904985L; + + @ApiModelProperty("机组id") + private String turbineId; + + @ApiModelProperty("名称") + private String partName; + + @ApiModelProperty("编号") + private String partCode; + + @ApiModelProperty("类型,枚举PartTypeEnum") + private String partType; + + @ApiModelProperty("描述") + private String partDesc; + + @ApiModelProperty("厂商") + private String PartManufacturer; + + @ApiModelProperty("型号") + private String PartModel; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PartResp.java index 92a5f7b..0112d0b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartResp.java @@ -1,9 +1,11 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.PartEntity; + +import java.io.Serial; +import java.io.Serializable; /** * @author huise23 @@ -11,8 +13,46 @@ import com.dite.znpt.domain.entity.PartEntity; * @Description: 响应实体 */ @Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("响应实体") -public class PartResp extends PartEntity { +@ApiModel("部件响应实体") +public class PartResp implements Serializable { + + @Serial + private static final long serialVersionUID = -4457194361289992312L; + + @ApiModelProperty("部件id") + private String partId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组") + private String projectName; + + @ApiModelProperty("机组id") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("名称") + private String partName; + + @ApiModelProperty("编号") + private String partCode; + + @ApiModelProperty("类型,枚举PartTypeEnum") + private String partType; + + @ApiModelProperty("类型描述") + private String partTypeLabel; + + @ApiModelProperty("描述") + private String partDesc; + + @ApiModelProperty("厂商") + private String partManufacturer; + + @ApiModelProperty("型号") + private String partModel; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineInfoResp.java new file mode 100644 index 0000000..4a4a668 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineInfoResp.java @@ -0,0 +1,25 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 22:17 + * @Description: + */ +@Data +@ApiModel("机组明细响应实体") +public class TurbineInfoResp extends TurbineResp implements Serializable { + + @Serial + private static final long serialVersionUID = 5493448541358665068L; + + @ApiModelProperty("部件信息") + private List partRespList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java index 3fd3947..ddffeaa 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java @@ -12,31 +12,25 @@ import lombok.Data; * @Description: 机组-项目关联请求实体 */ @Data -@ApiModel("机组-项目关联列表请求实体") +@ApiModel("机组列表请求实体") public class TurbineListReq implements Serializable { private static final long serialVersionUID = 141552424945497346L; - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("机组-项目关联Id") - private String turbineId; - - @ApiModelProperty("项目id") + @ApiModelProperty(name = "项目id", required = true) private String projectId; - @ApiModelProperty("机组名称") - private String turbineName; + @ApiModelProperty("查询关键字") + private String keyword; @ApiModelProperty("机组描述") private String turbineDesc; @ApiModelProperty("机组厂商") - private String manufacturer; + private String turbineManufacturer; @ApiModelProperty("机组型号") - private String model; + private String turbineModel; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListResp.java new file mode 100644 index 0000000..8c5af4f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListResp.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.dite.znpt.domain.entity.PartEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.TurbineEntity; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 机组-项目关联响应实体 + */ +@Data +@ApiModel("机组列表响应实体") +public class TurbineListResp implements Serializable { + + @Serial + private static final long serialVersionUID = 8391079826638511248L; + + @ApiModelProperty("机组号") + private String turbineId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组编码") + private String turbineCode; + + @ApiModelProperty("机组描述") + private String turbineDesc; + + @ApiModelProperty("机组厂商") + private String turbineManufacturer; + + @ApiModelProperty("机组型号") + private String turbineModel; + + @ApiModelProperty("封面图") + private String turbineCoverUrl; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java new file mode 100644 index 0000000..6d3e107 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 21:44 + * @Description: + */ +@Data +@ApiModel("机组请求实体") +public class TurbineReq implements Serializable { + + @Serial + private static final long serialVersionUID = 115092978850852080L; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组编码") + private String turbineCode; + + @ApiModelProperty("机组描述") + private String turbineDesc; + + @ApiModelProperty("机组厂商") + private String turbineManufacturer; + + @ApiModelProperty("机组型号") + private String turbineModel; + + @ApiModelProperty("封面图") + private String turbineCoverUrl; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java index ebc5c48..beb18d9 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java @@ -1,61 +1,48 @@ package com.dite.znpt.domain.vo; -import com.dite.znpt.domain.entity.PartEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.TurbineEntity; -import java.util.List; +import java.io.Serial; +import java.io.Serializable; /** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 机组-项目关联响应实体 + * @Author: gaoxiong + * @Date: 2025/5/7 21:44 + * @Description: */ @Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("机组-项目关联响应实体") -public class TurbineResp extends TurbineEntity { +@ApiModel("机组响应实体") +public class TurbineResp implements Serializable { + @Serial + private static final long serialVersionUID = -1403719853347580858L; - @ApiModelProperty("部件") - private List partsList; + @ApiModelProperty("机组号") + private String turbineId; - @ApiModelProperty("内部工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") - private String antiThunderWorkStatus; + @ApiModelProperty("项目id") + private String projectId; - @ApiModelProperty("外部工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") - private String inWorkStatus; + @ApiModelProperty("项目名称") + private String projectName; - @ApiModelProperty("防雷工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") - private String outWorkStatus; + @ApiModelProperty("机组名称") + private String turbineName; - @ApiModelProperty("数据报告工作状态, -1不存在,0未开始、1开始施工、2已提交报告、3审核通过") - private String summaryWorkStatus; + @ApiModelProperty("机组编码") + private String turbineCode; - @ApiModelProperty("内部工作安全员审核状态, -1不存在,0未审核、1审核通过") - private String antiThunderWorkSafetyStatus; + @ApiModelProperty("机组描述") + private String turbineDesc; - @ApiModelProperty("外部工作安全员审核状态, -1不存在,0未审核、1审核通过") - private String inWorkSafetyStatus; + @ApiModelProperty("机组厂商") + private String turbineManufacturer; - @ApiModelProperty("防雷工作安全员审核状态, -1不存在,0未审核、1审核通过") - private String outWorkSafetyStatus; + @ApiModelProperty("机组型号") + private String turbineModel; - @ApiModelProperty("内部工作质量员审核状态, -1不存在,0未审核、1审核通过") - private String antiThunderWorkQualityStatus; + @ApiModelProperty("封面图") + private String turbineCoverUrl; - @ApiModelProperty("外部工作质量员审核状态, -1不存在,0未审核、1审核通过") - private String inWorkQualityStatus; - - @ApiModelProperty("防雷工作质量员审核状态, -1不存在,0未审核、1审核通过") - private String outWorkQualityStatus; - - @ApiModelProperty("防雷是否不合格,1不合格,0合格") - private Boolean lightningUnqualified; - - @ApiModelProperty("来源, app,backend后台,不传参默认后台") - private String source; } - diff --git a/core/src/main/java/com/dite/znpt/enums/PartTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/PartTypeEnum.java new file mode 100644 index 0000000..3f7d86a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/PartTypeEnum.java @@ -0,0 +1,53 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 21:22 + * @Description: + */ +@Getter +public enum PartTypeEnum { + CABIN("CABIN", "机舱"), + VANE_1("VANE-1", "叶片1"), + VANE_2("VANE-2", "叶片2"), + VANE_3("VANE-3", "叶片3"), + TOWER("TOWER", "塔筒"); + + private final String code; + private final String desc; + + PartTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static PartTypeEnum getByCode(String code){ + for (PartTypeEnum e : PartTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + PartTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(PartTypeEnum.values().length); + for (PartTypeEnum e : PartTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/PartMapper.java b/core/src/main/java/com/dite/znpt/mapper/PartMapper.java index 5027739..efcb3fa 100644 --- a/core/src/main/java/com/dite/znpt/mapper/PartMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/PartMapper.java @@ -3,6 +3,7 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartListResp; import com.dite.znpt.domain.vo.PartResp; import org.apache.ibatis.annotations.Param; @@ -14,6 +15,6 @@ import java.util.List; * @Description: 表数据库访问层 */ public interface PartMapper extends BaseMapper { - List queryBySelective(PartListReq partReq); + List queryBySelective(PartListReq partReq); } diff --git a/core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java b/core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java index c4cb3be..e834f23 100644 --- a/core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/TurbineMapper.java @@ -2,9 +2,9 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.vo.TurbineInfoResp; import com.dite.znpt.domain.vo.TurbineListReq; -import com.dite.znpt.domain.vo.TurbineResp; -import org.apache.ibatis.annotations.Param; +import com.dite.znpt.domain.vo.TurbineListResp; import java.util.List; @@ -14,6 +14,8 @@ import java.util.List; * @Description: 机组-项目关联表数据库访问层 */ public interface TurbineMapper extends BaseMapper { - List queryBySelective(TurbineListReq turbineReq); + List queryBySelective(TurbineListReq turbineReq); + List listTurbineInfo(TurbineListReq turbineReq); + TurbineInfoResp getTurbineInfo(String turbineId); } diff --git a/core/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java index 9bbe22f..1c7c4ed 100644 --- a/core/src/main/java/com/dite/znpt/service/PartService.java +++ b/core/src/main/java/com/dite/znpt/service/PartService.java @@ -3,6 +3,8 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartListResp; +import com.dite.znpt.domain.vo.PartReq; import com.dite.znpt.domain.vo.PartResp; import java.util.List; @@ -15,14 +17,24 @@ import java.util.List; public interface PartService extends IService { /** - * 功能描述:查询列表 + * 功能描述:分页查询列表 * * @param partReq - * @return {@link List }<{@link PartEntity }> + * @return {@link List }<{@link PartListResp }> * @author huise23 * @date 2025/04/11 23:17 **/ - List selectList(PartListReq partReq); + List page(PartListReq partReq); + + /** + * 功能描述:查询列表 + * + * @param partReq + * @return {@link List }<{@link PartListResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List list(PartListReq partReq); /** * 功能描述:查询单条 @@ -32,25 +44,25 @@ public interface PartService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - PartResp selectById(String partId); + PartResp detail(String partId); /** * 功能描述:新增 * - * @param part + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(PartEntity part); + void save(PartReq req); /** * 功能描述:更新 * - * @param part + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(PartEntity part); + void update(String partId, PartReq req); /** * 功能描述:删除 @@ -60,5 +72,15 @@ public interface PartService extends IService { * @date 2025/04/11 23:17 **/ void deleteById(String partId); + + /** + * 功能描述:删除 + * + * @param turbineIds 机组id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteByTurbineIds(List turbineIds); + } diff --git a/core/src/main/java/com/dite/znpt/service/TurbineService.java b/core/src/main/java/com/dite/znpt/service/TurbineService.java index beffffa..4dd8990 100644 --- a/core/src/main/java/com/dite/znpt/service/TurbineService.java +++ b/core/src/main/java/com/dite/znpt/service/TurbineService.java @@ -2,8 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TurbineEntity; -import com.dite.znpt.domain.vo.TurbineListReq; -import com.dite.znpt.domain.vo.TurbineResp; +import com.dite.znpt.domain.vo.*; import java.util.List; @@ -15,50 +14,90 @@ import java.util.List; public interface TurbineService extends IService { /** - * 功能描述:查询机组-项目关联列表 + * 功能描述:分页查询机组列表 * - * @param turbineReq 机组-项目关联 - * @return {@link List }<{@link TurbineEntity }> + * @param req + * @return {@link List }<{@link TurbineListResp }> * @author huise23 * @date 2025/04/11 23:17 **/ - List selectList(TurbineListReq turbineReq); + List page(TurbineListReq req); /** - * 功能描述:查询单条机组-项目关联 + * 功能描述:查询机组列表 * - * @param turbineId 机组-项目关联Id + * @param req + * @return {@link List }<{@link TurbineListResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List list(TurbineListReq req); + + /** + * 功能描述:查询机组明细列表 + * + * @param req + * @return {@link List }<{@link TurbineInfoResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List listInfo(TurbineListReq req); + + /** + * 功能描述:查询指定机组详情 + * + * @param turbineId 机组Id * @return {@link TurbineResp } * @author huise23 * @date 2025/04/11 23:17 **/ - TurbineResp selectById(String turbineId); + TurbineResp detail(String turbineId); /** - * 功能描述:新增机组-项目关联 + * 功能描述:查询指定机组明细内信息 * - * @param turbine 机组-项目关联 + * @param turbineId 机组Id + * @return {@link TurbineListResp } * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(TurbineEntity turbine); + TurbineInfoResp info(String turbineId); /** - * 功能描述:更新机组-项目关联 + * 功能描述:新增机组 * - * @param turbine 机组-项目关联 + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(TurbineEntity turbine); + void save(TurbineReq req); /** - * 功能描述:删除机组-项目关联 + * 功能描述:更新机组 * - * @param turbineId 机组-项目关联Id + * @param turbineId + * @param req + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void update(String turbineId, TurbineReq req); + + /** + * 功能描述:删除机组 + * + * @param turbineId 机组Id * @author huise23 * @date 2025/04/11 23:17 **/ void deleteById(String turbineId); + + /** + * 功能描述:删除机组 + * + * @param projectId 项目id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteByProjectId(String projectId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index b28b9c4..5f4d64e 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -1,16 +1,29 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartListResp; +import com.dite.znpt.domain.vo.PartReq; import com.dite.znpt.domain.vo.PartResp; -import com.dite.znpt.service.PartService; +import com.dite.znpt.enums.PartTypeEnum; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.PartMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.PartService; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.TurbineService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** @@ -22,22 +35,42 @@ import java.util.List; @RequiredArgsConstructor public class PartServiceImpl extends ServiceImpl implements PartService { + @Resource + private ProjectService projectService; + + @Resource + private TurbineService turbineService; + /** - * 功能描述:查询列表 + * 功能描述:分页查询列表 * - * @param partReq 信息 - * @return {@link List }<{@link PartResp }> + * @param req 信息 + * @return {@link List }<{@link PartListResp }> * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public List selectList(PartListReq partReq) { + public List page(PartListReq req) { PageUtil.startPage(); - List partList= this.baseMapper.queryBySelective(partReq); - partList.forEach(resp -> { - + return this.list(req); + } + + /** + * 功能描述:查询列表 + * + * @param req 信息 + * @return {@link List }<{@link PartListResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List list(PartListReq req) { + PageUtil.startPage(); + List list= this.baseMapper.queryBySelective(req); + list.forEach(resp -> { + resp.setPartTypeLabel(PartTypeEnum.getDescByCode(resp.getPartType())); }); - return partList; + return list; } /** @@ -49,38 +82,55 @@ public class PartServiceImpl extends ServiceImpl impleme * @date 2025/04/11 23:17 **/ @Override - public PartResp selectById(String partId) { - PartListReq partReq = new PartListReq(); - partReq.setPartId(partId); - - List list = selectList(partReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new PartResp(); + public PartResp detail(String partId) { + PartEntity entity = this.baseMapper.selectById(partId); + PartResp resp = Converts.INSTANCE.toPartResp(entity); + if(StrUtil.isNotEmpty(resp.getTurbineId())){ + TurbineEntity turbine = turbineService.getById(resp.getTurbineId()); + if(null != turbine){ + resp.setTurbineId(turbine.getTurbineName()); + if(StrUtil.isNotEmpty(turbine.getProjectId())){ + ProjectEntity project = projectService.getById(turbine.getProjectId()); + if(null != project){ + resp.setProjectName(project.getProjectName()); + } + } + } + } + return resp; } /** * 功能描述:新增 * - * @param part + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void saveData(PartEntity part) { -// todo 校验 - save(part); + public void save(PartReq req) { + PartEntity entity = Converts.INSTANCE.toPartEntity(req); + this.save(entity); } /** * 功能描述:更新 * - * @param part + * @param partId + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void updateData(PartEntity part) { -// todo 校验 - updateById(part); + public void update(String partId, PartReq req) { + if(null == this.baseMapper.selectById(partId)){ + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } + PartEntity entity = Converts.INSTANCE.toPartEntity(req); + entity.setPartId(partId); + this.updateById(entity); } /** @@ -90,10 +140,25 @@ public class PartServiceImpl extends ServiceImpl impleme * @author huise23 * @date 2025/04/11 23:17 **/ + + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String partId) { -// todo 校验 removeById(partId); } + /** + * 功能描述:删除 + * + * @param turbineIds 机组id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteByTurbineIds(List turbineIds) { + this.baseMapper.delete(Wrappers.lambdaQuery().in(PartEntity::getTurbineId, turbineIds)); + } + + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java index 024b28d..0ad42e3 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java @@ -1,17 +1,27 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.TurbineEntity; -import com.dite.znpt.domain.vo.TurbineListReq; -import com.dite.znpt.domain.vo.TurbineResp; -import com.dite.znpt.service.TurbineService; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.TurbineMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.PartService; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.TurbineService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * @author huise23 @@ -22,78 +32,147 @@ import java.util.List; @RequiredArgsConstructor public class TurbineServiceImpl extends ServiceImpl implements TurbineService { + @Resource + private ProjectService projectService; + + @Resource + private PartService partService; + /** - * 功能描述:查询机组-项目关联列表 + * 功能描述:分页查询机组列表 * - * @param turbineReq 机组-项目关联信息 - * @return {@link List }<{@link TurbineResp }> + * @param req + * @return {@link List }<{@link TurbineListResp }> * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public List selectList(TurbineListReq turbineReq) { + public List page(TurbineListReq req) { PageUtil.startPage(); - List turbineList= this.baseMapper.queryBySelective(turbineReq); - turbineList.forEach(resp -> { - - }); - return turbineList; + return this.list(req); } /** - * 功能描述:查询单条机组-项目关联 + * 功能描述:查询机组列表 * - * @param turbineId 机组-项目关联Id + * @param req + * @return {@link List }<{@link TurbineEntity }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List list(TurbineListReq req) { + List list= this.baseMapper.queryBySelective(req); + return list; + } + + /** + * 功能描述:查询机组明细列表 + * + * @param req + * @return {@link List }<{@link TurbineInfoResp }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List listInfo(TurbineListReq req) { + List list= this.baseMapper.listTurbineInfo(req); + return list; + } + + /** + * 功能描述:查询单条机组 + * + * @param turbineId 机组Id * @return {@link TurbineResp } * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public TurbineResp selectById(String turbineId) { - TurbineListReq turbineReq = new TurbineListReq(); - turbineReq.setTurbineId(turbineId); - - List list = selectList(turbineReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new TurbineResp(); + public TurbineResp detail(String turbineId) { + TurbineEntity entity = this.baseMapper.selectById(turbineId); + TurbineResp resp = Converts.INSTANCE.toTurbineResp(entity); + if(null != resp && StrUtil.isNotEmpty(resp.getProjectId())){ + ProjectEntity project = projectService.getById(resp.getProjectId()); + resp.setProjectName(project.getProjectName()); + } + return resp; } /** - * 功能描述:新增机组-项目关联 + * 功能描述:查询指定机组明细内信息 * - * @param turbine 机组-项目关联 + * @param turbineId 机组Id + * @return {@link TurbineListResp } * @author huise23 * @date 2025/04/11 23:17 **/ @Override - public void saveData(TurbineEntity turbine) { -// todo 校验 - save(turbine); + public TurbineInfoResp info(String turbineId) { + return this.baseMapper.getTurbineInfo(turbineId); } /** - * 功能描述:更新机组-项目关联 + * 功能描述:新增机组 * - * @param turbine 机组-项目关联 + * @param req * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override - public void updateData(TurbineEntity turbine) { -// todo 校验 - updateById(turbine); + public void save(TurbineReq req) { + TurbineEntity entity = Converts.INSTANCE.toTurbineEntity(req); + this.save(entity); } /** - * 功能描述:删除机组-项目关联 + * 功能描述:更新机组 + * + * @param turbineId + * @param req + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String turbineId, TurbineReq req) { + if(null == this.baseMapper.selectById(turbineId)){ + throw new ServiceException(Message.TURBINE_ID_IS_NOT_EXIST); + } + TurbineEntity entity = Converts.INSTANCE.toTurbineEntity(req); + entity.setTurbineId(turbineId); + this.updateById(entity); + } + + /** + * 功能描述:删除机组 * * @param turbineId 机组-项目关联Id * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String turbineId) { -// todo 校验 removeById(turbineId); + partService.deleteByTurbineIds(Arrays.asList(turbineId)); + } + + /** + * 功能描述:删除机组 + * + * @param projectId 项目id + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteByProjectId(String projectId) { + List turbineList = this.baseMapper.selectList(Wrappers.lambdaQuery().eq(TurbineEntity::getProjectId, projectId)); + List turbineIds = turbineList.stream().map(TurbineEntity::getTurbineId).collect(Collectors.toList()); + this.baseMapper.deleteByIds(turbineIds); + partService.deleteByTurbineIds(turbineIds); } } diff --git a/core/src/main/resources/mapper/PartMapper.xml b/core/src/main/resources/mapper/PartMapper.xml index 3aac7d4..c50f4fa 100644 --- a/core/src/main/resources/mapper/PartMapper.xml +++ b/core/src/main/resources/mapper/PartMapper.xml @@ -2,46 +2,31 @@ - - a.part_id, a.project_id, a.turbine_id, a.part_name, - a.part_code, a.part_type, a.part_desc, a.manufacturer, - a.model - - + SELECT + pa.part_id, t.project_id, pr.project_name, t.turbine_id, t.turbine_name, pa.part_name, pa.part_code, pa.part_type, pa.part_desc + FROM part pa + LEFT JOIN turbine t ON pa.turbine_id = t.turbine_id + LEFT JOIN project pr ON t.project_id = pr.project_id -# and (a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - - and a.part_id like concat ('%', #{partId}, '%') +# and (pa.part_name like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or pa.part_code like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - and a.project_id like concat ('%', #{projectId}, '%') + and t.project_id = #{projectId} - and a.turbine_id like concat ('%', #{turbineId}, '%') - - - and a.part_name like concat ('%', #{partName}, '%') - - - and a.part_code like concat ('%', #{partCode}, '%') + and t.turbine_id = #{turbineId} - and a.part_type like concat ('%', #{partType}, '%') + and a.part_type = #{partType} - - and a.part_desc like concat ('%', #{partDesc}, '%') + + and a.part_manufacturer like concat ('%', #{partManufacturer}, '%') - - and a.manufacturer like concat ('%', #{manufacturer}, '%') - - - and a.model like concat ('%', #{model}, '%') + + and a.part_model like concat ('%', #{partModel}, '%') diff --git a/core/src/main/resources/mapper/TurbineMapper.xml b/core/src/main/resources/mapper/TurbineMapper.xml index dc23a95..a7b2ab2 100644 --- a/core/src/main/resources/mapper/TurbineMapper.xml +++ b/core/src/main/resources/mapper/TurbineMapper.xml @@ -2,38 +2,89 @@ - - a.turbine_id, a.project_id, a.turbine_name, a.turbine_desc, - a.manufacturer, a.model - - - + SELECT + t.turbine_id, t.project_id, p.project_name, t.turbine_name, t.turbine_code, t.turbine_desc, t.turbine_manufacturer, t.turbine_model, t.turbine_cover_url + FROM turbine t + LEFT JOIN project p ON t.project_id = p.project_id -# and (a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - - and a.turbine_id like concat ('%', #{turbineId}, '%') + and (t.turbine_name like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or t.turbine_code like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - and a.project_id like concat ('%', #{projectId}, '%') - - - and a.turbine_name like concat ('%', #{turbineName}, '%') + and t.project_id = #{projectId} - and a.turbine_desc like concat ('%', #{turbineDesc}, '%') + and t.turbine_desc like concat ('%', #{turbineDesc}, '%') - and a.manufacturer like concat ('%', #{manufacturer}, '%') + and t.turbine_manufacturer like concat ('%', #{manufacturer}, '%') - and a.model like concat ('%', #{model}, '%') + and t.turbine_model like concat ('%', #{model}, '%') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/PartController.java b/web/src/main/java/com/dite/znpt/web/controller/PartController.java index f46d8a0..f9586f6 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PartController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PartController.java @@ -3,6 +3,8 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; import com.dite.znpt.domain.vo.PartListReq; +import com.dite.znpt.domain.vo.PartListResp; +import com.dite.znpt.domain.vo.PartReq; import com.dite.znpt.domain.vo.PartResp; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.service.PartService; @@ -30,29 +32,35 @@ public class PartController { @Resource private PartService partService; - @ApiOperation(value = "获取列表", httpMethod = "GET") + @ApiOperation(value = "分页获取部件列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(PartListReq partReq) { + return PageResult.ok(partService.page(partReq)); + } + + @ApiOperation(value = "获取部件列表", httpMethod = "GET") @GetMapping("/list") - public PageResult list(PartListReq partReq) { - return PageResult.ok(partService.selectList(partReq)); + public Result> list(PartListReq partReq) { + return Result.ok(partService.list(partReq)); } @ApiOperation(value = "根据Id获取详细信息", httpMethod = "GET") - @GetMapping("/{partId}") - public Result getInfo(@PathVariable String partId) { - return Result.ok(partService.selectById(partId)); + @GetMapping("/detail/{partId}") + public Result detail(@PathVariable String partId) { + return Result.ok(partService.detail(partId)); } @ApiOperation(value = "新增", httpMethod = "POST") @PostMapping - public Result add(@RequestBody PartEntity part) { - partService.saveData(part); + public Result add(@RequestBody PartReq req) { + partService.save(req); return Result.ok(); } @ApiOperation(value = "修改", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody PartEntity part) { - partService.updateData(part); + @PutMapping("/{partId}") + public Result edit(@PathVariable String partId, @RequestBody PartReq req) { + partService.update(partId, req); return Result.ok(); } @@ -63,14 +71,14 @@ public class PartController { return Result.ok(); } - @ApiOperation(value = "导出", httpMethod = "GET") + @ApiOperation(value = "导出部件-需求待明确", httpMethod = "GET") @GetMapping("/export") - @ResponseExcel(name = "") - public List export(PartListReq partReq) { - return partService.selectList(partReq); + @ResponseExcel(name = "部件") + public List export(PartListReq partReq) { + return partService.list(partReq); } - @ApiOperation(value = "导入", httpMethod = "POST") + @ApiOperation(value = "导入部件-需求待明确", httpMethod = "POST") @PostMapping("/import") public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 diff --git a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java index 2b970bd..5929d14 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java @@ -2,10 +2,8 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.TurbineListReq; -import com.dite.znpt.domain.vo.TurbineResp; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.domain.entity.TurbineEntity; -import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.TurbineService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; @@ -18,61 +16,78 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.List; /** * @author huise23 * @date 2025/04/11 23:17 */ -@Api(tags = "机组-项目关联") +@Api(tags = "机组信息") @RestController @RequestMapping("/turbine") public class TurbineController { @Resource private TurbineService turbineService; - @ApiOperation(value = "获取机组-项目关联列表", httpMethod = "GET") - @GetMapping({"/list", "/getByProjectId"}) - public PageResult list(TurbineListReq turbineReq) { - return PageResult.ok(turbineService.selectList(turbineReq)); + @ApiOperation(value = "分页查询机组列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(TurbineListReq req) { + return PageResult.ok(turbineService.page(req)); } - @ApiOperation(value = "根据机组-项目关联Id获取详细信息", httpMethod = "GET") - @GetMapping("/{turbineCode}") - public Result getInfo(@PathVariable String turbineCode) { - return Result.ok(turbineService.selectById(turbineCode)); + @ApiOperation(value = "查询机组列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(TurbineListReq req) { + return Result.ok(turbineService.list(req)); } - @ApiOperation(value = "新增机组-项目关联", httpMethod = "POST") + @ApiOperation(value = "查询机组明细列表", httpMethod = "GET") + @GetMapping("/list/info") + public Result> listInfo( TurbineListReq req) { + return Result.ok(turbineService.listInfo(req)); + } + + @ApiOperation(value = "获取指定机组详情", httpMethod = "GET") + @GetMapping("/detail/{turbineId}") + public Result detail(@PathVariable String turbineId) { + return Result.ok(turbineService.detail(turbineId)); + } + + @ApiOperation(value = "获取指定机组明细详情", httpMethod = "GET") + @GetMapping("/info/{turbineId}") + public Result info(@PathVariable String turbineId) { + return Result.ok(turbineService.info(turbineId)); + } + + @ApiOperation(value = "新增机组", httpMethod = "POST") @PostMapping - public Result add(@RequestBody TurbineEntity turbine) { - turbineService.saveData(turbine); + public Result add(@RequestBody TurbineReq req) { + turbineService.save(req); return Result.ok(); } - @ApiOperation(value = "修改机组-项目关联", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody TurbineEntity turbine) { - turbineService.updateData(turbine); + @ApiOperation(value = "修改机组", httpMethod = "PUT") + @PutMapping("/{turbineId}") + public Result edit(@PathVariable String turbineId, @RequestBody TurbineReq req) { + turbineService.update(turbineId, req); return Result.ok(); } - @ApiOperation(value = "删除机组-项目关联", httpMethod = "DELETE") - @DeleteMapping("/{turbineCode}") - public Result remove(@PathVariable String turbineCode) { - turbineService.deleteById(turbineCode); + @ApiOperation(value = "删除机组", httpMethod = "DELETE") + @DeleteMapping("/{turbineId}") + public Result remove(@PathVariable String turbineId) { + turbineService.deleteById(turbineId); return Result.ok(); } - @ApiOperation(value = "导出机组-项目关联", httpMethod = "GET") + @ApiOperation(value = "导出机组-需求待明确", httpMethod = "GET") @GetMapping("/export") - @ResponseExcel(name = "机组-项目关联") - public List export(TurbineListReq turbineReq) { - return turbineService.selectList(turbineReq); + @ResponseExcel(name = "机组") + public List export(TurbineListReq turbineReq) { + return turbineService.list(turbineReq); } - @ApiOperation(value = "导入机组-项目关联", httpMethod = "POST") + @ApiOperation(value = "导入机组-需求待明确", httpMethod = "POST") @PostMapping("/import") public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 From a819d1e9ad3d4dda173e8c0ee1b6a255da6203a3 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 12 May 2025 00:19:07 +0800 Subject: [PATCH 030/143] =?UTF-8?q?1=E3=80=81=E6=9C=BA=E7=BB=84=E5=92=8C?= =?UTF-8?q?=E9=83=A8=E4=BB=B6=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90100%=202?= =?UTF-8?q?=E3=80=81=E9=85=8D=E5=90=88app=E7=AB=AF=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E5=92=8C=E7=BC=BA=E9=99=B7=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../java/com/dite/znpt/converts/Converts.java | 2 + .../domain/entity/ImageCollectEntity.java | 4 - .../dite/znpt/domain/entity/ImageEntity.java | 4 + .../dite/znpt/domain/vo/ImageSimpleReq.java | 29 +++++++ .../dite/znpt/domain/vo/OutWorkDefectReq.java | 27 +++++++ .../com/dite/znpt/enums/DefectSourceEnum.java | 3 +- .../com/dite/znpt/enums/ImageSourceEnum.java | 55 +++++++++++++ .../com/dite/znpt/service/DefectService.java | 10 +++ .../znpt/service/ImageCollectService.java | 2 +- .../com/dite/znpt/service/ImageService.java | 12 +-- .../znpt/service/impl/DefectServiceImpl.java | 37 ++++++++- .../service/impl/ImageCollectServiceImpl.java | 14 +++- .../znpt/service/impl/ImageServiceImpl.java | 78 ++++++++++++++++--- .../src/main/resources/mapper/ImageMapper.xml | 4 +- .../znpt/web/controller/CommonController.java | 23 +++++- .../znpt/web/controller/ImageController.java | 20 +++-- web/src/main/resources/application-dev.yml | 4 +- 18 files changed, 286 insertions(+), 43 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageSimpleReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/OutWorkDefectReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index f1ed7a3..da8d4db 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -19,4 +19,5 @@ public class Message implements Serializable { public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; + public static final String IMAGE_SOURCE_I_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 3998a5d..699c4ab 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -19,6 +19,8 @@ public interface Converts { List toImageEntity(List list); + List toImageSimpleReq(List list); + ImageCollectEntity toImageCollectEntity(ImageCollectReq req); DefectEntity toDefectEntity(DefectReq req); diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java index b87a04c..dbd7331 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java @@ -32,10 +32,6 @@ public class ImageCollectEntity extends AuditableEntity implements Serializable @TableId(value = "collect_id", type = IdType.ASSIGN_UUID) private String collectId; - @ApiModelProperty("部件id") - @TableField("part_id") - private String partId; - @ApiModelProperty("拍摄时间-起") @TableField("shooting_time_begin") private LocalDateTime shootingTimeBegin; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 8a87c8c..2955ab4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -33,6 +33,10 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableId(value = "image_id", type = IdType.ASSIGN_UUID) private String imageId; + @ApiModelProperty("部件id") + @TableField("part_id") + private String partId; + @ApiModelProperty("图像采集id") @TableField("collect_id") private String collectId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageSimpleReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageSimpleReq.java new file mode 100644 index 0000000..e0000d0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageSimpleReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/11 22:29 + * @Description: + */ +@Data +@ApiModel("图像简要信息请求实体") +public class ImageSimpleReq implements Serializable { + @Serial + private static final long serialVersionUID = 4813411833253078204L; + + @ApiModelProperty(name = "部件id", required = true) + private String partId; + + @ApiModelProperty(name = "图像来源,枚举:ImageSourceEnum", required = true) + private String imageSource; + + @ApiModelProperty(name = "图像路径", required = true) + private String imagePath; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutWorkDefectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutWorkDefectReq.java new file mode 100644 index 0000000..4b910e7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutWorkDefectReq.java @@ -0,0 +1,27 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/11 21:20 + * @Description: + */ +@Data +@ApiModel("外部工作上报缺陷请求实体") +public class OutWorkDefectReq extends DefectReq implements Serializable { + + @Serial + private static final long serialVersionUID = -9109852601298547208L; + + @ApiModelProperty(name = "图像路径", required = true) + private String imagePath; + + @ApiModelProperty(name = "部件id", required = true) + private String partId; +} diff --git a/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java index e05bcdd..92d59b6 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectSourceEnum.java @@ -14,7 +14,8 @@ import java.util.List; @Getter public enum DefectSourceEnum { AI("AI", "智能识别"), - MANUAL("MANUAL", "人工标注"); + MANUAL("MANUAL", "人工标注"), + OUT_WORK("MANUAL", "外部工作"); private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java new file mode 100644 index 0000000..9532d99 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java @@ -0,0 +1,55 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/11 23:35 + * @Description: + */ +@Getter +public enum ImageSourceEnum { + COLLECT("collect", "图像采集", Boolean.TRUE), + OUT_WORK("out-work", "外部工作", Boolean.TRUE), + LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作", Boolean.FALSE); + + private final String code; + private final String desc; + private final boolean isDefectImage; + + ImageSourceEnum(String code, String desc, boolean isDefectImage){ + this.code = code; + this.desc = desc; + this.isDefectImage = isDefectImage; + } + + public static ImageSourceEnum getByCode(String code){ + for (ImageSourceEnum e : ImageSourceEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ImageSourceEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List list(Boolean isDefectImage){ + List list = new ArrayList<>(ImageSourceEnum.values().length); + for (ImageSourceEnum e : ImageSourceEnum.values() ) { + if(isDefectImage.equals(e.isDefectImage)){ + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java index b29c40d..1a0fdb1 100644 --- a/core/src/main/java/com/dite/znpt/service/DefectService.java +++ b/core/src/main/java/com/dite/znpt/service/DefectService.java @@ -5,6 +5,7 @@ import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.domain.vo.OutWorkDefectReq; import java.util.List; @@ -47,6 +48,15 @@ public interface DefectService extends IService { **/ void save(String imageId, DefectReq req); + /** + * 功能描述:新增外部工作缺陷记录 + * + * @param list + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List saveOutWorkDefect(List list); + /** * 功能描述:更新缺陷记录 * diff --git a/core/src/main/java/com/dite/znpt/service/ImageCollectService.java b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java index 9c6819c..1c961bf 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageCollectService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageCollectService.java @@ -10,5 +10,5 @@ import com.dite.znpt.domain.vo.ImageCollectReq; * @Description: */ public interface ImageCollectService extends IService { - void save(String departId, ImageCollectReq req); + void save(String partId, ImageCollectReq req); } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index cd24553..d4e1115 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -2,12 +2,10 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.ImageEntity; -import com.dite.znpt.domain.vo.ImageListReq; -import com.dite.znpt.domain.vo.ImageListResp; -import com.dite.znpt.domain.vo.ImageReq; -import com.dite.znpt.domain.vo.ImageResp; +import com.dite.znpt.domain.vo.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; /** @@ -21,9 +19,13 @@ public interface ImageService extends IService { List page(ImageListReq req); + List batchSaveByImageSimpleReq(List list); + ImageResp detail(String imageId); - List batchUpload(String departId, MultipartFile[] files); + List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files); + + String uploadCommonImage(String imageSource, MultipartFile file) throws IOException; void delete(String imageId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index ac08810..b2cd108 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -1,12 +1,12 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.DefectEntity; -import com.dite.znpt.domain.vo.DefectListReq; -import com.dite.znpt.domain.vo.DefectReq; -import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.DefectSourceEnum; import com.dite.znpt.enums.DefectTypeEnum; import com.dite.znpt.enums.RepairStatusEnum; @@ -15,13 +15,16 @@ import com.dite.znpt.service.DefectService; import com.dite.znpt.mapper.DefectMapper; import com.dite.znpt.service.ImageService; import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author huise23 @@ -87,9 +90,35 @@ public class DefectServiceImpl extends ServiceImpl i throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); } DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); + defectEntity.setImageId(imageId); this.save(defectEntity); } + /** + * 功能描述:新增外部工作缺陷记录 + * + * @param list + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List saveOutWorkDefect(List list) { + List imageSimpleReqList = Converts.INSTANCE.toImageSimpleReq(list); + List imageEntityList = imageService.batchSaveByImageSimpleReq(imageSimpleReqList); + Map imageMap = imageEntityList.stream().collect(Collectors.toMap(k->k.getPartId().concat(StrUtil.COLON).concat(k.getImagePath()), Function.identity())); + List defectEntityList = new ArrayList<>(); + list.stream().forEach(req -> { + String key = req.getPartId().concat(StrUtil.COLON).concat(req.getImagePath()); + if(imageMap.containsKey(key)){ + DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); + defectEntity.setImageId(imageMap.get(key).getImageId()); + defectEntityList.add(defectEntity); + } + }); + this.saveBatch(defectEntityList); + return defectEntityList; + } + /** * 功能描述:更新缺陷记录 * diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 8fbe3d3..9f8f85c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -9,10 +9,12 @@ import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; +import com.dite.znpt.service.PartService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,26 +37,32 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); + String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(ImageSourceEnum.COLLECT.getCode()).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); imageList.stream().forEach(image -> { + image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); String path = path_prefix + image.getImageName(); File file = new File(image.getImagePath()); if (file.exists()) { byte[] bytes = FileUtil.readBytes(file); FileUtil.writeBytes(bytes, path); - FileUtil.del(file); image.setImagePath(path); + FileUtil.del(file); }else { imageList.remove(image); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 3f6b053..de2a2e2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -8,19 +8,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.ImageEntity; -import com.dite.znpt.domain.vo.ImageListReq; -import com.dite.znpt.domain.vo.ImageListResp; -import com.dite.znpt.domain.vo.ImageReq; -import com.dite.znpt.domain.vo.ImageResp; -import com.dite.znpt.enums.ImageTypeEnum; -import com.dite.znpt.enums.ShootingMethodEnum; -import com.dite.znpt.enums.WeatherEnum; +import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageMapper; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; +import com.dite.znpt.service.PartService; import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; +import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,14 +26,19 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * @author Bear.G @@ -48,9 +51,14 @@ public class ImageServiceImpl extends ServiceImpl impl @Resource private ImageCollectService imageCollectService; + @Resource + private PartService partService; + @Value("${upload.temp-path}") private String tempPath; + @Value("${upload.perm-path}") + private String permPath; @Override public List list(ImageListReq req) { List partList= this.baseMapper.queryImageList(req); @@ -68,22 +76,54 @@ public class ImageServiceImpl extends ServiceImpl impl return this.list(req); } + @Override + public List batchSaveByImageSimpleReq(List list){ + List imageList = new ArrayList<>(); + List partIds = list.stream().map(ImageSimpleReq::getPartId).collect(Collectors.toList()); + Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); + list.stream().forEach(req -> { + if(partIdMap.containsKey(req.getPartId())){ + String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + File file = new File(req.getImagePath()); + if(file.exists() && req.getImagePath().contains(temp_path_prefix)){ + ImageEntity entity = new ImageEntity(); + entity.setPartId(req.getPartId()); + String path = path_prefix + StrUtil.removePrefix(req.getImagePath(), temp_path_prefix); + byte[] bytes = FileUtil.readBytes(file); + FileUtil.writeBytes(bytes, path); + FileUtil.del(file); + entity.setImagePath(path); + imageList.add(entity); + } + } + }); + this.saveBatch(imageList); + return imageList; + } + @Override public ImageResp detail(String imageId) { ImageResp imageResp = this.baseMapper.detail(imageId); - imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); - imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + if(null != imageResp && null != imageResp.getImageCollectInfo()){ + imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); + imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + } + return imageResp; } @Transactional(rollbackFor = Exception.class) @Override - public List batchUpload(String departId, MultipartFile[] files) { + public List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files) { + if(null == partService.getById(partId)){ + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } if(null == files || files.length == 0){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } List list = new ArrayList<>(files.length); - String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(departId).concat(StrUtil.BACKSLASH); + String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); for (MultipartFile file : files) { if (!file.isEmpty()) { try { @@ -98,6 +138,22 @@ public class ImageServiceImpl extends ServiceImpl impl return list; } + @Override + public String uploadCommonImage(String imageSource, MultipartFile file) throws IOException { + if(null == file){ + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + ImageSourceEnum imageSourceEnum = ImageSourceEnum.getByCode(imageSource); + if(null == imageSourceEnum || imageSourceEnum.isDefectImage()){ + throw new ServiceException(Message.IMAGE_SOURCE_I_NOT_EXIST_OR_ILLEGAL); + } + String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(dateStr).concat(StrUtil.BACKSLASH); + String path = path_prefix + file.getOriginalFilename(); + FileUtil.writeBytes(file.getBytes(),path); + return path; + } + @Transactional(rollbackFor = Exception.class) @Override public void delete(String imageId) { diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 231499c..9800029 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -3,12 +3,12 @@ SELECT - prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, - prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.construction_person_id, prj.construction_person_name , prj.create_time + prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, + prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids, + GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.create_time FROM project prj - LEFT JOIN person pm ON pm.person_id = prj.project_manager_id AND prj.project_name LIKE concat ('%', #{projectName}, '%') @@ -30,6 +30,9 @@ AND prj.create_time BETWEEN #{createDateBegin} AND #{createDateEnd} + GROUP BY prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, + prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name, prj.constructor_ids, + prj.create_time diff --git a/core/src/main/resources/mapper/PersonnelMapper.xml b/core/src/main/resources/mapper/UserMapper.xml similarity index 80% rename from core/src/main/resources/mapper/PersonnelMapper.xml rename to core/src/main/resources/mapper/UserMapper.xml index 6b8887e..7c12da4 100644 --- a/core/src/main/resources/mapper/PersonnelMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -1,22 +1,22 @@ - + - a.person_id, a.name, a.role_type, a.company_id, + a.user_id, a.name, a.role_type, a.company_id, a.password, a.status - select - from personnel a + from user a # and (a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - and a.person_id like concat ('%', #{personId}, '%') + + and a.user_id like concat ('%', #{user_id}, '%') and a.name like concat ('%', #{name}, '%') diff --git a/web/src/main/java/com/dite/znpt/web/controller/PersonController.java b/web/src/main/java/com/dite/znpt/web/controller/PersonController.java deleted file mode 100644 index f1d82f8..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/PersonController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.domain.Constants; -import com.dite.znpt.domain.vo.PersonListReq; -import com.dite.znpt.domain.vo.PersonResp; -import com.dite.znpt.domain.entity.PersonEntity; -import com.dite.znpt.service.PersonService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "人员信息") -@RestController -@RequestMapping("/person") -public class PersonController { - @Resource - private PersonService personService; - - @ApiOperation(value = "获取人员信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(PersonListReq personnelReq) { - return PageResult.ok(personService.selectList(personnelReq)); - } - - @ApiOperation(value = "根据人员信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{personId}") - public Result getInfo(@PathVariable String personId) { - return Result.ok(personService.selectById(personId)); - } - - @ApiOperation(value = "新增人员信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody PersonEntity personnel) { - personService.saveData(personnel); - return Result.ok(); - } - - @ApiOperation(value = "修改人员信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody PersonEntity personnel) { - personService.updateData(personnel); - return Result.ok(); - } - - @ApiOperation(value = "删除人员信息", httpMethod = "DELETE") - @DeleteMapping("/{personId}") - public Result remove(@PathVariable String personId) { - personService.deleteById(personId); - return Result.ok(); - } - - @ApiOperation(value = "导出人员信息", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "人员信息") - public List export(PersonListReq personnelReq) { - return personService.selectList(personnelReq); - } - - @ApiOperation(value = "导入人员信息", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - diff --git a/web/src/main/java/com/dite/znpt/web/controller/UserController.java b/web/src/main/java/com/dite/znpt/web/controller/UserController.java new file mode 100644 index 0000000..d29e6d9 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/UserController.java @@ -0,0 +1,94 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.domain.vo.UserListReq; +import com.dite.znpt.domain.vo.UserReq; +import com.dite.znpt.domain.vo.UserResp; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.service.UserService; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.PageResult; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + */ +@Api(tags = "用户信息") +@RestController +@RequestMapping("/user") +public class UserController { + @Resource + private UserService userService; + + @ApiOperation(value = "分页查询用户信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(UserListReq req) { + return PageResult.ok(userService.page(req)); + } + + @ApiOperation(value = "查询用户信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(UserListReq req) { + return PageResult.ok(userService.list(req)); + } + + @ApiOperation(value = "根据用户信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{userId}") + public Result detail(@PathVariable String userId) { + return Result.ok(userService.detail(userId)); + } + + @ApiOperation(value = "新增用户信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody UserReq req) { + userService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改用户信息", httpMethod = "PUT") + @PutMapping("/{userId}") + public Result edit(@PathVariable String userId, @RequestBody UserReq req) { + userService.update(userId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除用户信息", httpMethod = "DELETE") + @DeleteMapping("/{userId}") + public Result remove(@PathVariable String userId) { + userService.deleteById(userId); + return Result.ok(); + } + + @ApiOperation(value = "导出用户信息-需求待明确", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "用户信息") + public List export(UserListReq req) { +// return userService.selectList(req); + // TODO + return null; + } + + @ApiOperation(value = "导入用户信息-需求待明确", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); +// if (errorMessageList != null && !errorMessageList.isEmpty()) { +// return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); +// } +// return Result.okM("导入"+dataList.size()+"条数据"); + // TODO + return null; + } +} + From e98313f0e24893e06b392e5213fd223f51e5548d Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 18 May 2025 16:00:59 +0800 Subject: [PATCH 034/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/resources/mapper/ProjectMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 261f5e3..5cfea27 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -7,8 +7,8 @@ From f169e4e723b8090fd042ea3de4513452fea37f84 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 18 May 2025 16:22:56 +0800 Subject: [PATCH 036/143] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/TurbineMapper.xml | 6 ------ core/src/main/resources/mapper/UserMapper.xml | 18 ------------------ 2 files changed, 24 deletions(-) diff --git a/core/src/main/resources/mapper/TurbineMapper.xml b/core/src/main/resources/mapper/TurbineMapper.xml index a7b2ab2..dd30c09 100644 --- a/core/src/main/resources/mapper/TurbineMapper.xml +++ b/core/src/main/resources/mapper/TurbineMapper.xml @@ -17,12 +17,6 @@ and t.turbine_desc like concat ('%', #{turbineDesc}, '%') - - and t.turbine_manufacturer like concat ('%', #{manufacturer}, '%') - - - and t.turbine_model like concat ('%', #{model}, '%') - diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index 7c12da4..ed3093d 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -12,24 +12,6 @@ from user a - -# and (a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%') or a.TODO like concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - - - and a.user_id like concat ('%', #{user_id}, '%') - - - and a.name like concat ('%', #{name}, '%') - - - and a.role_type like concat ('%', #{roleType}, '%') - - - and a.company_id like concat ('%', #{companyId}, '%') - - - and a.password like concat ('%', #{password}, '%') - and a.status = #{status} From 4639da5dc563211ae552d8cddf69e79ecaa42b5d Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 19 May 2025 00:02:33 +0800 Subject: [PATCH 037/143] =?UTF-8?q?1=E3=80=81=E7=94=A8=E6=88=B7=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5=E5=AE=8C=E6=88=90=202=E3=80=81?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=9C=BA=E7=BB=84=E9=83=A8=E4=BB=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 3 +- .../java/com/dite/znpt/converts/Converts.java | 4 ++ .../znpt/domain/entity/ProjectEntity.java | 4 +- .../dite/znpt/domain/entity/UserEntity.java | 55 ++++++++++++---- .../com/dite/znpt/domain/vo/PartListReq.java | 4 +- .../dite/znpt/domain/vo/TurbineListReq.java | 2 +- .../com/dite/znpt/domain/vo/UserListReq.java | 3 - .../com/dite/znpt/domain/vo/UserListResp.java | 63 +++++++++++++++++++ .../java/com/dite/znpt/domain/vo/UserReq.java | 54 +++++++++++++++- .../com/dite/znpt/domain/vo/UserResp.java | 24 +++++-- .../com/dite/znpt/enums/EducationEnum.java | 57 +++++++++++++++++ .../java/com/dite/znpt/enums/GenderEnum.java | 51 +++++++++++++++ .../znpt/service/impl/ImageServiceImpl.java | 3 +- .../znpt/service/impl/PartServiceImpl.java | 2 +- .../znpt/service/impl/UserServiceImpl.java | 31 +++++++-- .../impl/JobAntiThunderWorkServiceImpl.java | 4 +- .../job/impl/JobInWorkServiceImpl.java | 4 +- .../job/impl/JobOutWorkServiceImpl.java | 4 +- .../job/impl/JobSummaryWorkServiceImpl.java | 4 +- .../main/resources/mapper/ProjectMapper.xml | 11 ++-- .../main/resources/mapper/TurbineMapper.xml | 6 ++ core/src/main/resources/mapper/UserMapper.xml | 20 ++++-- .../znpt/web/controller/CommonController.java | 14 +++++ 23 files changed, 374 insertions(+), 53 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/EducationEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/GenderEnum.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index da8d4db..a14d111 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -19,5 +19,6 @@ public class Message implements Serializable { public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; - public static final String IMAGE_SOURCE_I_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; + public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; + public static final String USER_ID_NOT_EXIST = "部件id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 699c4ab..1ae5dda 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -38,4 +38,8 @@ public interface Converts { PartEntity toPartEntity(PartReq req); PartResp toPartResp(PartEntity entity); + + UserResp toUserResp(UserEntity entity); + + UserEntity toUserEntity(UserReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 26a40ad..b92e0bf 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -99,8 +99,8 @@ public class ProjectEntity extends AuditableEntity implements Serializable { private String projectManagerId; @ApiModelProperty("施工组长id") - @TableField("construction_team_leader_id") - private String constructionTeamLeaderId; + @TableField("construct_team_leader_id") + private String constructTeamLeaderId; @ApiModelProperty("技术方案图片,多个用逗号隔开") @JsonIgnore diff --git a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java index 4eafef5..95c6f86 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.entity; import java.io.Serializable; +import java.time.LocalDate; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; @@ -39,11 +40,31 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("avatar") private String avatar; + @ExcelProperty("密码") + @ApiModelProperty("密码") + @TableField("password") + private String password; + + @ExcelProperty("加密盐") + @ApiModelProperty("加密盐") + @TableField("salt") + private String salt; + + @ExcelProperty("1正常0禁用") + @ApiModelProperty("1正常0禁用") + @TableField("status") + private Integer status; + @ExcelProperty("姓名") @ApiModelProperty("姓名") @TableField("name") private String name; + @ExcelProperty("身份证") + @ApiModelProperty("身份证") + @TableField("identity_card") + private String identityCard; + @ExcelProperty("性别") @ApiModelProperty("性别") @TableField("gender") @@ -59,20 +80,30 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("email") private String email; - @ExcelProperty("密码") - @ApiModelProperty("密码") - @TableField("password") - private String password; + @ExcelProperty("入职日期") + @ApiModelProperty("入职日期") + @TableField("hiredate") + private LocalDate hiredate; - @ExcelProperty("加密盐") - @ApiModelProperty("加密盐") - @TableField("salt") - private String salt; + @ExcelProperty("出生日期") + @ApiModelProperty("出生日期") + @TableField("birthdate") + private LocalDate birthdate; - @ExcelProperty("1正常0禁用") - @ApiModelProperty("1正常0禁用") - @TableField("status") - private Integer status; + @ExcelProperty("学历") + @ApiModelProperty("学历") + @TableField("education") + private String education; + + @ExcelProperty("专业") + @ApiModelProperty("专业") + @TableField("major_field") + private String majorField; + + @ExcelProperty("工作方向") + @ApiModelProperty("工作方向") + @TableField("work_field") + private String workField; @ExcelProperty("最后登录ip") @ApiModelProperty("最后登录ip") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java index d209d6d..fb5ccb0 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java @@ -20,10 +20,10 @@ public class PartListReq implements Serializable { @ApiModelProperty("查询关键字") private String keyword; - @ApiModelProperty(name = "项目id", required = true) + @ApiModelProperty(name = "projectId", required = true) private String projectId; - @ApiModelProperty(name = "机组id", required = true) + @ApiModelProperty(name = "turbineId", required = true) private String turbineId; @ApiModelProperty("类型,枚举PartTypeEnum") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java index ddffeaa..573c4e9 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineListReq.java @@ -17,7 +17,7 @@ public class TurbineListReq implements Serializable { private static final long serialVersionUID = 141552424945497346L; - @ApiModelProperty(name = "项目id", required = true) + @ApiModelProperty(name = "projectId", required = true) private String projectId; @ApiModelProperty("查询关键字") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java index 3d96872..4916041 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java @@ -17,9 +17,6 @@ public class UserListReq implements Serializable { private static final long serialVersionUID = -10363935468256543L; - @ApiModelProperty("查询关键字") - private String keyword; - @ApiModelProperty("账号") private String account; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java new file mode 100644 index 0000000..155c991 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 用户信息请求实体 + */ +@Data +@ApiModel("用户信息列表响应实体") +public class UserListResp implements Serializable { + + @Serial + private static final long serialVersionUID = -3462421684738077713L; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("账号") + private String account; + + @ApiModelProperty("头像地址") + private String avatar; + + @ApiModelProperty("1正常0禁用") + private Integer status; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("身份证") + private String identityCard; + + @ApiModelProperty("性别") + private String gender; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("入职日期") + private LocalDate hiredate; + + @ApiModelProperty("出生日期") + private LocalDate birthdate; + + @ApiModelProperty("学历") + private String education; + + @ApiModelProperty("专业方向") + private String majorField; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index ec6f7f4..676b341 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -1,9 +1,61 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + /** * @Author: gaoxiong * @Date: 2025/5/15 23:14 * @Description: */ -public class UserReq { +@Data +@ApiModel("用户信息请求实体") +public class UserReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5491849652107338027L; + + @ApiModelProperty("头像地址") + private String avatar; + + @ApiModelProperty("1正常0禁用") + private Integer status; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("身份证") + private String identityCard; + + @ApiModelProperty("性别") + private String gender; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("邮箱") + private String email; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("入职日期") + private LocalDate hiredate; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("出生日期") + private LocalDate birthdate; + + @ApiModelProperty("学历") + private String education; + + @ApiModelProperty("专业") + private String majorField; + + @ApiModelProperty("工作方向") + private String workField; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java index 5a85ea6..27d825c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java @@ -1,9 +1,11 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.UserEntity; + +import java.io.Serial; +import java.io.Serializable; /** * @author huise23 @@ -11,8 +13,22 @@ import com.dite.znpt.domain.entity.UserEntity; * @Description: 用户信息响应实体 */ @Data -@EqualsAndHashCode(callSuper = true) @ApiModel("用户信息响应实体") -public class UserResp extends UserEntity { +public class UserResp extends UserReq implements Serializable{ + + @Serial + private static final long serialVersionUID = -2831232930040845716L; + + @ApiModelProperty("用户名") + private String userId; + + @ApiModelProperty("账号") + private String account; + + @ApiModelProperty("学历描述") + private String educationLabel; + + + } diff --git a/core/src/main/java/com/dite/znpt/enums/EducationEnum.java b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java new file mode 100644 index 0000000..16d2684 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java @@ -0,0 +1,57 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/18 21:57 + * @Description: + */ +@Getter +public enum EducationEnum { + PRIMARY_SCHOOL("primary_school","小学"), + MIDDLE_SCHOOL("middle_school","初中"), + HIGH_SCHOOL(" high_school","高中"), + SECONDARY("secondary","中专"), + JUNIOR_COLLEGE("junior_college","大专"), + BACHELOR("bachelor","本科"), + MASTER("master","硕士"), + DOCTOR("doctor","博士"); + + private final String code; + private final String desc; + + EducationEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + + public static EducationEnum getByCode(String code){ + for (EducationEnum e : EducationEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + EducationEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List list(){ + List list = new ArrayList<>(EducationEnum.values().length); + for (EducationEnum e : EducationEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/GenderEnum.java b/core/src/main/java/com/dite/znpt/enums/GenderEnum.java new file mode 100644 index 0000000..957fb95 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/GenderEnum.java @@ -0,0 +1,51 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/18 22:47 + * @Description: + */ +@Getter +public enum GenderEnum { + MALE("male","男"), + FEMALE("female","女"), + UNKNOWN("unknown","未知"); + private final String code; + private final String desc; + + GenderEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + + public static GenderEnum getByCode(String code){ + for (GenderEnum e : GenderEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + GenderEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List list(){ + List list = new ArrayList<>(GenderEnum.values().length); + for (GenderEnum e : GenderEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index de2a2e2..782d5de 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -18,7 +18,6 @@ import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; -import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -145,7 +144,7 @@ public class ImageServiceImpl extends ServiceImpl impl } ImageSourceEnum imageSourceEnum = ImageSourceEnum.getByCode(imageSource); if(null == imageSourceEnum || imageSourceEnum.isDefectImage()){ - throw new ServiceException(Message.IMAGE_SOURCE_I_NOT_EXIST_OR_ILLEGAL); + throw new ServiceException(Message.IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(dateStr).concat(StrUtil.BACKSLASH); diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index 5f4d64e..b32ac99 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -88,7 +88,7 @@ public class PartServiceImpl extends ServiceImpl impleme if(StrUtil.isNotEmpty(resp.getTurbineId())){ TurbineEntity turbine = turbineService.getById(resp.getTurbineId()); if(null != turbine){ - resp.setTurbineId(turbine.getTurbineName()); + resp.setTurbineName(turbine.getTurbineName()); if(StrUtil.isNotEmpty(turbine.getProjectId())){ ProjectEntity project = projectService.getById(turbine.getProjectId()); if(null != project){ diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index 447b95d..b86fa7f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -1,15 +1,20 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.UserListReq; import com.dite.znpt.domain.vo.UserReq; import com.dite.znpt.domain.vo.UserResp; +import com.dite.znpt.enums.EducationEnum; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.UserService; import com.dite.znpt.mapper.UserMapper; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -32,7 +37,8 @@ public class UserServiceImpl extends ServiceImpl impleme **/ @Override public List page(UserListReq req) { - return null; + PageUtil.startPage(); + return this.list(req); } /** @@ -48,7 +54,7 @@ public class UserServiceImpl extends ServiceImpl impleme PageUtil.startPage(); List userRespList= this.baseMapper.queryBySelective(req); userRespList.forEach(resp -> { - + resp.setEducationLabel(EducationEnum.getDescByCode(resp.getEducation())); }); return userRespList; } @@ -63,7 +69,8 @@ public class UserServiceImpl extends ServiceImpl impleme **/ @Override public UserResp detail(String userId) { - return null; + UserEntity entity = this.getById(userId); + return Converts.INSTANCE.toUserResp(entity); } /** @@ -73,9 +80,11 @@ public class UserServiceImpl extends ServiceImpl impleme * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override public void save(UserReq req) { - + UserEntity entity = Converts.INSTANCE.toUserEntity(req); + this.save(entity); } /** @@ -86,9 +95,15 @@ public class UserServiceImpl extends ServiceImpl impleme * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override public void update(String userId, UserReq req) { - + if(null == this.getById(userId)){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + UserEntity entity = Converts.INSTANCE.toUserEntity(req); + entity.setUserId(userId); + this.updateById(entity); } /** @@ -98,9 +113,13 @@ public class UserServiceImpl extends ServiceImpl impleme * @author huise23 * @date 2025/04/11 23:17 **/ + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String userId) { - + if(null == this.getById(userId)){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + this.removeById(userId); } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java index 3a49110..1ee93e3 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobAntiThunderWorkServiceImpl.java @@ -124,7 +124,7 @@ public class JobAntiThunderWorkServiceImpl extends ServiceImpl item.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal())); jobInfo.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); - } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { + } else if (project.getConstructTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } @@ -157,7 +157,7 @@ public class JobAntiThunderWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobInWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobInWorkServiceImpl.java index 5bac81f..cbffff2 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobInWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobInWorkServiceImpl.java @@ -144,7 +144,7 @@ public class JobInWorkServiceImpl extends ServiceImpl item.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal())); jobInfo.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); - } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { + } else if (project.getConstructTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } @@ -176,7 +176,7 @@ public class JobInWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobOutWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobOutWorkServiceImpl.java index 399de33..61c0632 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobOutWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobOutWorkServiceImpl.java @@ -250,7 +250,7 @@ public class JobOutWorkServiceImpl extends ServiceImpl item.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal())); jobInfo.setQualityOfficerStatus(Enums.EAuthStatus.APPROVAL.getVal()); - } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { + } else if (project.getConstructTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } @@ -282,7 +282,7 @@ public class JobOutWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java index b230e7a..662fd51 100644 --- a/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/job/impl/JobSummaryWorkServiceImpl.java @@ -103,7 +103,7 @@ public class JobSummaryWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue())); jobInfo.setStatus(Enums.EWorkStatus.MANAGER_APPROVAL.getValue()); - } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { + } else if (project.getConstructTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue())); jobInfo.setStatus(Enums.EWorkStatus.LEADER_SUBMITTED.getValue()); } @@ -133,7 +133,7 @@ public class JobSummaryWorkServiceImpl extends ServiceImpl item.setStatus(Enums.EWorkStatus.SUBMITTED.getValue())); jobInfo.setStatus(Enums.EWorkStatus.SUBMITTED.getValue()); - } else if (project.getConstructionTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { + } else if (project.getConstructTeamLeaderId().equals(UserContext.getUserInfo().getUserId())) { workList.forEach(item -> item.setStatus(Enums.EWorkStatus.DRAFT.getValue())); jobInfo.setStatus(Enums.EWorkStatus.DRAFT.getValue()); } diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 7e8c790..20c1dbb 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -1,15 +1,14 @@ - - - diff --git a/core/src/main/resources/mapper/TurbineMapper.xml b/core/src/main/resources/mapper/TurbineMapper.xml index dd30c09..5d9c927 100644 --- a/core/src/main/resources/mapper/TurbineMapper.xml +++ b/core/src/main/resources/mapper/TurbineMapper.xml @@ -17,6 +17,12 @@ and t.turbine_desc like concat ('%', #{turbineDesc}, '%') + + and t.turbine_manufacturer like concat ('%', #{turbineManufacturer}, '%') + + + and t.turbine_model like concat ('%', #{turbineModel}, '%') + diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index ed3093d..910b0c4 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -8,12 +8,24 @@ diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index ccd9de2..966109f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -81,14 +81,28 @@ public class CommonController { public Result listWeather(){ return Result.ok(WeatherEnum.listAll()); } + @ApiOperation(value = "查询通用图片来源", httpMethod = "GET") @GetMapping("/list/common-image-source") public Result listCommonImageSource(){ return Result.ok(ImageSourceEnum.list(Boolean.FALSE)); } + + @ApiOperation(value = "查询学历", httpMethod = "GET") + @GetMapping("/list/education") + public Result listEducation(){ + return Result.ok(EducationEnum.list()); + } + @ApiOperation(value = "查询性别", httpMethod = "GET") + @GetMapping("/list/gender") + public Result listGender(){ + return Result.ok(GenderEnum.list()); + } + @ApiOperation(value = "上传图片", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") public Result uploadImage(@PathVariable String imageSource, MultipartFile file) throws IOException { return Result.ok(imageService.uploadCommonImage(imageSource, file)); } + } From 9d2cf4c9167074ee18b6b289b692a1d05f36ed4c Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 19 May 2025 10:27:23 +0800 Subject: [PATCH 038/143] =?UTF-8?q?=E6=9B=BF=E6=8D=A2strUtil.BACKSLASH?= =?UTF-8?q?=E4=B8=BAFileUtil.FILE=5FSEPARATOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/ImageServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 782d5de..9b8e0f2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -82,8 +82,8 @@ public class ImageServiceImpl extends ServiceImpl impl Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); list.stream().forEach(req -> { if(partIdMap.containsKey(req.getPartId())){ - String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); - String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR); + String temp_path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR); File file = new File(req.getImagePath()); if(file.exists() && req.getImagePath().contains(temp_path_prefix)){ ImageEntity entity = new ImageEntity(); @@ -122,7 +122,7 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } List list = new ArrayList<>(files.length); - String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); + String path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); for (MultipartFile file : files) { if (!file.isEmpty()) { try { @@ -147,7 +147,7 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(dateStr).concat(StrUtil.BACKSLASH); + String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR); String path = path_prefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); return path; From b57e6cc4c57cd70496a1f5a69f1aa41dfaac4f52 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 19 May 2025 14:52:43 +0800 Subject: [PATCH 039/143] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/vo/ImageWorkReq.java | 32 +++++++++++++++++++ .../com/dite/znpt/enums/ImageSourceEnum.java | 1 + .../com/dite/znpt/service/ImageService.java | 2 +- .../znpt/service/impl/ImageServiceImpl.java | 21 +++++++++--- .../znpt/web/controller/CommonController.java | 16 ++++++++-- web/src/main/resources/application-dev.yml | 4 +-- 6 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java new file mode 100644 index 0000000..4581c1b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/11 22:29 + * @Description: + */ +@Data +@ApiModel("内部、外部、防雷图像简易请求实体") +public class ImageWorkReq implements Serializable { + @Serial + private static final long serialVersionUID = 4813411833253078204L; + + @ApiModelProperty("上传人") + private String uploadUser; + + @ApiModelProperty("经度") + private String longitude; + + @ApiModelProperty("纬度") + private String latitude; + + @ApiModelProperty("海拔") + private String altitude; +} diff --git a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java index 9532d99..7d75f4b 100644 --- a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java @@ -15,6 +15,7 @@ import java.util.List; public enum ImageSourceEnum { COLLECT("collect", "图像采集", Boolean.TRUE), OUT_WORK("out-work", "外部工作", Boolean.TRUE), + IN_WORK("in-work", "外部工作", Boolean.TRUE), LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作", Boolean.FALSE); private final String code; diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index d4e1115..69d89cc 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -25,7 +25,7 @@ public interface ImageService extends IService { List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files); - String uploadCommonImage(String imageSource, MultipartFile file) throws IOException; + String uploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile file) throws IOException; void delete(String imageId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 9b8e0f2..c3ad777 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -34,6 +34,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -138,16 +139,26 @@ public class ImageServiceImpl extends ServiceImpl impl } @Override - public String uploadCommonImage(String imageSource, MultipartFile file) throws IOException { + public String uploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile file) throws IOException { if(null == file){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } - ImageSourceEnum imageSourceEnum = ImageSourceEnum.getByCode(imageSource); - if(null == imageSourceEnum || imageSourceEnum.isDefectImage()){ - throw new ServiceException(Message.IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL); - } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR); + if (Objects.nonNull(imageWorkReq)) { + if (StrUtil.isNotBlank(imageWorkReq.getUploadUser())) { + path_prefix = path_prefix.concat(imageWorkReq.getUploadUser()).concat(FileUtil.FILE_SEPARATOR); + } + if (StrUtil.isNotBlank(imageWorkReq.getLongitude())) { + path_prefix = path_prefix.concat(imageWorkReq.getLongitude()) + .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getLatitude(), "0")) + .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getAltitude(), "0")) + .concat(FileUtil.FILE_SEPARATOR); + } + } + if (!FileUtil.exist(path_prefix)) { + FileUtil.mkdir(path_prefix); + } String path = path_prefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); return path; diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 966109f..21174b2 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -1,10 +1,12 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.service.ImageService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Parameter; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -101,8 +103,18 @@ public class CommonController { @ApiOperation(value = "上传图片", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") - public Result uploadImage(@PathVariable String imageSource, MultipartFile file) throws IOException { - return Result.ok(imageService.uploadCommonImage(imageSource, file)); + public Result uploadImage(@PathVariable String imageSource, + @Parameter(description = "上传用户")@RequestParam(required = false) String uploadUser, + @Parameter(description = "经度")@RequestParam(required = false) String longitude, + @Parameter(description = "纬度")@RequestParam(required = false) String latitude, + @Parameter(description = "海拔")@RequestParam(required = false) String altitude, + MultipartFile file) throws IOException { + ImageWorkReq workReq = new ImageWorkReq(); + workReq.setUploadUser(uploadUser); + workReq.setLongitude(longitude); + workReq.setLatitude(latitude); + workReq.setAltitude(altitude); + return Result.ok(imageService.uploadCommonImage(imageSource, workReq, file)); } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index e4b6f62..108a5cb 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -117,6 +117,6 @@ zlm-config: dynamicPortEnd: 30185 upload: - temp-path: F:\Upload\Image\Temp - perm-path: F:\Upload\Image + temp-path: d:\Upload\Image\Temp + perm-path: d:\Upload\Image From a84bbf69288dc2105355a57b164ce78075b2ab31 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 19 May 2025 14:53:20 +0800 Subject: [PATCH 040/143] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/main/resources/application-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 108a5cb..e4b6f62 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -117,6 +117,6 @@ zlm-config: dynamicPortEnd: 30185 upload: - temp-path: d:\Upload\Image\Temp - perm-path: d:\Upload\Image + temp-path: F:\Upload\Image\Temp + perm-path: F:\Upload\Image From fbddea1c30fbaa7a2dfb16f1469ada04561db3e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 19 May 2025 18:41:06 +0800 Subject: [PATCH 041/143] =?UTF-8?q?=E7=94=A8=E6=88=B7=E3=80=81=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E3=80=81=E6=9C=BA=E7=BB=84=E5=92=8C=E9=83=A8=E4=BB=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96=E8=BE=91=E6=97=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 7 ++- .../com/dite/znpt/config/WebMvcConfig.java | 24 ++++++--- .../znpt/{domain => constant}/Constants.java | 12 ++++- .../java/com/dite/znpt/constant/Message.java | 2 +- .../java/com/dite/znpt/domain/Result.java | 1 + .../dite/znpt/domain/entity/UserEntity.java | 5 ++ .../java/com/dite/znpt/domain/vo/PartReq.java | 22 +++++--- .../dite/znpt/domain/vo/ProjectListResp.java | 2 +- .../com/dite/znpt/domain/vo/ProjectReq.java | 38 +++++++++----- .../com/dite/znpt/domain/vo/TurbineReq.java | 13 ++++- .../java/com/dite/znpt/domain/vo/UserReq.java | 16 ++++++ .../com/dite/znpt/enums/EducationEnum.java | 1 + .../dite/znpt/enums/ProjectStatusEnum.java | 24 ++++----- .../RestResponseEntityExceptionHandler.java | 2 +- .../com/dite/znpt/service/UserService.java | 2 +- .../service/impl/ImageCollectServiceImpl.java | 4 +- .../znpt/service/impl/ImageServiceImpl.java | 39 ++++++++++----- .../znpt/service/impl/TurbineServiceImpl.java | 26 +++++----- .../znpt/service/impl/UserServiceImpl.java | 27 ++++++++-- .../java/com/dite/znpt/util/PasswordUtil.java | 50 +++++++++++++++++++ .../com/dite/znpt/util/ValidationGroup.java | 14 ++++++ .../controller/CombinedDictController.java | 2 +- .../znpt/web/controller/DefectController.java | 2 +- .../web/controller/FileInfoController.java | 2 +- .../znpt/web/controller/ImageController.java | 1 + .../znpt/web/controller/LoginController.java | 15 ++++++ .../znpt/web/controller/PartController.java | 20 ++++---- .../web/controller/ProjectController.java | 8 +-- .../controller/TConstructionController.java | 2 +- .../web/controller/TurbineController.java | 8 +-- .../znpt/web/controller/UserController.java | 10 ++-- .../web/controller/WeatherTypeController.java | 2 +- 32 files changed, 303 insertions(+), 100 deletions(-) rename core/src/main/java/com/dite/znpt/{domain => constant}/Constants.java (68%) create mode 100644 core/src/main/java/com/dite/znpt/util/ValidationGroup.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/LoginController.java diff --git a/core/pom.xml b/core/pom.xml index 08bc1a5..5c9a597 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -15,7 +15,12 @@ org.springframework.boot spring-boot-starter-web - + + + cn.dev33 + sa-token-spring-boot-starter + 1.43.0 + org.springframework.boot spring-boot-devtools diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index ce50e9b..f93ae4d 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -1,25 +1,33 @@ package com.dite.znpt.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { + + @Value(value = "${upload.temp-path.image}") + private String uploadTempPath; + + @Value(value = "${upload.perm-path.image}") + private String uploadPermPath; + /** * MVC 加载Swagger静态资源 * @param registry */ @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/**") - .addResourceLocations("classpath:/static/"); - registry.addResourceHandler("doc.html") - .addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/"); - registry.addResourceHandler("/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + + registry.addResourceHandler("/image/temp/**").addResourceLocations("file:" + uploadTempPath); + registry.addResourceHandler("/image/**").addResourceLocations("file:" + uploadPermPath); + + registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); super.addResourceHandlers(registry); } } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java similarity index 68% rename from core/src/main/java/com/dite/znpt/domain/Constants.java rename to core/src/main/java/com/dite/znpt/constant/Constants.java index 9e505ae..0cbe777 100644 --- a/core/src/main/java/com/dite/znpt/domain/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -1,4 +1,4 @@ -package com.dite.znpt.domain; +package com.dite.znpt.constant; /** * @description: 常量 @@ -21,4 +21,14 @@ public class Constants { * 参数异常 */ public static final String PARAMETER_EXCEPTION = "000003"; + + /** + * 0:代表存在 + */ + public static final String DEL_FLAG_0 = "0"; + + /** + * 1:代表删除 + */ + public static final String DEL_FLAG_1 = "1"; } diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index a14d111..c627199 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -20,5 +20,5 @@ public class Message implements Serializable { public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; - public static final String USER_ID_NOT_EXIST = "部件id不存在"; + public static final String USER_ID_NOT_EXIST = "用户id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/domain/Result.java b/core/src/main/java/com/dite/znpt/domain/Result.java index 84e188a..f893e22 100644 --- a/core/src/main/java/com/dite/znpt/domain/Result.java +++ b/core/src/main/java/com/dite/znpt/domain/Result.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain; +import com.dite.znpt.constant.Constants; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java index 95c6f86..4681578 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java @@ -45,6 +45,11 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("password") private String password; + @ExcelProperty("是否默认密码") + @ApiModelProperty("是否默认密码") + @TableField("is_default_password") + private Boolean isDefaultPassword; + @ExcelProperty("加密盐") @ApiModelProperty("加密盐") @TableField("salt") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java index 7357675..e916e96 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartReq.java @@ -1,9 +1,12 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; @@ -19,24 +22,31 @@ public class PartReq implements Serializable { @Serial private static final long serialVersionUID = -585044340118904985L; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "机组id不能为空") @ApiModelProperty("机组id") private String turbineId; - @ApiModelProperty("名称") + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "部件名称不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "部件名称长度不能超过50字符") + @ApiModelProperty("部件名称") private String partName; - @ApiModelProperty("编号") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件编号长度不能超过20字符") + @ApiModelProperty("部件编号") private String partCode; - @ApiModelProperty("类型,枚举PartTypeEnum") + @ApiModelProperty("部件类型,枚举PartTypeEnum") private String partType; - @ApiModelProperty("描述") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "部件描述长度不能超过200字符") + @ApiModelProperty("部件描述") private String partDesc; - @ApiModelProperty("厂商") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件厂商长度不能超过20字符") + @ApiModelProperty("部件厂商") private String PartManufacturer; - @ApiModelProperty("型号") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件型号长度不能超过20字符") + @ApiModelProperty("部件型号") private String PartModel; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java index c7545d4..d311d2d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java @@ -34,7 +34,7 @@ public class ProjectListResp implements Serializable { private String farmName; @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") - private String status; + private int status; @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") private String statusLabel; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java index 08f9b63..401ab2b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -1,10 +1,12 @@ package com.dite.znpt.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; +import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; @@ -20,48 +22,57 @@ public class ProjectReq implements Serializable { @Serial private static final long serialVersionUID = 740685592879189406L; - @ExcelProperty("项目名称") + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目名称不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "项目名称长度不能超过50字符") @ApiModelProperty("项目名称") private String projectName; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目封面述长度不能超过100字符") @ApiModelProperty("项目封面") private String coverUrl; - @ExcelProperty("风场名称") + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "风场名称不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "风场名称长度不能超过50字符") @ApiModelProperty("风场名称") private String farmName; - @ExcelProperty("风场地址") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "风场名称长度不能超过100字符") @ApiModelProperty("风场地址") private String farmAddress; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "委托单位长度不能超过50字符") @ApiModelProperty("委托单位") private String client; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "委托单位联系人长度不能超过20字符") @ApiModelProperty("委托单位联系人") private String clientContact; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "委托单位联系电话长度不能超过20字符") @ApiModelProperty("委托单位联系电话") private String clientPhone; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系电话长度不能超过20字符") @ApiModelProperty("检查单位") private String inspectionUnit; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系人长度不能超过20字符") @ApiModelProperty("检查单位联系人") private String inspectionContact; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系电话长度不能超过20字符") @ApiModelProperty("检查单位联系电话") private String inspectionPhone; - @ExcelProperty("项目规模") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "项目规模长度不能超过20字符") @ApiModelProperty("项目规模") private String scale; - @ExcelProperty("风机型号") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "风机型号不能超过20字符") @ApiModelProperty("风机型号") private String turbineModel; - @ApiModelProperty("施工人员id") + @ApiModelProperty(value = "施工人员id", notes = "多个用英文逗号隔开") private String constructorIds; @ApiModelProperty("安全员id") @@ -70,19 +81,20 @@ public class ProjectReq implements Serializable { @ApiModelProperty("质量员id") private String qualityOfficerId; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目经理id不能为空") @ApiModelProperty("项目经理id") private String projectManagerId; @ApiModelProperty("施工组长id") private String constructionTeamLeaderId; - @ApiModelProperty("技术方案图片,多个用逗号隔开") + @ApiModelProperty(value = "技术方案图片", notes = "多项英文逗号隔开") private String technicalImage; @ApiModelProperty("技术方案内容") private String technicalContent; - @ApiModelProperty("安全措施图片,多个用逗号隔开") + @ApiModelProperty(value = "安全措施图片", notes = "多项英文逗号隔开") private String safetyImage; @ApiModelProperty("安全措施内容") @@ -92,14 +104,14 @@ public class ProjectReq implements Serializable { private String discloseContent; @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") - private String status; + private int status; - @ApiModelProperty("项目工作类型 可能有多项,逗号分隔") + @ApiModelProperty(value = "项目工作类型", notes = "多项英文逗号隔开") private String workType; - @ApiModelProperty("项目工作岗位 可能有多项,json对象保存") + @ApiModelProperty(value = "项目工作岗位", notes = "多项英文逗号隔开,json对象保存") private String job; - @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") + @ApiModelProperty(value = "项目安全风险点", notes = "多项英文逗号隔开") private String safetyRiskPoint; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java index 6d3e107..9f3bd7b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java @@ -2,10 +2,13 @@ package com.dite.znpt.domain.vo; import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableField; +import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; @@ -21,25 +24,33 @@ public class TurbineReq implements Serializable { @Serial private static final long serialVersionUID = 115092978850852080L; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目id不能为空") @ApiModelProperty("项目id") private String projectId; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "机组名称不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "机组名称长度不能超过50字符") @ApiModelProperty("机组名称") private String turbineName; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组编码长度不能超过20字符") @ApiModelProperty("机组编码") private String turbineCode; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "机组描述长度不能超过200字符") @ApiModelProperty("机组描述") private String turbineDesc; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组厂商长度不能超过20字符") @ApiModelProperty("机组厂商") private String turbineManufacturer; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组型号长度不能超过20字符") @ApiModelProperty("机组型号") private String turbineModel; - @ApiModelProperty("封面图") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "机组封面图长度不能超过100字符") + @ApiModelProperty("机组封面图") private String turbineCoverUrl; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index 676b341..a8ac046 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -1,10 +1,12 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.util.ValidationGroup; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.*; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; @@ -21,31 +23,43 @@ public class UserReq implements Serializable { @Serial private static final long serialVersionUID = -5491849652107338027L; + @Pattern(groups = {ValidationGroup.Insert.class},regexp = "^[a-zA-Z0-9_]{4,20}$", message = "只能包含字母、数字或下划线,长度4-20") + @ApiModelProperty("账号") + private String account; + + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "头像地址长度不能超过100字符") @ApiModelProperty("头像地址") private String avatar; @ApiModelProperty("1正常0禁用") private Integer status; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "姓名长度不能超过20字符") @ApiModelProperty("姓名") private String name; + @Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp = "^$|\\d(?:\\d{15}|\\d{17})$", message = "身份证号码格式不正确") @ApiModelProperty("身份证") private String identityCard; @ApiModelProperty("性别") private String gender; + @Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp ="^$|1\\d{10}$", message = "手机号码格式不正确") @ApiModelProperty("手机号码") private String mobile; + @Email(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}) + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "邮箱长度不能超过50字符") @ApiModelProperty("邮箱") private String email; + @Past(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "入职日期必须是过去的日期") @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("入职日期") private LocalDate hiredate; + @Past(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "出生日期必须是过去的日期") @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("出生日期") private LocalDate birthdate; @@ -53,9 +67,11 @@ public class UserReq implements Serializable { @ApiModelProperty("学历") private String education; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "专业长度不能超过20字符") @ApiModelProperty("专业") private String majorField; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "工作方向长度不能超过20字符") @ApiModelProperty("工作方向") private String workField; } diff --git a/core/src/main/java/com/dite/znpt/enums/EducationEnum.java b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java index 16d2684..7e4880a 100644 --- a/core/src/main/java/com/dite/znpt/enums/EducationEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java @@ -13,6 +13,7 @@ import java.util.List; */ @Getter public enum EducationEnum { + UNKNOWN("unknown","小学"), PRIMARY_SCHOOL("primary_school","小学"), MIDDLE_SCHOOL("middle_school","初中"), HIGH_SCHOOL(" high_school","高中"), diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java index af7fc89..7836468 100644 --- a/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ProjectStatusEnum.java @@ -15,25 +15,25 @@ import java.util.List; @Getter @AllArgsConstructor public enum ProjectStatusEnum { - PENDING("PENDING","待施工", 0), - IN_PROGRESS("IN_PROGRESS","施工中", 1), - COMPLETED("COMPLETED","已完工", 2), - AUDITED("AUDITED","已审核", 3), - ACCEPTED("ACCEPTED","已验收", 4); - private final String code; - private final String desc; - private final int intValue; + PENDING(0, "待施工"), + IN_PROGRESS(1, "施工中"), + COMPLETED(2, "已完工"), + AUDITED(3, "已审核"), + ACCEPTED(4, "已验收"); - public static ProjectStatusEnum getByCode(String code){ + private final int code; + private final String desc; + + public static ProjectStatusEnum getByCode(int code){ for (ProjectStatusEnum e : ProjectStatusEnum.values() ) { - if(e.code.equals(code)){ + if(e.code == code){ return e; } } return null; } - public static String getDescByCode(String code){ + public static String getDescByCode(int code){ ProjectStatusEnum e = getByCode(code); return null == e ? null : e.desc; } @@ -42,7 +42,7 @@ public enum ProjectStatusEnum { List list = new ArrayList<>(ProjectStatusEnum.values().length); for (ProjectStatusEnum e : ProjectStatusEnum.values() ) { JSONObject jsonObject = new JSONObject(); - jsonObject.set(e.code, e.desc); + jsonObject.set(String.valueOf(e.code), e.desc); list.add(jsonObject); } return list; diff --git a/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java b/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java index c67a97c..80d5dfa 100644 --- a/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java +++ b/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java @@ -1,6 +1,6 @@ package com.dite.znpt.exception; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.Result; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/com/dite/znpt/service/UserService.java b/core/src/main/java/com/dite/znpt/service/UserService.java index eb0861b..85f83dc 100644 --- a/core/src/main/java/com/dite/znpt/service/UserService.java +++ b/core/src/main/java/com/dite/znpt/service/UserService.java @@ -51,7 +51,7 @@ public interface UserService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - void save(UserReq req); + String save(UserReq req); /** * 功能描述:更新用户信息 diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 9f8f85c..1c0fe42 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -31,7 +31,7 @@ import java.util.List; @Service public class ImageCollectServiceImpl extends ServiceImpl implements ImageCollectService { - @Value("${upload.perm-path}") + @Value("${upload.perm-path.image}") private String permPath; @Resource @@ -52,7 +52,7 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(ImageSourceEnum.COLLECT.getCode()).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); + String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); imageList.stream().forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index c3ad777..bf6ca6f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -10,7 +10,10 @@ import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.*; -import com.dite.znpt.enums.*; +import com.dite.znpt.enums.ImageSourceEnum; +import com.dite.znpt.enums.ImageTypeEnum; +import com.dite.znpt.enums.ShootingMethodEnum; +import com.dite.znpt.enums.WeatherEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageMapper; import com.dite.znpt.service.ImageCollectService; @@ -54,10 +57,10 @@ public class ImageServiceImpl extends ServiceImpl impl @Resource private PartService partService; - @Value("${upload.temp-path}") + @Value("${upload.temp-path.image}") private String tempPath; - @Value("${upload.perm-path}") + @Value("${upload.perm-path.image}") private String permPath; @Override public List list(ImageListReq req) { @@ -83,8 +86,8 @@ public class ImageServiceImpl extends ServiceImpl impl Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); list.stream().forEach(req -> { if(partIdMap.containsKey(req.getPartId())){ - String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR); - String temp_path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR); + String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); File file = new File(req.getImagePath()); if(file.exists() && req.getImagePath().contains(temp_path_prefix)){ ImageEntity entity = new ImageEntity(); @@ -123,7 +126,12 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } List list = new ArrayList<>(files.length); - String path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + File temCategory = new File(tempPath); + if (!temCategory.exists()) { + // 创建完整的目录 + temCategory.mkdirs(); + } + String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); for (MultipartFile file : files) { if (!file.isEmpty()) { try { @@ -189,7 +197,7 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - req.setImagePath(path); + req.setImagePath(StrUtil.removePrefix(path, tempPath)); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -200,15 +208,19 @@ public class ImageServiceImpl extends ServiceImpl impl req.setYResolution(extractDigit(obj.getStr("Y Resolution"))); req.setResolutionUnits(obj.getStr("Resolution Units")); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); - req.setShootingTime(LocalDateTime.parse( obj.getStr("Date/Time Original"),formatter)); + if(StrUtil.isNotBlank(obj.getStr("Date/Time Original"))){ + req.setShootingTime(LocalDateTime.parse(obj.getStr("Date/Time Original"), formatter)); + } req.setFocalDistance(extractDigit(obj.getStr("Focal Length"))); req.setLatitude(obj.getStr("GPS Latitude")); req.setLongitude(obj.getStr("GPS Longitude")); req.setAltitude(extractDigit(obj.getStr("GPS Altitude"))); - String gps = req.getLatitude().concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref"))).concat(StrUtil.COMMA) - .concat(req.getLongitude()).concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref"))).concat(StrUtil.COMMA) - .concat("海拔").concat(req.getAltitude()).concat("m"); - req.setGPS(gps); + if(StrUtil.isNotBlank(req.getLatitude()) && StrUtil.isNotBlank(req.getLongitude()) && StrUtil.isNotBlank(req.getAltitude())){ + String gps = req.getLatitude().concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref"))).concat(StrUtil.COMMA) + .concat(req.getLongitude()).concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref"))).concat(StrUtil.COMMA) + .concat("海拔").concat(req.getAltitude()).concat("m"); + req.setGPS(gps); + } return req; } @@ -227,6 +239,9 @@ public class ImageServiceImpl extends ServiceImpl impl } private static String extractDigit(String str) { + if(StrUtil.isEmpty(str)){ + return null; + } Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { diff --git a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java index 1703b13..d5647af 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java @@ -201,7 +201,7 @@ public class TurbineServiceImpl extends ServiceImpl turbineStatusList = jobService.calCrewStatus(ListUtil.of(turbineId)); @@ -223,19 +223,19 @@ public class TurbineServiceImpl extends ServiceImpl statusList = this.lambdaQuery().eq(TurbineEntity::getProjectId, projectId).list() .stream().map(TurbineEntity::getStatus).toList(); // 有施工中,则是施工中 - if (statusList.contains(ProjectStatusEnum.IN_PROGRESS.getIntValue())) { - status = ProjectStatusEnum.IN_PROGRESS.getIntValue(); + if (statusList.contains(ProjectStatusEnum.IN_PROGRESS.getCode())) { + status = ProjectStatusEnum.IN_PROGRESS.getCode(); } // 如果机组列表没有状态为 待施工、施工中 的则项目 完工 - if (!statusList.contains(ProjectStatusEnum.PENDING.getIntValue()) && - !statusList.contains(ProjectStatusEnum.IN_PROGRESS.getIntValue())) { - status = ProjectStatusEnum.COMPLETED.getIntValue(); + if (!statusList.contains(ProjectStatusEnum.PENDING.getCode()) && + !statusList.contains(ProjectStatusEnum.IN_PROGRESS.getCode())) { + status = ProjectStatusEnum.COMPLETED.getCode(); // 如果机组列表没有状态为 待施工、施工中、已完工 的则项目 已审核 - if (!statusList.contains(ProjectStatusEnum.COMPLETED.getIntValue())) { - status = ProjectStatusEnum.AUDITED.getIntValue(); + if (!statusList.contains(ProjectStatusEnum.COMPLETED.getCode())) { + status = ProjectStatusEnum.AUDITED.getCode(); // 如果机组列表没有状态为 待施工、施工中、已完工、已审核 的则项目 已验收 - if (!statusList.contains(ProjectStatusEnum.AUDITED.getIntValue())) { - status = ProjectStatusEnum.ACCEPTED.getIntValue(); + if (!statusList.contains(ProjectStatusEnum.AUDITED.getCode())) { + status = ProjectStatusEnum.ACCEPTED.getCode(); } } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index b86fa7f..09f39e5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -1,6 +1,11 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.secure.SaBase64Util; +import cn.dev33.satoken.secure.SaSecureUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.UserEntity; @@ -11,6 +16,8 @@ import com.dite.znpt.enums.EducationEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.UserService; import com.dite.znpt.mapper.UserMapper; +import com.dite.znpt.util.PasswordUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; @@ -27,6 +34,12 @@ import java.util.List; @RequiredArgsConstructor public class UserServiceImpl extends ServiceImpl implements UserService { + @Value("${password.default-value:Ai3m@123}") + private String defaultPassword; + + @Value("${password.enable-default:true}") + private Boolean enableDefaultPassword; + /** * 功能描述:分页查询用户信息列表 * @@ -82,9 +95,14 @@ public class UserServiceImpl extends ServiceImpl impleme **/ @Transactional(rollbackFor = Exception.class) @Override - public void save(UserReq req) { + public String save(UserReq req) { UserEntity entity = Converts.INSTANCE.toUserEntity(req); + String salt = RandomUtil.randomString(req.getAccount(), 4); + entity.setSalt(salt); + String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword(); + entity.setPassword(SaSecureUtil.md5(req.getAccount().concat(password).concat(salt))); this.save(entity); + return SaBase64Util.encode(password); } /** @@ -103,6 +121,7 @@ public class UserServiceImpl extends ServiceImpl impleme } UserEntity entity = Converts.INSTANCE.toUserEntity(req); entity.setUserId(userId); + entity.setAccount(null); this.updateById(entity); } @@ -116,10 +135,12 @@ public class UserServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String userId) { - if(null == this.getById(userId)){ + UserEntity entity = this.getById(userId); + if(null == entity){ throw new ServiceException(Message.USER_ID_NOT_EXIST); } - this.removeById(userId); + entity.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(entity); } diff --git a/core/src/main/java/com/dite/znpt/util/PasswordUtil.java b/core/src/main/java/com/dite/znpt/util/PasswordUtil.java index 85d9dfe..349ab84 100644 --- a/core/src/main/java/com/dite/znpt/util/PasswordUtil.java +++ b/core/src/main/java/com/dite/znpt/util/PasswordUtil.java @@ -3,6 +3,12 @@ package com.dite.znpt.util; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class PasswordUtil { private static final PasswordEncoder encoder = new BCryptPasswordEncoder(); @@ -13,4 +19,48 @@ public class PasswordUtil { public static boolean matches(String rawPassword, String encodedPassword) { return encoder.matches(rawPassword, encodedPassword); } + + // 字符集定义 + private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz"; + private static final String SPECIAL_CHARACTERS = "!@#$%^&*()-_=+[]{}|;:'\",.<>/?"; + private static final String DIGITS = "0123456789"; + + // 安全随机数生成器 + private static final Random RANDOM = new SecureRandom(); + + /** + * 生成随机密码 + * @return 符合要求的随机密码 + */ + public static String generatePassword() { + // 确保密码包含至少一个大写字母、一个小写字母和一个特殊字符 + List passwordChars = new ArrayList<>(); + + // 1. 添加至少一个大写字母 + passwordChars.add(UPPER_CASE.charAt(RANDOM.nextInt(UPPER_CASE.length()))); + + // 2. 添加至少一个小写字母 + passwordChars.add(LOWER_CASE.charAt(RANDOM.nextInt(LOWER_CASE.length()))); + + // 3. 添加至少一个特殊字符 + passwordChars.add(SPECIAL_CHARACTERS.charAt(RANDOM.nextInt(SPECIAL_CHARACTERS.length()))); + + // 4. 生成剩余字符(8位密码已添加3位,还需5位) + String allChars = UPPER_CASE + LOWER_CASE + SPECIAL_CHARACTERS + DIGITS; + for (int i = 0; i < 5; i++) { + passwordChars.add(allChars.charAt(RANDOM.nextInt(allChars.length()))); + } + + // 5. 打乱字符顺序 + Collections.shuffle(passwordChars, RANDOM); + + // 6. 转换为字符串 + StringBuilder password = new StringBuilder(); + for (Character c : passwordChars) { + password.append(c); + } + + return password.toString(); + } } diff --git a/core/src/main/java/com/dite/znpt/util/ValidationGroup.java b/core/src/main/java/com/dite/znpt/util/ValidationGroup.java new file mode 100644 index 0000000..a099028 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/util/ValidationGroup.java @@ -0,0 +1,14 @@ +package com.dite.znpt.util; + +import lombok.Data; + +/** + * @author Bear.G + * @date 2025/5/19/周一 15:09 + * @description + */ + +public interface ValidationGroup { + interface Insert {} // 增 + interface Update {} // 改 +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java b/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java index ce423da..cccf827 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.CombinedDictListReq; import com.dite.znpt.domain.vo.CombinedDictResp; import com.dite.znpt.domain.entity.CombinedDictEntity; diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 67e5c19..8dfc7de 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.DefectListReq; import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; diff --git a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java index fa40594..68666a5 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.FileInfoListReq; import com.dite.znpt.domain.vo.FileInfoResp; import com.dite.znpt.domain.entity.FileInfoEntity; diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index baf14af..e6eda67 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; /** diff --git a/web/src/main/java/com/dite/znpt/web/controller/LoginController.java b/web/src/main/java/com/dite/znpt/web/controller/LoginController.java new file mode 100644 index 0000000..b0c9d7e --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/LoginController.java @@ -0,0 +1,15 @@ +package com.dite.znpt.web.controller; + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Bear.G + * @date 2025/5/19/周一 14:32 + * @description + */ +@Api(tags = "登录") +@RestController +public class LoginController { +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/PartController.java b/web/src/main/java/com/dite/znpt/web/controller/PartController.java index f9586f6..d1ff22a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PartController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PartController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.PartListReq; import com.dite.znpt.domain.vo.PartListResp; import com.dite.znpt.domain.vo.PartReq; @@ -10,12 +10,14 @@ import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.service.PartService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.util.ValidationGroup; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -32,39 +34,39 @@ public class PartController { @Resource private PartService partService; - @ApiOperation(value = "分页获取部件列表", httpMethod = "GET") + @ApiOperation(value = "分页查询部件信息列表", httpMethod = "GET") @GetMapping("/page") public PageResult page(PartListReq partReq) { return PageResult.ok(partService.page(partReq)); } - @ApiOperation(value = "获取部件列表", httpMethod = "GET") + @ApiOperation(value = "查询部件信息列表", httpMethod = "GET") @GetMapping("/list") public Result> list(PartListReq partReq) { return Result.ok(partService.list(partReq)); } - @ApiOperation(value = "根据Id获取详细信息", httpMethod = "GET") + @ApiOperation(value = "查询部件信息详情", httpMethod = "GET") @GetMapping("/detail/{partId}") public Result detail(@PathVariable String partId) { return Result.ok(partService.detail(partId)); } - @ApiOperation(value = "新增", httpMethod = "POST") + @ApiOperation(value = "新增部件信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody PartReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PartReq req) { partService.save(req); return Result.ok(); } - @ApiOperation(value = "修改", httpMethod = "PUT") + @ApiOperation(value = "修改部件信息", httpMethod = "PUT") @PutMapping("/{partId}") - public Result edit(@PathVariable String partId, @RequestBody PartReq req) { + public Result edit(@Validated(ValidationGroup.Update.class) @PathVariable String partId, @RequestBody PartReq req) { partService.update(partId, req); return Result.ok(); } - @ApiOperation(value = "删除", httpMethod = "DELETE") + @ApiOperation(value = "删除部件信息", httpMethod = "DELETE") @DeleteMapping("/{partId}") public Result remove(@PathVariable String partId) { partService.deleteById(partId); diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java index 182e0b1..5c7e11c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectReq; @@ -10,12 +10,14 @@ import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.service.ProjectService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.util.ValidationGroup; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -52,14 +54,14 @@ public class ProjectController { @ApiOperation(value = "新增项目信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody ProjectReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectReq req) { projectService.save(req); return Result.ok(); } @ApiOperation(value = "修改项目信息", httpMethod = "PUT") @PutMapping("/{projectId}") - public Result edit(@PathVariable String projectId, @RequestBody ProjectReq req) { + public Result edit(@PathVariable String projectId, @Validated(ValidationGroup.Update.class) @RequestBody ProjectReq req) { projectService.update(projectId, req); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java index 75b240d..521eb8f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.TConstructionListReq; import com.dite.znpt.domain.vo.TConstructionResp; import com.dite.znpt.domain.entity.TConstructionEntity; diff --git a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java index 5929d14..9113e0c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java @@ -1,18 +1,20 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.*; import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.service.TurbineService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.util.ValidationGroup; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -61,14 +63,14 @@ public class TurbineController { @ApiOperation(value = "新增机组", httpMethod = "POST") @PostMapping - public Result add(@RequestBody TurbineReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) { turbineService.save(req); return Result.ok(); } @ApiOperation(value = "修改机组", httpMethod = "PUT") @PutMapping("/{turbineId}") - public Result edit(@PathVariable String turbineId, @RequestBody TurbineReq req) { + public Result edit(@PathVariable String turbineId, @Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) { turbineService.update(turbineId, req); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/UserController.java b/web/src/main/java/com/dite/znpt/web/controller/UserController.java index d29e6d9..13b5e87 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/UserController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/UserController.java @@ -8,15 +8,18 @@ import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.service.UserService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.util.ValidationGroup; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; /** @@ -50,14 +53,13 @@ public class UserController { @ApiOperation(value = "新增用户信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody UserReq req) { - userService.save(req); - return Result.ok(); + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody UserReq req) { + return Result.ok(userService.save(req)); } @ApiOperation(value = "修改用户信息", httpMethod = "PUT") @PutMapping("/{userId}") - public Result edit(@PathVariable String userId, @RequestBody UserReq req) { + public Result edit(@PathVariable String userId, @Validated(ValidationGroup.Update.class) @RequestBody UserReq req) { userService.update(userId, req); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java index 448b17d..2d13873 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java @@ -1,7 +1,7 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.Constants; +import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.WeatherTypeListReq; import com.dite.znpt.domain.vo.WeatherTypeResp; import com.dite.znpt.domain.entity.WeatherTypeEntity; From 3eea2b04a8cd6cc923cc8138878f3c34ae238fbc Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 19 May 2025 23:31:27 +0800 Subject: [PATCH 042/143] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/config/WebMvcConfig.java | 7 +++---- .../java/com/dite/znpt/domain/vo/ProjectReq.java | 2 +- .../java/com/dite/znpt/domain/vo/TurbineReq.java | 2 +- .../java/com/dite/znpt/domain/vo/UserReq.java | 2 +- .../java/com/dite/znpt/enums/ImageSourceEnum.java | 2 +- .../service/impl/ImageCollectServiceImpl.java | 15 +++++++++++---- .../dite/znpt/service/impl/ImageServiceImpl.java | 12 +++++++----- web/src/main/resources/application-dev.yml | 6 ++++-- 8 files changed, 29 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index f93ae4d..33c100e 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -20,14 +20,13 @@ public class WebMvcConfig extends WebMvcConfigurationSupport { */ @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { - - registry.addResourceHandler("/image/temp/**").addResourceLocations("file:" + uploadTempPath); - registry.addResourceHandler("/image/**").addResourceLocations("file:" + uploadPermPath); - registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + registry.addResourceHandler("/static/image/**").addResourceLocations("file:" + uploadPermPath); + registry.addResourceHandler("/static/image/temp/**").addResourceLocations("file:" + uploadTempPath); + registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\\Upload\\Image\\Temp\\"); super.addResourceHandlers(registry); } } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java index 401ab2b..161c6c5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -27,7 +27,7 @@ public class ProjectReq implements Serializable { @ApiModelProperty("项目名称") private String projectName; - @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目封面述长度不能超过100字符") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "项目封面述长度不能超过200字符") @ApiModelProperty("项目封面") private String coverUrl; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java index 9f3bd7b..dece98a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineReq.java @@ -49,7 +49,7 @@ public class TurbineReq implements Serializable { @ApiModelProperty("机组型号") private String turbineModel; - @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "机组封面图长度不能超过100字符") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "机组封面图长度不能超过200字符") @ApiModelProperty("机组封面图") private String turbineCoverUrl; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index a8ac046..1ca16c3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -27,7 +27,7 @@ public class UserReq implements Serializable { @ApiModelProperty("账号") private String account; - @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "头像地址长度不能超过100字符") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "头像地址长度不能超过200字符") @ApiModelProperty("头像地址") private String avatar; diff --git a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java index 7d75f4b..8919e04 100644 --- a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java @@ -15,7 +15,7 @@ import java.util.List; public enum ImageSourceEnum { COLLECT("collect", "图像采集", Boolean.TRUE), OUT_WORK("out-work", "外部工作", Boolean.TRUE), - IN_WORK("in-work", "外部工作", Boolean.TRUE), + IN_WORK("in-work", "内部工作", Boolean.TRUE), LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作", Boolean.FALSE); private final String code; diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 1c0fe42..8c66217 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -21,6 +21,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.File; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -33,6 +35,8 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + String permPathPrefix = permPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = tempPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); imageList.stream().forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); - String path = path_prefix + image.getImageName(); - File file = new File(image.getImagePath()); + String path = permPathPrefix + image.getImageName(); + File file = new File(temPathPrefix.concat(image.getImageName())); if (file.exists()) { byte[] bytes = FileUtil.readBytes(file); FileUtil.writeBytes(bytes, path); - image.setImagePath(path); + String url = "/static/image/".concat(StrUtil.removePrefix(path,permPath).replace(FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + image.setImagePath(url); FileUtil.del(file); }else { imageList.remove(image); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index bf6ca6f..d86bd10 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -131,11 +131,11 @@ public class ImageServiceImpl extends ServiceImpl impl // 创建完整的目录 temCategory.mkdirs(); } - String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH); + String temPathPrefix = tempPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); for (MultipartFile file : files) { if (!file.isEmpty()) { try { - String path = path_prefix + file.getOriginalFilename(); + String path = temPathPrefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); list.add(imageRespBuilder(path)); } catch (Exception e) { @@ -152,7 +152,7 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR); + String path_prefix = permPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); if (Objects.nonNull(imageWorkReq)) { if (StrUtil.isNotBlank(imageWorkReq.getUploadUser())) { path_prefix = path_prefix.concat(imageWorkReq.getUploadUser()).concat(FileUtil.FILE_SEPARATOR); @@ -169,7 +169,8 @@ public class ImageServiceImpl extends ServiceImpl impl } String path = path_prefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); - return path; + String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, permPath)); + return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); } @Transactional(rollbackFor = Exception.class) @@ -197,7 +198,8 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - req.setImagePath(StrUtil.removePrefix(path, tempPath)); + String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(FileUtil.FILE_SEPARATOR).concat("temp").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, tempPath)); + req.setImagePath(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index e4b6f62..b3c81a9 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -117,6 +117,8 @@ zlm-config: dynamicPortEnd: 30185 upload: - temp-path: F:\Upload\Image\Temp - perm-path: F:\Upload\Image + temp-path: + image: D:\Upload\Image\Temp\ + perm-path: + image: D:\Upload\Image\ From 5070e42c09561aae70a250074a78384252803dae Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 20 May 2025 14:20:18 +0800 Subject: [PATCH 043/143] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=EF=BC=8C=E6=94=AF=E6=8C=81=E5=8D=95=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=92=8C=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/service/ImageService.java | 2 +- .../znpt/service/impl/ImageServiceImpl.java | 17 +++++++++----- .../znpt/web/controller/CommonController.java | 23 ++++++++++++++++++- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 69d89cc..15d902b 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -25,7 +25,7 @@ public interface ImageService extends IService { List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files); - String uploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile file) throws IOException; + List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; void delete(String imageId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index d86bd10..bc25def 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -147,8 +147,9 @@ public class ImageServiceImpl extends ServiceImpl impl } @Override - public String uploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile file) throws IOException { - if(null == file){ + @Transactional(rollbackFor = Exception.class) + public List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] files) throws IOException { + if(null == files || files.length == 0){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); @@ -167,10 +168,14 @@ public class ImageServiceImpl extends ServiceImpl impl if (!FileUtil.exist(path_prefix)) { FileUtil.mkdir(path_prefix); } - String path = path_prefix + file.getOriginalFilename(); - FileUtil.writeBytes(file.getBytes(),path); - String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, permPath)); - return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); + List result = new ArrayList<>(files.length); + for (MultipartFile multipartFile : files) { + String path = path_prefix + multipartFile.getOriginalFilename(); + FileUtil.writeBytes(multipartFile.getBytes(),path); + String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, permPath)); + result.add(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + } + return result; } @Transactional(rollbackFor = Exception.class) diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 21174b2..c9620f7 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -1,8 +1,10 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.constant.Message; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.ImageService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -109,12 +111,31 @@ public class CommonController { @Parameter(description = "纬度")@RequestParam(required = false) String latitude, @Parameter(description = "海拔")@RequestParam(required = false) String altitude, MultipartFile file) throws IOException { + if(null == file){ + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } ImageWorkReq workReq = new ImageWorkReq(); workReq.setUploadUser(uploadUser); workReq.setLongitude(longitude); workReq.setLatitude(latitude); workReq.setAltitude(altitude); - return Result.ok(imageService.uploadCommonImage(imageSource, workReq, file)); + return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, new MultipartFile[]{file}).get(0)); + } + + @ApiOperation(value = "批量上传图片", httpMethod = "POST") + @PostMapping("/batch-upload-image/{imageSource}") + public Result batchUploadImage(@PathVariable String imageSource, + @Parameter(description = "上传用户") @RequestParam(required = false) String uploadUser, + @Parameter(description = "经度") @RequestParam(required = false) String longitude, + @Parameter(description = "纬度") @RequestParam(required = false) String latitude, + @Parameter(description = "海拔") @RequestParam(required = false) String altitude, + @RequestParam("file") MultipartFile[] files) throws IOException { + ImageWorkReq workReq = new ImageWorkReq(); + workReq.setUploadUser(uploadUser); + workReq.setLongitude(longitude); + workReq.setLatitude(latitude); + workReq.setAltitude(altitude); + return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } } From 17917a834b86075b16a16d32b6d5192910d9e47c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Tue, 20 May 2025 17:03:30 +0800 Subject: [PATCH 044/143] =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=92=8C=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/constant/Constants.java | 11 ++ .../java/com/dite/znpt/constant/Message.java | 6 + .../java/com/dite/znpt/converts/Converts.java | 12 ++ .../dite/znpt/domain/entity/DeptEntity.java | 64 ++++++++++ .../dite/znpt/domain/entity/PostEntity.java | 49 ++++++++ .../java/com/dite/znpt/domain/vo/DeptReq.java | 40 ++++++ .../com/dite/znpt/domain/vo/DeptResp.java | 39 ++++++ .../java/com/dite/znpt/domain/vo/PostReq.java | 37 ++++++ .../com/dite/znpt/domain/vo/PostResp.java | 38 ++++++ .../main/java/com/dite/znpt/enums/Enums.java | 31 ----- .../java/com/dite/znpt/mapper/DeptMapper.java | 32 +++++ .../java/com/dite/znpt/mapper/PostMapper.java | 12 ++ .../com/dite/znpt/service/DeptService.java | 27 ++++ .../com/dite/znpt/service/PostService.java | 28 +++++ .../znpt/service/impl/DeptServiceImpl.java | 116 ++++++++++++++++++ .../znpt/service/impl/PostServiceImpl.java | 70 +++++++++++ .../znpt/service/impl/UserServiceImpl.java | 28 ++++- core/src/main/resources/mapper/DeptMapper.xml | 41 +++++++ core/src/main/resources/mapper/PostMapper.xml | 5 + .../znpt/web/controller/DeptController.java | 62 ++++++++++ .../znpt/web/controller/PostController.java | 68 ++++++++++ web/src/main/resources/application-dev.yml | 6 +- 22 files changed, 787 insertions(+), 35 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DeptReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DeptResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/PostReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/PostResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/DeptMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/PostMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/DeptService.java create mode 100644 core/src/main/java/com/dite/znpt/service/PostService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java create mode 100644 core/src/main/resources/mapper/DeptMapper.xml create mode 100644 core/src/main/resources/mapper/PostMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/DeptController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/PostController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index 0cbe777..c724e6d 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -31,4 +31,15 @@ public class Constants { * 1:代表删除 */ public static final String DEL_FLAG_1 = "1"; + + /** + * 0:代表启用 + */ + public static final Integer STATUS_0 = 0; + + /** + * 1:代表停用 + */ + public static final Integer STATUS_1 = 1; + } diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index c627199..24a5037 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -21,4 +21,10 @@ public class Message implements Serializable { public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; public static final String USER_ID_NOT_EXIST = "用户id不存在"; + public static final String ACCOUNT_EXIST = "用户账号已经存在,请重新输入"; + public static final String MOBILE_EXIST = "手机号码已经存在,请重新输入"; + public static final String EMAIL_EXIST = "邮箱已经存在,请重新输入"; + public static final String DEPT_PARENT_NOT_EXISTS = "父级部门不存在"; + public static final String DEPT_ID_NOT_EXISTS = "部门id不存在"; + public static final String POST_ID_NOT_EXISTS = "岗位id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 1ae5dda..de30c63 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -42,4 +42,16 @@ public interface Converts { UserResp toUserResp(UserEntity entity); UserEntity toUserEntity(UserReq req); + + DeptEntity toDeptEntity(DeptReq req); + + DeptResp toDeptResp(DeptEntity entity); + + PostEntity toPostEntity(PostReq req); + + List toPostResp(List list); + + PostResp toPostResp(PostEntity entity); + } + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java new file mode 100644 index 0000000..f523db9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java @@ -0,0 +1,64 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:17 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("dept") +@ApiModel(value="DeptEntity对象", description="表") +public class DeptEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = -6471015140726790051L; + + @ApiModelProperty("部门id") + @TableId(value = "dept_id", type = IdType.ASSIGN_UUID) + private String deptId; + + @ApiModelProperty("父级部门id") + @TableField("parent_id") + private String parentId; + + @ApiModelProperty("祖籍列表") + @TableField("ancestors") + private String ancestors; + + @ApiModelProperty("部门全路径名称") + @TableField("dept_full_name") + private String deptFullName; + + @ApiModelProperty("部门名称") + @TableField("dept_name") + private String deptName; + + @ApiModelProperty("显示顺序") + @TableField("order_num") + private Integer orderNum; + + @ApiModelProperty("部门负责人") + @TableField("leader_id") + private String leaderId; + + @ApiModelProperty("状态(0正常 1停用)") + @TableField("status") + private Integer status; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableField("del_flag") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java new file mode 100644 index 0000000..17e9479 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java @@ -0,0 +1,49 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:17 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("post") +@ApiModel(value="PostEntity对象", description="表") +public class PostEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = -5163882523494504223L; + + @ApiModelProperty("岗位id") + @TableId(value = "post_id", type = IdType.ASSIGN_UUID) + private String postId; + + @ApiModelProperty("岗位名称") + @TableField("post_name") + private String postName; + + @ApiModelProperty("显示顺序") + @TableField("post_sort") + private Integer postSort; + + @ApiModelProperty("状态(0正常 1停用)") + @TableField("status") + private Integer status; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DeptReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DeptReq.java new file mode 100644 index 0000000..c283b00 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DeptReq.java @@ -0,0 +1,40 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:42 + * @description + */ +@Data +@ApiModel("部门信息请求实体") +public class DeptReq implements Serializable { + @Serial + private static final long serialVersionUID = -8058508810161877848L; + + @ApiModelProperty("父级部门id") + private String parentId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "部门名称不能为空") + @Size(max = 30, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "部门名称长度不能超过30") + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("显示顺序") + private Integer orderNum; + + @ApiModelProperty("负责人id") + private String leaderId; + + @ApiModelProperty("状态") + private Integer status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DeptResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DeptResp.java new file mode 100644 index 0000000..aa01f81 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DeptResp.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:40 + * @description + */ +@Data +@ApiModel("部门信息响应实体") +public class DeptResp implements Serializable { + + @Serial + private static final long serialVersionUID = 6372397386719274915L; + + @ApiModelProperty("部门id") + private String deptId; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("父级部门id") + private String parentId; + + @ApiModelProperty("部门排序") + private Integer orderNum; + + @ApiModelProperty("部门负责人id") + private String leaderId; + + @ApiModelProperty("部门状态") + private String status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java new file mode 100644 index 0000000..97b0a8d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:43 + * @description + */ +@Data +@ApiModel("岗位信息请求实体") +public class PostReq implements Serializable { + @Serial + private static final long serialVersionUID = -149328762675637911L; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "岗位名称不能为空") + @Size(max = 30, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "岗位名称长度不能超过30个字符") + @ApiModelProperty("岗位名称") + private String postName; + + @ApiModelProperty("显示顺序") + private Integer postSort; + + @ApiModelProperty("状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java new file mode 100644 index 0000000..545ec86 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java @@ -0,0 +1,38 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/20/周二 9:42 + * @description + */ +@Data +@ApiModel("岗位信息响应实体") +public class PostResp implements Serializable { + @Serial + private static final long serialVersionUID = 8836143545716686582L; + + @ApiModelProperty("岗位id") + private String postId; + + @ApiModelProperty("岗位名称") + private String postName; + + @ApiModelProperty("显示顺序") + private Integer postSort; + + @ApiModelProperty("状态") + private String status; + + @Size(max = 200, message = "备注长度不能超过200个字符") + @ApiModelProperty("备注") + private String remark; + +} diff --git a/core/src/main/java/com/dite/znpt/enums/Enums.java b/core/src/main/java/com/dite/znpt/enums/Enums.java index 0056d16..8a4fcf8 100644 --- a/core/src/main/java/com/dite/znpt/enums/Enums.java +++ b/core/src/main/java/com/dite/znpt/enums/Enums.java @@ -9,37 +9,6 @@ import lombok.Getter; * @description: 枚举类 */ public class Enums { - /** - * @date 2021/9/15 3:24 下午 - * @description: N:正常,D:删除 - */ - @Getter - @AllArgsConstructor - public enum YN { - /** - * @date 2021/9/15 3:24 下午 - * @description: 正常 - */ - Yes(1, "是"), - /** - * @date 2021/9/15 3:24 下午 - * @description: 启用 - */ - No(0, "否"); - - final int value; - final String name; - } - - @Getter - @AllArgsConstructor - public enum EUserStatus { - ENABLE(1, "启用"), - DISABLE(0, "禁用"); - - final int value; - final String name; - } @Getter @AllArgsConstructor diff --git a/core/src/main/java/com/dite/znpt/mapper/DeptMapper.java b/core/src/main/java/com/dite/znpt/mapper/DeptMapper.java new file mode 100644 index 0000000..bb3a497 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/DeptMapper.java @@ -0,0 +1,32 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.DeptEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:16 + * @description + */ +public interface DeptMapper extends BaseMapper { + /** + * @Author Bear.G + * @Date 2025/5/20/周二 15:49 + * @description 向上递归查询部门树 + * @param deptName + * @return + **/ + List upwardRecursionSelect(@Param("deptName") String deptName); + + /** + * @Author Bear.G + * @Date 2025/5/20/周二 15:49 + * @description 向下递归查询部门树 + * @param deptId + * @return + **/ + List downwardRecursionSelect(@Param("deptId") String deptId); +} diff --git a/core/src/main/java/com/dite/znpt/mapper/PostMapper.java b/core/src/main/java/com/dite/znpt/mapper/PostMapper.java new file mode 100644 index 0000000..b98dc56 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/PostMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.PostEntity; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:16 + * @description + */ +public interface PostMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/DeptService.java b/core/src/main/java/com/dite/znpt/service/DeptService.java new file mode 100644 index 0000000..4d5e468 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/DeptService.java @@ -0,0 +1,27 @@ +package com.dite.znpt.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.vo.DeptReq; +import com.dite.znpt.domain.vo.DeptResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:14 + * @description + */ +public interface DeptService extends IService { + + List> tree(String deptName); + + DeptResp detail(String deptId); + + void save(DeptReq req); + + void update(String deptId, DeptReq req); + + void deleteById(String deptId); +} diff --git a/core/src/main/java/com/dite/znpt/service/PostService.java b/core/src/main/java/com/dite/znpt/service/PostService.java new file mode 100644 index 0000000..3a27134 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/PostService.java @@ -0,0 +1,28 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.PostEntity; +import com.dite.znpt.domain.vo.PostReq; +import com.dite.znpt.domain.vo.PostResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:20 + * @description + */ +public interface PostService extends IService { + + List page(String postName); + + List list(String postName); + + PostResp detail(String postId); + + void save(PostReq req); + + void update(String postId, PostReq req); + + void deleteById(String postId); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java new file mode 100644 index 0000000..804d199 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java @@ -0,0 +1,116 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.DeptReq; +import com.dite.znpt.domain.vo.DeptResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.DeptMapper; +import com.dite.znpt.service.DeptService; +import com.dite.znpt.service.UserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:14 + * @description + */ +@Service +public class DeptServiceImpl extends ServiceImpl implements DeptService { + + @Resource + private UserService userService; + + @Override + public List> tree(String deptName) { + List deptList = StrUtil.isBlank(deptName) ? this.baseMapper.downwardRecursionSelect(null) : this.baseMapper.upwardRecursionSelect(deptName); + //配置 + TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); + treeNodeConfig.setIdKey("deptId"); + treeNodeConfig.setNameKey("deptName"); + treeNodeConfig.setParentIdKey("parentId"); + treeNodeConfig.setWeightKey("orderNum"); + //转换器 + return TreeUtil.build(deptList, "0", treeNodeConfig, + (treeNode, tree) -> { + tree.setId(treeNode.getDeptId()); + tree.setParentId(treeNode.getParentId()); + tree.setName(treeNode.getDeptName()); + tree.putExtra("status",treeNode.getStatus()); + tree.putExtra("orderNum",treeNode.getOrderNum()); + }); + } + + @Override + public DeptResp detail(String deptId) { + DeptEntity entity = this.getById(deptId); + if (null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + } + return Converts.INSTANCE.toDeptResp(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(DeptReq req) { + this.save(dealDept(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String deptId, DeptReq req) { + DeptEntity originalEntity = this.getById(deptId); + if (null == originalEntity || !originalEntity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + } + DeptEntity entity = dealDept(req); + entity.setDeptId(deptId); + this.updateById(entity); + } + + private DeptEntity dealDept(DeptReq req){ + DeptEntity entity = Converts.INSTANCE.toDeptEntity(req); + if(StrUtil.isNotBlank(req.getLeaderId())){ + UserEntity user = userService.getById(req.getLeaderId()); + if(null == user || !user.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + } + if(StrUtil.isNotBlank(req.getParentId())){ + DeptEntity parent = this.getById(req.getParentId()); + if(null == parent || !parent.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.DEPT_PARENT_NOT_EXISTS); + } + entity.setAncestors(parent.getAncestors() + StrUtil.COMMA + parent.getDeptId()); + entity.setDeptFullName(parent.getDeptFullName() + StrUtil.SLASH + entity.getDeptName()); + }else{ + entity.setParentId("0"); + entity.setAncestors("0"); + entity.setDeptFullName(req.getDeptName()); + } + return entity; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String deptId) { + DeptEntity entity = this.getById(deptId); + if (null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + } + entity.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(entity); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java new file mode 100644 index 0000000..e952e4e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java @@ -0,0 +1,70 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.PostEntity; +import com.dite.znpt.domain.vo.PostReq; +import com.dite.znpt.domain.vo.PostResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.PostMapper; +import com.dite.znpt.service.PostService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:20 + * @description + */ +@Service +public class PostServiceImpl extends ServiceImpl implements PostService { + + @Override + public List page(String postName) { + PageUtil.startPage(); + return this.list(postName); + } + + @Override + public List list(String postName) { + return Converts.INSTANCE.toPostResp(this.list(Wrappers.lambdaQuery(PostEntity.class).like(StrUtil.isNotBlank(postName), PostEntity::getPostName, postName))); + } + + @Override + public PostResp detail(String postId) { + return Converts.INSTANCE.toPostResp(this.getById(postId)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(PostReq req) { + PostEntity entity = Converts.INSTANCE.toPostEntity(req); + this.save(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String postId, PostReq req) { + if(null == this.getById(postId)){ + throw new ServiceException(Message.POST_ID_NOT_EXISTS); + } + PostEntity entity = Converts.INSTANCE.toPostEntity(req); + entity.setPostId(postId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String postId) { + if(null == this.getById(postId)){ + throw new ServiceException(Message.POST_ID_NOT_EXISTS); + } + this.removeById(postId); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index 09f39e5..e576f9b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -4,6 +4,9 @@ import cn.dev33.satoken.secure.SaBase64Util; import cn.dev33.satoken.secure.SaSecureUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; @@ -97,6 +100,7 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public String save(UserReq req) { UserEntity entity = Converts.INSTANCE.toUserEntity(req); + validate(req, null); String salt = RandomUtil.randomString(req.getAccount(), 4); entity.setSalt(salt); String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword(); @@ -116,15 +120,37 @@ public class UserServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public void update(String userId, UserReq req) { - if(null == this.getById(userId)){ + UserEntity originalEntity = this.getById(userId); + if(null == originalEntity || originalEntity.getDelFlag().equals(Constants.DEL_FLAG_1)){ throw new ServiceException(Message.USER_ID_NOT_EXIST); } UserEntity entity = Converts.INSTANCE.toUserEntity(req); entity.setUserId(userId); entity.setAccount(null); + validate(req, originalEntity); this.updateById(entity); } + + private void validate(UserReq req, UserEntity originalEntity){ + LambdaQueryWrapper accountWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + if(this.getOne(accountWrapper) != null && originalEntity == null){ + throw new ServiceException(Message.ACCOUNT_EXIST); + } + if(originalEntity == null || !originalEntity.getMobile().equals(req.getMobile())){ + LambdaQueryWrapper mobileWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getMobile()), UserEntity::getMobile, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + if(this.getOne(mobileWrapper) != null){ + throw new ServiceException(Message.MOBILE_EXIST); + } + } + if(originalEntity == null || !originalEntity.getEmail().equals(req.getEmail())){ + LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getEmail()), UserEntity::getEmail, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + if(this.getOne(emailWrapper) != null){ + throw new ServiceException(Message.EMAIL_EXIST); + } + } + } + /** * 功能描述:删除用户信息 * diff --git a/core/src/main/resources/mapper/DeptMapper.xml b/core/src/main/resources/mapper/DeptMapper.xml new file mode 100644 index 0000000..2830fe0 --- /dev/null +++ b/core/src/main/resources/mapper/DeptMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/PostMapper.xml b/core/src/main/resources/mapper/PostMapper.xml new file mode 100644 index 0000000..c770671 --- /dev/null +++ b/core/src/main/resources/mapper/PostMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java new file mode 100644 index 0000000..1e63893 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java @@ -0,0 +1,62 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.DeptReq; +import com.dite.znpt.domain.vo.DeptResp; +import com.dite.znpt.service.DeptService; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:05 + * @description + */ +@Api(tags = "部门信息") +@RestController +@RequestMapping("/dept") +public class DeptController { + + @Resource + private DeptService deptService; + + @ApiOperation(value = "查询部门树", httpMethod = "GET") + @GetMapping("/tree") + public Result tree (@RequestParam(name = "deptName", required = false) String deptName) { + return Result.ok(deptService.tree(deptName)); + } + + @ApiOperation(value = "查询部门信息详情", httpMethod = "GET") + @GetMapping("/detail/{deptId}") + public Result detail(@PathVariable String deptId) { + return Result.ok(deptService.detail(deptId)); + } + + @ApiOperation(value = "新增部门信息", httpMethod = "Post") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { + deptService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改部门信息", httpMethod = "PUT") + @PutMapping("/{deptId}") + public Result edit(@PathVariable String deptId, @Validated(ValidationGroup.Update.class) @RequestBody DeptReq req) { + deptService.update(deptId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除部门信息", httpMethod = "DELETE") + @DeleteMapping("/{deptId}") + public Result remove(@PathVariable String deptId) { + deptService.deleteById(deptId); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/PostController.java b/web/src/main/java/com/dite/znpt/web/controller/PostController.java new file mode 100644 index 0000000..c1e8ac1 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/PostController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.PostReq; +import com.dite.znpt.domain.vo.PostResp; +import com.dite.znpt.service.PostService; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/20/周二 10:05 + * @description + */ +@Api(tags = "岗位信息") +@RestController +@RequestMapping("/post") +public class PostController { + @Resource + private PostService postService; + + @ApiOperation(value = "分页查询岗位信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(value = "postName", required = false) String postName){ + return PageResult.ok(postService.page(postName)); + } + + @ApiOperation(value = "查询岗位信息列表", httpMethod = "GET") + @GetMapping("/list") + private Result> list(@RequestParam(value = "postName", required = false) String postName){ + return Result.ok(postService.list(postName)); + } + + @ApiOperation(value = "查询岗位信息详情", httpMethod = "GET") + @GetMapping("/detail/{postId}") + public Result detail(@PathVariable String postId){ + return Result.ok(postService.detail(postId)); + } + + @ApiOperation(value = "新增岗位信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PostReq req){ + postService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改岗位信息", httpMethod = "PUT") + @PutMapping("/{postId}") + public Result edit(@PathVariable String postId, @Validated(ValidationGroup.Update.class) @RequestBody PostReq req){ + postService.update(postId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除岗位信息", httpMethod = "DELETE") + @DeleteMapping("/{postId}") + public Result remove(@PathVariable String postId){ + postService.deleteById(postId); + return Result.ok(); + } + +} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index b3c81a9..ac76c38 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -84,7 +84,7 @@ spring: sip-config: name: 信令服务 - ip: 192.168.0.112 + ip: 127.0.0.1 port: 1074 charset: gb2312 domain: 3402000000 @@ -100,7 +100,7 @@ zlm-config: # 公网ip publicHost: # 接口ip - apiHost: 192.168.0.112 + apiHost: 127.0.0.1 # 接口端口 apiPort: 8080 # 密钥 @@ -108,7 +108,7 @@ zlm-config: # 流id前缀 streamPrefix: # rtp ip - rtpHost: 192.168.0.112 + rtpHost: 127.0.0.1 # rtp 端口 rtpPort: 8080 # 动态端口起始值 From a39f94ee272243a363e47644751206a1b36d231b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Wed, 21 May 2025 17:53:49 +0800 Subject: [PATCH 045/143] =?UTF-8?q?1=E3=80=81=E8=8F=9C=E5=8D=95=E5=92=8C?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=9A=84=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90=202=E3=80=81=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=BB=91=E5=AE=9A=E8=A7=92=E8=89=B2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=8C=E6=88=90=203=E3=80=81=E8=A7=92=E8=89=B2=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E8=8F=9C=E5=8D=95=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90?= =?UTF-8?q?=204=E3=80=81=E7=94=A8=E6=88=B7=E7=BB=91=E5=AE=9A=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 12 +++ .../java/com/dite/znpt/constant/Message.java | 15 +++- .../java/com/dite/znpt/converts/Converts.java | 10 +++ .../dite/znpt/domain/entity/MenuEntity.java | 2 - .../dite/znpt/domain/entity/RoleEntity.java | 8 +- .../dite/znpt/domain/entity/UserEntity.java | 4 + .../znpt/domain/entity/UserPostEntity.java | 35 ++++++++ .../java/com/dite/znpt/domain/vo/MenuReq.java | 52 ++++++++++++ .../com/dite/znpt/domain/vo/MenuResp.java | 45 ++++++++++ .../com/dite/znpt/domain/vo/RoleMenuReq.java | 32 +++++++ .../java/com/dite/znpt/domain/vo/RoleReq.java | 40 +++++++++ .../com/dite/znpt/domain/vo/RoleResp.java | 36 ++++++++ .../com/dite/znpt/domain/vo/UserListReq.java | 6 ++ .../com/dite/znpt/domain/vo/UserListResp.java | 21 ++--- .../java/com/dite/znpt/domain/vo/UserReq.java | 7 ++ .../com/dite/znpt/domain/vo/UserResp.java | 6 ++ .../com/dite/znpt/domain/vo/UserRoleReq.java | 32 +++++++ .../com/dite/znpt/enums/EducationEnum.java | 2 +- .../java/com/dite/znpt/enums/GenderEnum.java | 2 +- .../com/dite/znpt/enums/MenuTypeEnum.java | 52 ++++++++++++ .../java/com/dite/znpt/mapper/MenuMapper.java | 33 ++++++++ .../java/com/dite/znpt/mapper/RoleMapper.java | 12 +++ .../com/dite/znpt/mapper/RoleMenuMapper.java | 12 +++ .../java/com/dite/znpt/mapper/UserMapper.java | 3 +- .../com/dite/znpt/mapper/UserPostMapper.java | 12 +++ .../com/dite/znpt/mapper/UserRoleMapper.java | 12 +++ .../com/dite/znpt/service/MenuService.java | 23 +++++ .../dite/znpt/service/RoleMenuService.java | 17 ++++ .../com/dite/znpt/service/RoleService.java | 28 +++++++ .../dite/znpt/service/UserPostService.java | 16 ++++ .../dite/znpt/service/UserRoleService.java | 19 +++++ .../com/dite/znpt/service/UserService.java | 5 +- .../znpt/service/impl/DefectServiceImpl.java | 2 +- .../znpt/service/impl/DeptServiceImpl.java | 8 +- .../service/impl/ImageCollectServiceImpl.java | 2 +- .../znpt/service/impl/ImageServiceImpl.java | 2 +- .../znpt/service/impl/MenuServiceImpl.java | 84 +++++++++++++++++++ .../znpt/service/impl/PostServiceImpl.java | 16 +++- .../service/impl/RoleMenuServiceImpl.java | 59 +++++++++++++ .../znpt/service/impl/RoleServiceImpl.java | 81 ++++++++++++++++++ .../service/impl/UserPostServiceImpl.java | 79 +++++++++++++++++ .../service/impl/UserRoleServiceImpl.java | 78 +++++++++++++++++ .../znpt/service/impl/UserServiceImpl.java | 71 ++++++++++++---- core/src/main/resources/mapper/DeptMapper.xml | 6 +- core/src/main/resources/mapper/MenuMapper.xml | 41 +++++++++ core/src/main/resources/mapper/RoleMapper.xml | 5 ++ .../main/resources/mapper/RoleMenuMapper.xml | 5 ++ core/src/main/resources/mapper/UserMapper.xml | 24 ++++-- .../main/resources/mapper/UserPostMapper.xml | 5 ++ .../main/resources/mapper/UserRoleMapper.xml | 5 ++ .../znpt/web/controller/CommonController.java | 14 +++- .../znpt/web/controller/MenuController.java | 58 +++++++++++++ .../znpt/web/controller/RoleController.java | 82 ++++++++++++++++++ .../znpt/web/controller/UserController.java | 47 ++++------- 54 files changed, 1289 insertions(+), 96 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/UserPostEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/RoleMenuReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/MenuMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RoleMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RoleMenuMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/UserPostMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/UserRoleMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/MenuService.java create mode 100644 core/src/main/java/com/dite/znpt/service/RoleMenuService.java create mode 100644 core/src/main/java/com/dite/znpt/service/RoleService.java create mode 100644 core/src/main/java/com/dite/znpt/service/UserPostService.java create mode 100644 core/src/main/java/com/dite/znpt/service/UserRoleService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/RoleMenuServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java create mode 100644 core/src/main/resources/mapper/MenuMapper.xml create mode 100644 core/src/main/resources/mapper/RoleMapper.xml create mode 100644 core/src/main/resources/mapper/RoleMenuMapper.xml create mode 100644 core/src/main/resources/mapper/UserPostMapper.xml create mode 100644 core/src/main/resources/mapper/UserRoleMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/MenuController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/RoleController.java diff --git a/core/pom.xml b/core/pom.xml index 5c9a597..83b2460 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -156,6 +156,18 @@ mapstruct-processor 1.4.1.Final + + javax.sip + jain-sip-ri + 1.3.0-91 + compile + + + javax.sip + jain-sip-ri + 1.3.0-91 + compile + diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 24a5037..e0ab24e 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -19,12 +19,19 @@ public class Message implements Serializable { public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; - public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在"; + public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在或者不合法"; public static final String USER_ID_NOT_EXIST = "用户id不存在"; + public static final String USER_ID_NOT_EXIST_OR_ILLEGAL = "用户id不存在或者不合法"; public static final String ACCOUNT_EXIST = "用户账号已经存在,请重新输入"; public static final String MOBILE_EXIST = "手机号码已经存在,请重新输入"; public static final String EMAIL_EXIST = "邮箱已经存在,请重新输入"; - public static final String DEPT_PARENT_NOT_EXISTS = "父级部门不存在"; - public static final String DEPT_ID_NOT_EXISTS = "部门id不存在"; - public static final String POST_ID_NOT_EXISTS = "岗位id不存在"; + public static final String IDENTITY_CARD_EXIST = "身份证已经存在,请重新输入"; + public static final String DEPT_PARENT_NOT_EXIST = "父级部门不存在"; + public static final String DEPT_ID_NOT_EXIST = "部门id不存在"; + public static final String POST_ID_NOT_EXIST = "岗位id不存在"; + public static final String POST_ID_NOT_EXIST_OR_ILLEGAL = "岗位id不存在或者不合法"; + public static final String ROLE_ID_NOT_EXIST = "角色id不存在"; + public static final String ROLE_ID_NOT_EXIST_OR_ILLEGAL = "角色id不存在或者不合法"; + public static final String MENU_ID_NOT_EXIST = "菜单id不存在"; + public static final String MENU_ID_NOT_EXIST_OR_ILLEGAL = "菜单id不存在或者不合法"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index de30c63..ca16bd4 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -53,5 +53,15 @@ public interface Converts { PostResp toPostResp(PostEntity entity); + RoleResp toRoleResp(RoleEntity entity); + + List toRoleResp(List list); + + RoleEntity toRoleEntity(RoleReq req); + + MenuEntity toMenuEntity(MenuReq req); + + MenuResp toMenuResp(MenuEntity entity); + } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java index 85abe4a..4758cd4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java @@ -63,8 +63,6 @@ public class MenuEntity extends AuditableEntity implements Serializable { @TableField("visible") private String visible; - - @ExcelProperty("权限标识") @ApiModelProperty("权限标识") @TableField("perms") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java index 28ea120..fbdbe5a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java @@ -48,9 +48,15 @@ public class RoleEntity extends AuditableEntity implements Serializable { @TableField("status") private Integer status; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + @ExcelProperty("删除标志(0代表存在 1代表删除)") @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableField("del_flag") - private Integer delFlag; + private String delFlag; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java index 4681578..cabdef5 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java @@ -65,6 +65,10 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("name") private String name; + @ApiModelProperty("所属部门") + @TableField("dept_id") + private String deptId; + @ExcelProperty("身份证") @ApiModelProperty("身份证") @TableField("identity_card") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/UserPostEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/UserPostEntity.java new file mode 100644 index 0000000..a32e5ff --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/UserPostEntity.java @@ -0,0 +1,35 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/5/15 23:33 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user_post") +@ApiModel(value="UserPostEntity对象", description="用户和岗位信息表") +public class UserPostEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -4046474045225600954L; + + @ApiModelProperty("用户id") + @TableField("user_id") + private String userId; + + @ApiModelProperty("岗位id") + @TableField("post_id") + private String postId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java new file mode 100644 index 0000000..5783322 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java @@ -0,0 +1,52 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/21/周三 12:31 + * @description + */ +@Data +@ApiModel("菜单信息请求实体") +public class MenuReq implements Serializable { + @Serial + private static final long serialVersionUID = -7141367511437222477L; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "菜单名称不能为空") + @Size(max = 10, message = "菜单名称不能超过10个字符") + @ApiModelProperty("菜单名称") + private String menuName; + + @ApiModelProperty("父级菜单id") + private String parentId; + + @ApiModelProperty("显示顺序") + private Integer orderNum; + + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "请求地址不能超过100个字符") + @ApiModelProperty("请求地址") + private String url; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "菜单类型不能为空") + @ApiModelProperty("菜单类型") + private String menuType; + + @ApiModelProperty("显示状态") + private String visible; + + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "备注不能超过50个字符") + @ApiModelProperty("参数") + private String perms; + + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java new file mode 100644 index 0000000..f533983 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/21/周三 12:31 + * @description + */ +@Data +@ApiModel("菜单信息响应实体") +public class MenuResp implements Serializable { + @Serial + private static final long serialVersionUID = -153724438320680595L; + + @ApiModelProperty("菜单id") + private String menuId; + + @ApiModelProperty("菜单名称") + private String menuName; + + @ApiModelProperty("父级菜单id") + private String parentId; + + @ApiModelProperty("显示顺序") + private String orderNum; + + @ApiModelProperty("请求地址") + private String url; + + @ApiModelProperty("菜单类型") + private String menuType; + + @ApiModelProperty("显示状态") + private String visible; + + @ApiModelProperty("参数") + private String perms; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/RoleMenuReq.java b/core/src/main/java/com/dite/znpt/domain/vo/RoleMenuReq.java new file mode 100644 index 0000000..f7b6663 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/RoleMenuReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 17:33 + * @description + */ +@Data +@ApiModel("角色菜单绑定请求实体") +public class RoleMenuReq implements Serializable { + @Serial + private static final long serialVersionUID = -7759529835730562338L; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "角色id不能为空") + @ApiModelProperty(value = "角色id", required = true) + private String roleId; + + @NotEmpty(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "菜单id不能为空") + @ApiModelProperty(value = "菜单id", required = true) + private List menuIds; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java b/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java new file mode 100644 index 0000000..40134e0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java @@ -0,0 +1,40 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/21/周三 12:29 + * @description + */ +@Data +@ApiModel("角色信息请求实体") +public class RoleReq implements Serializable { + @Serial + private static final long serialVersionUID = -4581059117664119614L; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "角色名称不能为空") + @Size(max = 30, message = "角色名称不能超过30个字符") + @ApiModelProperty("角色名称") + private String roleName; + + @NotBlank(groups = {ValidationGroup.Insert.class}, message = "角色权限字符不能为空") + @Size(groups = {ValidationGroup.Insert.class}, max = 20, message = "角色权限字符不能超过20个字符") + @ApiModelProperty("角色权限字符") + private String roleKey; + + @ApiModelProperty("状态") + private Integer status; + + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "备注不能超过200个字符") + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java b/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java new file mode 100644 index 0000000..a8c5390 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/21/周三 12:26 + * @description + */ +@Data +@ApiModel("角色信息响应实体") +public class RoleResp implements Serializable { + + @Serial + private static final long serialVersionUID = -144489103121775926L; + + @ApiModelProperty("角色id") + private String roleId; + + @ApiModelProperty("角色名称") + private String roleName; + + @ApiModelProperty("角色权限字符") + private String roleKey; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java index 4916041..6d60091 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java @@ -23,6 +23,12 @@ public class UserListReq implements Serializable { @ApiModelProperty("姓名") private String name; + @ApiModelProperty("所属部门id") + private String deptId; + + @ApiModelProperty("岗位id") + private String postId; + @ApiModelProperty("手机号码") private String mobile; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java index 155c991..f99c724 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -26,38 +27,34 @@ public class UserListResp implements Serializable { @ApiModelProperty("账号") private String account; - @ApiModelProperty("头像地址") - private String avatar; - @ApiModelProperty("1正常0禁用") private Integer status; @ApiModelProperty("姓名") private String name; + @ApiModelProperty("所属部门名称") + private String deptName; + + @ApiModelProperty("岗位名称") + private String postName; + @ApiModelProperty("身份证") private String identityCard; - @ApiModelProperty("性别") - private String gender; - @ApiModelProperty("手机号码") private String mobile; @ApiModelProperty("邮箱") private String email; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("入职日期") private LocalDate hiredate; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("出生日期") private LocalDate birthdate; - @ApiModelProperty("学历") - private String education; - - @ApiModelProperty("专业方向") - private String majorField; - } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index 1ca16c3..cee022c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -10,6 +10,7 @@ import javax.validation.constraints.*; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; +import java.util.List; /** * @Author: gaoxiong @@ -38,6 +39,12 @@ public class UserReq implements Serializable { @ApiModelProperty("姓名") private String name; + @ApiModelProperty("所属部门") + private String deptId; + + @ApiModelProperty("岗位") + private List postIds; + @Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp = "^$|\\d(?:\\d{15}|\\d{17})$", message = "身份证号码格式不正确") @ApiModelProperty("身份证") private String identityCard; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java index 27d825c..fe1bf6d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java @@ -25,6 +25,12 @@ public class UserResp extends UserReq implements Serializable{ @ApiModelProperty("账号") private String account; + @ApiModelProperty("所属部门") + private String deptName; + + @ApiModelProperty("岗位,多个岗位英文逗号隔开") + private String postName; + @ApiModelProperty("学历描述") private String educationLabel; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java new file mode 100644 index 0000000..4f7502d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 17:41 + * @description + */ +@Data +@ApiModel("用户角色绑定请求实体") +public class UserRoleReq implements Serializable { + @Serial + private static final long serialVersionUID = -1334908025320245685L; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "用户id不能为空") + @ApiModelProperty("用户id") + private String userId; + + @NotEmpty(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "角色id不能为空") + @ApiModelProperty("角色id") + private List roleIds; +} diff --git a/core/src/main/java/com/dite/znpt/enums/EducationEnum.java b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java index 7e4880a..fef6b8a 100644 --- a/core/src/main/java/com/dite/znpt/enums/EducationEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/EducationEnum.java @@ -46,7 +46,7 @@ public enum EducationEnum { return null == e ? null : e.desc; } - public static List list(){ + public static List listAll(){ List list = new ArrayList<>(EducationEnum.values().length); for (EducationEnum e : EducationEnum.values() ) { JSONObject jsonObject = new JSONObject(); diff --git a/core/src/main/java/com/dite/znpt/enums/GenderEnum.java b/core/src/main/java/com/dite/znpt/enums/GenderEnum.java index 957fb95..11a57bc 100644 --- a/core/src/main/java/com/dite/znpt/enums/GenderEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/GenderEnum.java @@ -39,7 +39,7 @@ public enum GenderEnum { return null == e ? null : e.desc; } - public static List list(){ + public static List listAll(){ List list = new ArrayList<>(GenderEnum.values().length); for (GenderEnum e : GenderEnum.values() ) { JSONObject jsonObject = new JSONObject(); diff --git a/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java new file mode 100644 index 0000000..3cd0543 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java @@ -0,0 +1,52 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 14:44 + * @description + */ +@Getter +public enum MenuTypeEnum { + + DEFECT("catalog", "目录"), + TYPICAL("route", "菜单"), + OTHER("button", "按钮"); + + private final String code; + private final String desc; + + MenuTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static MenuTypeEnum getByCode(String code){ + for (MenuTypeEnum e : MenuTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + MenuTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(MenuTypeEnum.values().length); + for (MenuTypeEnum e : MenuTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java b/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java new file mode 100644 index 0000000..831a489 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java @@ -0,0 +1,33 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.MenuEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:16 + * @description + */ +public interface MenuMapper extends BaseMapper { + /** + * @Author Bear.G + * @Date 2025/5/20/周二 15:49 + * @description 向上递归查询菜单树 + * @param menuName + * @return + **/ + List upwardRecursionSelect(@Param("menuName") String menuName); + + /** + * @Author Bear.G + * @Date 2025/5/20/周二 15:49 + * @description 向下递归查询菜单树 + * @param menuId + * @return + **/ + List downwardRecursionSelect(@Param("menuId") String menuId); +} diff --git a/core/src/main/java/com/dite/znpt/mapper/RoleMapper.java b/core/src/main/java/com/dite/znpt/mapper/RoleMapper.java new file mode 100644 index 0000000..e1cfdbf --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RoleMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.RoleEntity; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:16 + * @description + */ +public interface RoleMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/RoleMenuMapper.java b/core/src/main/java/com/dite/znpt/mapper/RoleMenuMapper.java new file mode 100644 index 0000000..227df93 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RoleMenuMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.RoleMenuEntity; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:17 + * @description + */ +public interface RoleMenuMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/UserMapper.java b/core/src/main/java/com/dite/znpt/mapper/UserMapper.java index 51cd24b..ac20a77 100644 --- a/core/src/main/java/com/dite/znpt/mapper/UserMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/UserMapper.java @@ -3,6 +3,7 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.UserListReq; +import com.dite.znpt.domain.vo.UserListResp; import com.dite.znpt.domain.vo.UserResp; import java.util.List; @@ -13,6 +14,6 @@ import java.util.List; * @Description: 用户信息表数据库访问层 */ public interface UserMapper extends BaseMapper { - List queryBySelective(UserListReq req); + List queryBySelective(UserListReq req); } diff --git a/core/src/main/java/com/dite/znpt/mapper/UserPostMapper.java b/core/src/main/java/com/dite/znpt/mapper/UserPostMapper.java new file mode 100644 index 0000000..fee40fd --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/UserPostMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.UserPostEntity; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:15 + * @description + */ +public interface UserPostMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/UserRoleMapper.java b/core/src/main/java/com/dite/znpt/mapper/UserRoleMapper.java new file mode 100644 index 0000000..0e0065c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/UserRoleMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.UserRoleEntity; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:16 + * @description + */ +public interface UserRoleMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/MenuService.java b/core/src/main/java/com/dite/znpt/service/MenuService.java new file mode 100644 index 0000000..d57c773 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/MenuService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.MenuEntity; +import com.dite.znpt.domain.vo.MenuReq; +import com.dite.znpt.domain.vo.MenuResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:24 + * @description + */ +public interface MenuService extends IService { + + List> tree(String menuName); + MenuResp detail(String menuId); + void save(MenuReq req); + void update(String menuId, MenuReq req); + void deleteById(String menuId); +} diff --git a/core/src/main/java/com/dite/znpt/service/RoleMenuService.java b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java new file mode 100644 index 0000000..f7f150b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java @@ -0,0 +1,17 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.RoleMenuEntity; +import com.dite.znpt.domain.vo.RoleMenuReq; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 16:01 + * @description + */ +public interface RoleMenuService extends IService { + + void bindRoleMenu(RoleMenuReq req); +} diff --git a/core/src/main/java/com/dite/znpt/service/RoleService.java b/core/src/main/java/com/dite/znpt/service/RoleService.java new file mode 100644 index 0000000..2cd626a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RoleService.java @@ -0,0 +1,28 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.RoleEntity; +import com.dite.znpt.domain.vo.RoleReq; +import com.dite.znpt.domain.vo.RoleResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:24 + * @description + */ +public interface RoleService extends IService { + + List page(String roleName); + + List list(String roleName); + + void save(RoleReq req); + + void update(String roleId, RoleReq req); + + void deleteById(String id); + + RoleResp detail(String roleId); +} diff --git a/core/src/main/java/com/dite/znpt/service/UserPostService.java b/core/src/main/java/com/dite/znpt/service/UserPostService.java new file mode 100644 index 0000000..4b67fd3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/UserPostService.java @@ -0,0 +1,16 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.UserPostEntity; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:39 + * @description + */ +public interface UserPostService extends IService { + void bindUserPost(String userId, List postIds); + void bindPostUser(String postId, List userIds); +} diff --git a/core/src/main/java/com/dite/znpt/service/UserRoleService.java b/core/src/main/java/com/dite/znpt/service/UserRoleService.java new file mode 100644 index 0000000..37dcd06 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/UserRoleService.java @@ -0,0 +1,19 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.UserRoleEntity; +import com.dite.znpt.domain.vo.UserRoleReq; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:33 + * @description + */ +public interface UserRoleService extends IService { + + void bindUserRole(UserRoleReq req); + + void bindRoleUser(String roleId, List userIds); +} diff --git a/core/src/main/java/com/dite/znpt/service/UserService.java b/core/src/main/java/com/dite/znpt/service/UserService.java index 85f83dc..46a1c8d 100644 --- a/core/src/main/java/com/dite/znpt/service/UserService.java +++ b/core/src/main/java/com/dite/znpt/service/UserService.java @@ -3,6 +3,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.UserListReq; +import com.dite.znpt.domain.vo.UserListResp; import com.dite.znpt.domain.vo.UserReq; import com.dite.znpt.domain.vo.UserResp; @@ -23,7 +24,7 @@ public interface UserService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List page(UserListReq req); + List page(UserListReq req); /** * 功能描述:查询用户信息列表 * @@ -32,7 +33,7 @@ public interface UserService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List list(UserListReq req); + List list(UserListReq req); /** * 功能描述:查询用户信息详情 diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index b2cd108..9259bb5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -107,7 +107,7 @@ public class DefectServiceImpl extends ServiceImpl i List imageEntityList = imageService.batchSaveByImageSimpleReq(imageSimpleReqList); Map imageMap = imageEntityList.stream().collect(Collectors.toMap(k->k.getPartId().concat(StrUtil.COLON).concat(k.getImagePath()), Function.identity())); List defectEntityList = new ArrayList<>(); - list.stream().forEach(req -> { + list.forEach(req -> { String key = req.getPartId().concat(StrUtil.COLON).concat(req.getImagePath()); if(imageMap.containsKey(key)){ DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); diff --git a/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java index 804d199..583e11e 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java @@ -57,7 +57,7 @@ public class DeptServiceImpl extends ServiceImpl impleme public DeptResp detail(String deptId) { DeptEntity entity = this.getById(deptId); if (null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ - throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + throw new ServiceException(Message.DEPT_ID_NOT_EXIST); } return Converts.INSTANCE.toDeptResp(entity); } @@ -73,7 +73,7 @@ public class DeptServiceImpl extends ServiceImpl impleme public void update(String deptId, DeptReq req) { DeptEntity originalEntity = this.getById(deptId); if (null == originalEntity || !originalEntity.getDelFlag().equals(Constants.DEL_FLAG_0)){ - throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + throw new ServiceException(Message.DEPT_ID_NOT_EXIST); } DeptEntity entity = dealDept(req); entity.setDeptId(deptId); @@ -91,7 +91,7 @@ public class DeptServiceImpl extends ServiceImpl impleme if(StrUtil.isNotBlank(req.getParentId())){ DeptEntity parent = this.getById(req.getParentId()); if(null == parent || !parent.getDelFlag().equals(Constants.DEL_FLAG_0)){ - throw new ServiceException(Message.DEPT_PARENT_NOT_EXISTS); + throw new ServiceException(Message.DEPT_PARENT_NOT_EXIST); } entity.setAncestors(parent.getAncestors() + StrUtil.COMMA + parent.getDeptId()); entity.setDeptFullName(parent.getDeptFullName() + StrUtil.SLASH + entity.getDeptName()); @@ -108,7 +108,7 @@ public class DeptServiceImpl extends ServiceImpl impleme public void deleteById(String deptId) { DeptEntity entity = this.getById(deptId); if (null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ - throw new ServiceException(Message.DEPT_ID_NOT_EXISTS); + throw new ServiceException(Message.DEPT_ID_NOT_EXIST); } entity.setDelFlag(Constants.DEL_FLAG_1); this.updateById(entity); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 8c66217..cb8f22c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -59,7 +59,7 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); String permPathPrefix = permPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); String temPathPrefix = tempPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); - imageList.stream().forEach(image -> { + imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); String path = permPathPrefix + image.getImageName(); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index bc25def..886c7de 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -84,7 +84,7 @@ public class ImageServiceImpl extends ServiceImpl impl List imageList = new ArrayList<>(); List partIds = list.stream().map(ImageSimpleReq::getPartId).collect(Collectors.toList()); Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); - list.stream().forEach(req -> { + list.forEach(req -> { if(partIdMap.containsKey(req.getPartId())){ String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); diff --git a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java new file mode 100644 index 0000000..b6c93a3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java @@ -0,0 +1,84 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.MenuEntity; +import com.dite.znpt.domain.vo.MenuReq; +import com.dite.znpt.domain.vo.MenuResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.MenuMapper; +import com.dite.znpt.service.MenuService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:27 + * @description + */ +@Service +public class MenuServiceImpl extends ServiceImpl implements MenuService { + + @Override + public List> tree(String menuName) { + List menuList = StrUtil.isBlank(menuName) ? this.baseMapper.downwardRecursionSelect(null) : this.baseMapper.upwardRecursionSelect(menuName); + //配置 + TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); + treeNodeConfig.setIdKey("menuId"); + treeNodeConfig.setNameKey("menuName"); + treeNodeConfig.setParentIdKey("parentId"); + treeNodeConfig.setWeightKey("orderNum"); + //转换器 + return TreeUtil.build(menuList, "0", treeNodeConfig, + (treeNode, tree) -> { + tree.setId(treeNode.getMenuId()); + tree.setParentId(treeNode.getParentId()); + tree.setName(treeNode.getMenuName()); + tree.putExtra("menuType",treeNode.getMenuType()); + tree.putExtra("visible",treeNode.getVisible()); + tree.putExtra("orderNum",treeNode.getOrderNum()); + }); + } + + @Override + public MenuResp detail(String menuId) { + return Converts.INSTANCE.toMenuResp(this.getById(menuId)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(MenuReq req) { + MenuEntity entity = Converts.INSTANCE.toMenuEntity(req); + entity.setParentId(StrUtil.isBlank(req.getParentId()) ? "0" : req.getParentId()); + entity.setVisible(StrUtil.isBlank(req.getVisible()) ? "0" : req.getVisible()); + this.save(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String menuId, MenuReq req) { + if(null == this.getById(menuId)){ + throw new ServiceException(Message.MENU_ID_NOT_EXIST); + } + MenuEntity entity = Converts.INSTANCE.toMenuEntity(req); + entity.setMenuId(menuId); + if(StrUtil.isBlank(entity.getParentId())){ + entity.setParentId("0"); + } + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String menuId) { + this.removeById(menuId); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java index e952e4e..6e321df 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java @@ -1,20 +1,28 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.PostEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.UserPostEntity; import com.dite.znpt.domain.vo.PostReq; import com.dite.znpt.domain.vo.PostResp; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.PostMapper; +import com.dite.znpt.mapper.UserPostMapper; import com.dite.znpt.service.PostService; +import com.dite.znpt.service.UserService; import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; /** @@ -24,6 +32,10 @@ import java.util.List; */ @Service public class PostServiceImpl extends ServiceImpl implements PostService { + @Resource + private UserService userService; + @Resource + private UserPostMapper userPostMapper; @Override public List page(String postName) { @@ -52,7 +64,7 @@ public class PostServiceImpl extends ServiceImpl impleme @Override public void update(String postId, PostReq req) { if(null == this.getById(postId)){ - throw new ServiceException(Message.POST_ID_NOT_EXISTS); + throw new ServiceException(Message.POST_ID_NOT_EXIST); } PostEntity entity = Converts.INSTANCE.toPostEntity(req); entity.setPostId(postId); @@ -63,7 +75,7 @@ public class PostServiceImpl extends ServiceImpl impleme @Override public void deleteById(String postId) { if(null == this.getById(postId)){ - throw new ServiceException(Message.POST_ID_NOT_EXISTS); + throw new ServiceException(Message.POST_ID_NOT_EXIST); } this.removeById(postId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/RoleMenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RoleMenuServiceImpl.java new file mode 100644 index 0000000..aaeca56 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RoleMenuServiceImpl.java @@ -0,0 +1,59 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.MenuEntity; +import com.dite.znpt.domain.entity.RoleEntity; +import com.dite.znpt.domain.entity.RoleMenuEntity; +import com.dite.znpt.domain.vo.RoleMenuReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.RoleMenuMapper; +import com.dite.znpt.service.MenuService; +import com.dite.znpt.service.RoleMenuService; +import com.dite.znpt.service.RoleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 16:02 + * @description + */ +@Service +public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { + + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + + @Transactional(rollbackFor = Exception.class) + @Override + public void bindRoleMenu(RoleMenuReq req) { + RoleEntity role = roleService.getById(req.getRoleId()); + if (role == null || !Constants.DEL_FLAG_0.equals(role.getDelFlag())) { + throw new ServiceException(Message.ROLE_ID_NOT_EXIST_OR_ILLEGAL); + } + List menuList = menuService.listByIds(req.getMenuIds()); + if(CollUtil.isEmpty(menuList) || menuList.size() != req.getMenuIds().size()){ + throw new ServiceException(Message.MENU_ID_NOT_EXIST_OR_ILLEGAL); + } + this.remove(Wrappers.lambdaQuery(RoleMenuEntity.class).eq(RoleMenuEntity::getRoleId, req.getRoleId())); + List roleMenuList =new ArrayList<>(req.getMenuIds().size()); + for (String menuId : req.getMenuIds()) { + RoleMenuEntity roleMenu = new RoleMenuEntity(); + roleMenu.setRoleId(req.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenuList.add(roleMenu); + } + this.saveBatch(roleMenuList); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..fa1cb66 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java @@ -0,0 +1,81 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.RoleEntity; +import com.dite.znpt.domain.vo.RoleReq; +import com.dite.znpt.domain.vo.RoleResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.RoleMapper; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 10:25 + * @description + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + + @Override + public List page(String roleName) { + PageUtil.startPage(); + return this.list(roleName); + } + + @Override + public List list(String roleName) { + List list = this.list( + Wrappers.lambdaQuery(RoleEntity.class) + .eq(RoleEntity::getDelFlag, Constants.DEL_FLAG_0) + .like(StrUtil.isNotBlank(roleName), RoleEntity::getRoleName, roleName) + ); + return Converts.INSTANCE.toRoleResp(list); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(RoleReq req) { + RoleEntity entity = Converts.INSTANCE.toRoleEntity(req); + this.save(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String roleId, RoleReq req) { + RoleEntity originEntity = this.getById(roleId); + if(null == originEntity || !Constants.DEL_FLAG_0.equals(originEntity.getDelFlag())) { + throw new ServiceException(Message.ROLE_ID_NOT_EXIST); + } + RoleEntity entity = Converts.INSTANCE.toRoleEntity(req); + entity.setRoleId(roleId); + entity.setRoleKey(null); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String roleId) { + RoleEntity entity = this.getById(roleId); + if(null == entity || !Constants.DEL_FLAG_0.equals(entity.getDelFlag())) { + throw new ServiceException(Message.ROLE_ID_NOT_EXIST); + } + entity.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(entity); + } + + @Override + public RoleResp detail(String roleId) { + return Converts.INSTANCE.toRoleResp(this.getById(roleId)); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java new file mode 100644 index 0000000..8e6410e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java @@ -0,0 +1,79 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.PostEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.UserPostEntity; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.UserPostMapper; +import com.dite.znpt.service.PostService; +import com.dite.znpt.service.UserPostService; +import com.dite.znpt.service.UserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:40 + * @description + */ +@Service +public class UserPostServiceImpl extends ServiceImpl implements UserPostService { + + @Resource + private PostService postService; + @Resource + private UserService userService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void bindUserPost(String userId, List postIds) { + List postList = postService.listByIds(postIds); + if(CollUtil.isEmpty(postList) || postList.size() != postIds.size()){ + throw new ServiceException(Message.POST_ID_NOT_EXIST_OR_ILLEGAL); + } + UserEntity user = userService.getById(userId); + if(null == user || Constants.DEL_FLAG_1.equals(user.getDelFlag())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST); + } + this.remove(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getUserId, userId)); + List userPostList = new ArrayList<>(); + postIds.forEach(postId -> { + UserPostEntity userPostEntity = new UserPostEntity(); + userPostEntity.setUserId(userId); + userPostEntity.setPostId(postId); + userPostList.add(userPostEntity); + }); + this.saveBatch(userPostList); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void bindPostUser(String postId, List userIds) { + PostEntity post = postService.getById(postId); + if(null == post || !Constants.STATUS_0.equals(post.getStatus())){ + throw new ServiceException(Message.POST_ID_NOT_EXIST_OR_ILLEGAL); + } + List userList = userService.listByIds(userIds).stream().filter(userEntity -> !Constants.DEL_FLAG_1.equals(userEntity.getDelFlag())).toList(); + if(CollUtil.isEmpty(userList) || userIds.size() != userList.size()){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + this.remove(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getPostId, postId)); + List userPostList = new ArrayList<>(); + userIds.forEach(userId -> { + UserPostEntity userPostEntity = new UserPostEntity(); + userPostEntity.setUserId(userId); + userPostEntity.setPostId(postId); + userPostList.add(userPostEntity); + }); + this.saveBatch(userPostList); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..c08c3c0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,78 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.RoleEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.UserRoleEntity; +import com.dite.znpt.domain.vo.UserRoleReq; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.UserRoleMapper; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.service.UserRoleService; +import com.dite.znpt.service.UserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:33 + * @description + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + + @Resource + private UserService userService; + + @Resource + private RoleService roleService; + + @Transactional(rollbackFor = Exception.class) + @Override + public void bindUserRole(UserRoleReq req) { + UserEntity user = userService.getById(req.getUserId()); + if(null == user || !Constants.DEL_FLAG_0.equals(user.getDelFlag())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + List roleList = roleService.listByIds(req.getRoleIds()).stream().filter(role -> Constants.DEL_FLAG_0.equals(role.getDelFlag())).toList(); + if(CollUtil.isEmpty(roleList) || req.getRoleIds().size() != roleList.size()){ + throw new ServiceException(Message.ROLE_ID_NOT_EXIST_OR_ILLEGAL); + } + List userRoleList = new ArrayList<>(); + req.getRoleIds().forEach(roleId -> { + UserRoleEntity userRole = new UserRoleEntity(); + userRole.setUserId(req.getUserId()); + userRole.setRoleId(roleId); + userRoleList.add(userRole); + }); + this.saveBatch(userRoleList); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void bindRoleUser(String roleId, List userIds) { + RoleEntity role = roleService.getById(roleId); + if(role == null || !Constants.DEL_FLAG_0.equals(role.getDelFlag())){ + throw new ServiceException(Message.ROLE_ID_NOT_EXIST_OR_ILLEGAL); + } + List userList = userService.listByIds(userIds).stream().filter(user -> Constants.DEL_FLAG_0.equals(user.getDelFlag())).toList(); + if(CollUtil.isEmpty(userList) || userIds.size()!= userList.size()){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + List userRoleList = new ArrayList<>(); + userIds.forEach(userId -> { + UserRoleEntity userRole = new UserRoleEntity(); + userRole.setUserId(userId); + userRole.setRoleId(roleId); + userRoleList.add(userRole); + }); + this.saveBatch(userRoleList); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index e576f9b..6197865 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -2,31 +2,38 @@ package com.dite.znpt.service.impl; import cn.dev33.satoken.secure.SaBase64Util; import cn.dev33.satoken.secure.SaSecureUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.PostEntity; import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.UserPostEntity; import com.dite.znpt.domain.vo.UserListReq; +import com.dite.znpt.domain.vo.UserListResp; import com.dite.znpt.domain.vo.UserReq; import com.dite.znpt.domain.vo.UserResp; -import com.dite.znpt.enums.EducationEnum; import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.service.UserService; import com.dite.znpt.mapper.UserMapper; +import com.dite.znpt.service.DeptService; +import com.dite.znpt.service.PostService; +import com.dite.znpt.service.UserPostService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; import com.dite.znpt.util.PasswordUtil; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; /** * @author huise23 @@ -43,6 +50,15 @@ public class UserServiceImpl extends ServiceImpl impleme @Value("${password.enable-default:true}") private Boolean enableDefaultPassword; + @Resource + private DeptService deptService; + + @Resource + private PostService postService; + + @Resource + private UserPostService userPostService; + /** * 功能描述:分页查询用户信息列表 * @@ -52,7 +68,7 @@ public class UserServiceImpl extends ServiceImpl impleme * @date 2025/04/11 23:17 **/ @Override - public List page(UserListReq req) { + public List page(UserListReq req) { PageUtil.startPage(); return this.list(req); } @@ -66,13 +82,8 @@ public class UserServiceImpl extends ServiceImpl impleme * @date 2025/04/11 23:17 **/ @Override - public List list(UserListReq req) { - PageUtil.startPage(); - List userRespList= this.baseMapper.queryBySelective(req); - userRespList.forEach(resp -> { - resp.setEducationLabel(EducationEnum.getDescByCode(resp.getEducation())); - }); - return userRespList; + public List list(UserListReq req) { + return this.baseMapper.queryBySelective(req); } /** @@ -86,7 +97,18 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public UserResp detail(String userId) { UserEntity entity = this.getById(userId); - return Converts.INSTANCE.toUserResp(entity); + UserResp userResp= Converts.INSTANCE.toUserResp(entity); + if(StrUtil.isNotBlank(userResp.getDeptId())){ + userResp.setUserId(deptService.getById(userResp.getDeptId()).getDeptName()); + } + List userPostList = userPostService.list(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getUserId, userId)); + if(CollUtil.isNotEmpty(userPostList)){ + String postName = postService.listByIds( + userPostList.stream().map(UserPostEntity::getPostId).toList() + ).stream().map(PostEntity::getPostName).collect(Collectors.joining(StrUtil.COMMA)); + userResp.setPostName(postName); + } + return userResp; } /** @@ -106,6 +128,9 @@ public class UserServiceImpl extends ServiceImpl impleme String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword(); entity.setPassword(SaSecureUtil.md5(req.getAccount().concat(password).concat(salt))); this.save(entity); + if(CollUtil.isNotEmpty(req.getPostIds())){ + userPostService.bindUserPost(entity.getUserId(), req.getPostIds()); + } return SaBase64Util.encode(password); } @@ -128,27 +153,39 @@ public class UserServiceImpl extends ServiceImpl impleme entity.setUserId(userId); entity.setAccount(null); validate(req, originalEntity); + if(CollUtil.isNotEmpty(req.getPostIds())){ + userPostService.bindUserPost(userId, req.getPostIds()); + } this.updateById(entity); } private void validate(UserReq req, UserEntity originalEntity){ + if(StrUtil.isNotBlank(req.getDeptId()) && deptService.getById(req.getDeptId()) == null){ + throw new ServiceException(Message.DEPT_ID_NOT_EXIST); + } LambdaQueryWrapper accountWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); if(this.getOne(accountWrapper) != null && originalEntity == null){ throw new ServiceException(Message.ACCOUNT_EXIST); } - if(originalEntity == null || !originalEntity.getMobile().equals(req.getMobile())){ + if(originalEntity == null || (StrUtil.isNotBlank(req.getMobile()) && !originalEntity.getMobile().equals(req.getMobile()))){ LambdaQueryWrapper mobileWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getMobile()), UserEntity::getMobile, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); if(this.getOne(mobileWrapper) != null){ throw new ServiceException(Message.MOBILE_EXIST); } } - if(originalEntity == null || !originalEntity.getEmail().equals(req.getEmail())){ - LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getEmail()), UserEntity::getEmail, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + if(originalEntity == null || (StrUtil.isNotBlank(req.getEmail()) && !originalEntity.getEmail().equals(req.getEmail()))){ + LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getEmail()), UserEntity::getEmail, req.getEmail()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); if(this.getOne(emailWrapper) != null){ throw new ServiceException(Message.EMAIL_EXIST); } } + if(originalEntity == null || (StrUtil.isNotBlank(req.getIdentityCard()) && !originalEntity.getIdentityCard().equals(req.getIdentityCard()))){ + LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getIdentityCard()), UserEntity::getIdentityCard, req.getIdentityCard()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + if(this.getOne(emailWrapper) != null){ + throw new ServiceException(Message.IDENTITY_CARD_EXIST); + } + } } /** diff --git a/core/src/main/resources/mapper/DeptMapper.xml b/core/src/main/resources/mapper/DeptMapper.xml index 2830fe0..0ab4fda 100644 --- a/core/src/main/resources/mapper/DeptMapper.xml +++ b/core/src/main/resources/mapper/DeptMapper.xml @@ -16,8 +16,7 @@ UNION ALL SELECT d.* FROM dept d INNER JOIN DeptPath dp ON d.dept_id = dp.parent_id WHERE d.del_flag = '0' - ) - SELECT DISTINCT * FROM DeptPath; + )SELECT DISTINCT * FROM DeptPath; diff --git a/core/src/main/resources/mapper/MenuMapper.xml b/core/src/main/resources/mapper/MenuMapper.xml new file mode 100644 index 0000000..f2a0ca3 --- /dev/null +++ b/core/src/main/resources/mapper/MenuMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/RoleMapper.xml b/core/src/main/resources/mapper/RoleMapper.xml new file mode 100644 index 0000000..0aebfc8 --- /dev/null +++ b/core/src/main/resources/mapper/RoleMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/RoleMenuMapper.xml b/core/src/main/resources/mapper/RoleMenuMapper.xml new file mode 100644 index 0000000..884c0f4 --- /dev/null +++ b/core/src/main/resources/mapper/RoleMenuMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index 910b0c4..343fefb 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -7,27 +7,37 @@ a.password, a.status - SELECT - u.user_id, u.account, u.avatar, u.status, u.name, u.identity_card, u.gender, u.mobile, u.email, u.hiredate, u.birthdate, u.education, major_field + u.user_id, u.account, u.status, u.name, d.dept_name, u.identity_card, u.mobile, u.email, u.hiredate, u.birthdate, GROUP_CONCAT(p.post_name) AS post_name FROM user u + LEFT JOIN dept d ON u.dept_id = d.dept_id + LEFT JOIN user_post up ON u.user_id = up.user_id + LEFT JOIN post p ON up.post_id = p.post_id - AND a.account LIKE concat ('%', #{account}, '%') + AND u.account LIKE concat ('%', #{account}, '%') - AND a.name LIKE concat ('%', #{name}, '%') + AND u.name LIKE concat ('%', #{name}, '%') - AND a.mobile LIKE concat ('%', #{mobile}, '%') + AND u.mobile LIKE concat ('%', #{mobile}, '%') - AND a.email LIKE concat ('%', #{email}, '%') + AND u.email LIKE concat ('%', #{email}, '%') + + + AND d.dept_id = #{deptId} + + + AND p.post_id = #{postId} - AND a.status = #{status} + AND u.status = #{status} + GROUP BY u.user_id, u.account, u.status, u.name, d.dept_name, u.identity_card, u.mobile, u.email, u.hiredate, u.birthdate diff --git a/core/src/main/resources/mapper/UserPostMapper.xml b/core/src/main/resources/mapper/UserPostMapper.xml new file mode 100644 index 0000000..fdae37b --- /dev/null +++ b/core/src/main/resources/mapper/UserPostMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/UserRoleMapper.xml b/core/src/main/resources/mapper/UserRoleMapper.xml new file mode 100644 index 0000000..f00a8db --- /dev/null +++ b/core/src/main/resources/mapper/UserRoleMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index c9620f7..0405b14 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -45,11 +45,13 @@ public class CommonController { public Result listDefectType(){ return Result.ok(DefectTypeEnum.listAll()); } + @ApiOperation(value = "查询图像类型", httpMethod = "GET") @GetMapping("/list/image-type") public Result listImageType(){ return Result.ok(ImageTypeEnum.listAll()); } + @ApiOperation(value = "查询项目状态", httpMethod = "GET") @GetMapping("/list/project-status") public Result listProjectStatus(){ @@ -95,12 +97,13 @@ public class CommonController { @ApiOperation(value = "查询学历", httpMethod = "GET") @GetMapping("/list/education") public Result listEducation(){ - return Result.ok(EducationEnum.list()); + return Result.ok(EducationEnum.listAll()); } + @ApiOperation(value = "查询性别", httpMethod = "GET") @GetMapping("/list/gender") public Result listGender(){ - return Result.ok(GenderEnum.list()); + return Result.ok(GenderEnum.listAll()); } @ApiOperation(value = "上传图片", httpMethod = "POST") @@ -138,4 +141,11 @@ public class CommonController { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } + @ApiOperation(value = "查询菜单类型", httpMethod = "GET") + @GetMapping("/list/menu-type") + public Result listMenuType(){ + return Result.ok(MenuTypeEnum.listAll()); + } + + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/MenuController.java b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java new file mode 100644 index 0000000..cc39b84 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java @@ -0,0 +1,58 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.MenuReq; +import com.dite.znpt.domain.vo.MenuResp; +import com.dite.znpt.service.MenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:01 + * @description + */ +@Api(tags = "菜单信息") +@RestController +@RequestMapping("/menu") +public class MenuController { + + @Resource + private MenuService menuService; + + @ApiOperation(value = "查询菜单树", httpMethod = "GET") + @GetMapping("/tree") + public Result tree (@RequestParam(name = "menuName", required = false) String menuName) { + return Result.ok(menuService.tree(menuName)); + } + + @ApiOperation(value = "查询菜单详情", httpMethod = "GET") + @GetMapping("/detail/{menuId}") + public Result detail(@PathVariable String menuId) { + return Result.ok(menuService.detail(menuId)); + } + + @ApiOperation(value = "新增菜单", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody MenuReq req) { + menuService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改菜单", httpMethod = "PUT") + @PutMapping("/{menuId}") + public Result update(@PathVariable String menuId, @RequestBody MenuReq req) { + menuService.update(menuId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除菜单", httpMethod = "DELETE") + @DeleteMapping("/{menuId}") + public Result delete(@PathVariable String menuId) { + menuService.deleteById(menuId); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/RoleController.java b/web/src/main/java/com/dite/znpt/web/controller/RoleController.java new file mode 100644 index 0000000..866a0f3 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/RoleController.java @@ -0,0 +1,82 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.RoleMenuReq; +import com.dite.znpt.domain.vo.RoleReq; +import com.dite.znpt.domain.vo.RoleResp; +import com.dite.znpt.service.RoleMenuService; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.service.UserRoleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/21/周三 15:00 + * @description + */ +@Api(tags = "角色信息") +@RestController +@RequestMapping("/role") +public class RoleController { + + @Resource + private RoleService roleService; + + @Resource + private RoleMenuService roleMenuService; + + @ApiOperation(value = "分页查询角色信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(value = "roleName", required = false) String roleName){ + return PageResult.ok(roleService.page(roleName)); + } + + @ApiOperation(value = "查询角色信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestParam(value = "roleName", required = false) String roleName){ + return Result.ok(roleService.list(roleName)); + } + + @ApiOperation(value = "查询角色信息详情", httpMethod = "GET") + @GetMapping("/detail/{roleId}") + public Result detail(@PathVariable String roleId){ + return Result.ok(roleService.detail(roleId)); + } + + @ApiOperation(value = "新增角色信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody RoleReq req){ + roleService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改角色信息", httpMethod = "PUT") + @PutMapping("/{roleId}") + public Result edit(@PathVariable String roleId, @RequestBody RoleReq req){ + roleService.update(roleId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除角色信息", httpMethod = "DELETE") + @DeleteMapping("/{roleId}") + public Result delete(@PathVariable String roleId){ + roleService.deleteById(roleId); + return Result.ok(); + } + + @ApiOperation(value = "绑定菜单", httpMethod = "PUT") + @PutMapping("/bind-menu") + public Result bindMenu(@Validated @RequestBody RoleMenuReq req){ + roleMenuService.bindRoleMenu(req); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/UserController.java b/web/src/main/java/com/dite/znpt/web/controller/UserController.java index 13b5e87..1ba33e6 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/UserController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/UserController.java @@ -1,25 +1,19 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.vo.UserListReq; -import com.dite.znpt.domain.vo.UserReq; -import com.dite.znpt.domain.vo.UserResp; -import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.service.UserRoleService; import com.dite.znpt.service.UserService; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; import com.dite.znpt.util.ValidationGroup; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.List; /** @@ -32,16 +26,18 @@ import java.util.List; public class UserController { @Resource private UserService userService; + @Resource + private UserRoleService userRoleService; @ApiOperation(value = "分页查询用户信息列表", httpMethod = "GET") @GetMapping("/page") - public PageResult page(UserListReq req) { + public PageResult page(UserListReq req) { return PageResult.ok(userService.page(req)); } @ApiOperation(value = "查询用户信息列表", httpMethod = "GET") @GetMapping("/list") - public PageResult list(UserListReq req) { + public PageResult list(UserListReq req) { return PageResult.ok(userService.list(req)); } @@ -64,33 +60,18 @@ public class UserController { return Result.ok(); } + @ApiOperation(value = "绑定角色", httpMethod = "PUT") + @PutMapping("/bind-role") + public Result bindRole(@Validated @RequestBody UserRoleReq req){ + userRoleService.bindUserRole(req); + return Result.ok(); + } + @ApiOperation(value = "删除用户信息", httpMethod = "DELETE") @DeleteMapping("/{userId}") public Result remove(@PathVariable String userId) { userService.deleteById(userId); return Result.ok(); } - - @ApiOperation(value = "导出用户信息-需求待明确", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "用户信息") - public List export(UserListReq req) { -// return userService.selectList(req); - // TODO - return null; - } - - @ApiOperation(value = "导入用户信息-需求待明确", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); -// if (errorMessageList != null && !errorMessageList.isEmpty()) { -// return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); -// } -// return Result.okM("导入"+dataList.size()+"条数据"); - // TODO - return null; - } } From 98950780f530854937799416b9dfa3d3168f1e89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Fri, 23 May 2025 17:52:58 +0800 Subject: [PATCH 046/143] =?UTF-8?q?1=E3=80=81=E7=99=BB=E9=99=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BDtodo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 6 + .../dite/znpt/config/SaTokenConfigure.java | 76 --- .../com/dite/znpt/config/WebMvcConfig.java | 90 ++-- .../com/dite/znpt/constant/Constants.java | 20 + .../java/com/dite/znpt/converts/Converts.java | 2 + .../com/dite/znpt/domain/vo/LoginReq.java | 30 ++ .../com/dite/znpt/domain/vo/UserInfo.java | 29 ++ .../RestResponseEntityExceptionHandler.java | 5 + .../com/dite/znpt/service/LoginService.java | 23 + .../dite/znpt/service/UserPostService.java | 3 + .../dite/znpt/service/UserRoleService.java | 3 + .../znpt/service/impl/LoginServiceImpl.java | 82 ++++ .../service/impl/UserPostServiceImpl.java | 9 + .../service/impl/UserRoleServiceImpl.java | 10 + .../java/com/dite/znpt/util/PasswordUtil.java | 12 - doc/aesDemo.html | 459 ++++++++++++++++++ .../znpt/web/controller/LoginController.java | 26 +- web/src/main/resources/application-dev.yml | 17 + 18 files changed, 781 insertions(+), 121 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java create mode 100644 core/src/main/java/com/dite/znpt/service/LoginService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java create mode 100644 doc/aesDemo.html diff --git a/core/pom.xml b/core/pom.xml index 83b2460..a5536ed 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,6 +21,12 @@ sa-token-spring-boot-starter 1.43.0 + + + cn.dev33 + sa-token-redis-template + 1.43.0 + org.springframework.boot spring-boot-devtools diff --git a/core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java b/core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java deleted file mode 100644 index 31f54d8..0000000 --- a/core/src/main/java/com/dite/znpt/config/SaTokenConfigure.java +++ /dev/null @@ -1,76 +0,0 @@ -//package com.dite.znpt.configuration; -// -//import cn.dev33.satoken.config.SaTokenConfig; -//import cn.dev33.satoken.context.SaHolder; -//import cn.dev33.satoken.exception.NotLoginException; -//import cn.dev33.satoken.filter.SaServletFilter; -//import cn.dev33.satoken.interceptor.SaInterceptor; -//import cn.dev33.satoken.stp.StpUtil; -//import cn.dev33.satoken.util.SaResult; -//import cn.hutool.extra.spring.SpringUtil; -//import com.gaea.common.common.constants.Constants; -//import com.gaea.common.common.enums.CommonEOS; -//import com.gaea.data.base.context.UserContext; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.context.annotation.Primary; -//import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -// -///** -// * @description: Sa-Token 权限认证 配置类 -// */ -//@Slf4j -//@Configuration -//public class SaTokenConfigure implements WebMvcConfigurer { -// -// @Value("${spring.profiles.active}") -// private String profile; -// -// /** -// * @author wujinsong -// * @date 2021/11/20 9:22 下午 -// * @description: 注册 Sa-Token 全局过滤器 -// * @Param [] -// * @Return cn.dev33.satoken.filter.SaServletFilter -// */ -// @Bean -// public SaServletFilter getSaServletFilter() { -// -// return new SaServletFilter().addInclude("/**").addExclude("/favicon.ico", "/user/login").setAuth(obj -> { -// // 校验 Id-Token 身份凭证 -// if (!Constants.PROFILE_DEV.equals(profile)) { -//// StpUtil.checkLogin(); -// boolean isLogin = SpringUtil.getBean(UserContext.class).checkLogin(); -// if (!isLogin) { -// throw NotLoginException.newInstance(StpUtil.TYPE, NotLoginException.NOT_TOKEN); -// } -// } -// }).setError(e -> { -// SaHolder.getResponse().setHeader("Content-Type", "application/json; charset=utf-8"); -// return SaResult.error(CommonEOS.E25000007.getName()); -// }); -// } -// -// @Bean -// @Primary -// public SaTokenConfig getSaTokenConfigPrimary() { -// SaTokenConfig config = new SaTokenConfig(); -// config.setTokenName("satoken"); -// config.setActivityTimeout(6000 * 30); -// config.setIsConcurrent(true); -// config.setIsShare(true); -// config.setTokenStyle("uuid"); -// config.setIsLog(false); -// return config; -// } -// -// // 注册Sa-Token的注解拦截器,打开注解式鉴权功能 -// @Override -// public void addInterceptors(InterceptorRegistry registry) { -// // 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关) -// registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**").excludePathPatterns("/favicon.ico", "/user/login"); -// } -//} diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index 33c100e..d87716b 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -1,32 +1,58 @@ -package com.dite.znpt.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; - -@Configuration -public class WebMvcConfig extends WebMvcConfigurationSupport { - - @Value(value = "${upload.temp-path.image}") - private String uploadTempPath; - - @Value(value = "${upload.perm-path.image}") - private String uploadPermPath; - - /** - * MVC 加载Swagger静态资源 - * @param registry - */ - @Override - protected void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); - registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); - registry.addResourceHandler("/static/image/**").addResourceLocations("file:" + uploadPermPath); - registry.addResourceHandler("/static/image/temp/**").addResourceLocations("file:" + uploadTempPath); - registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\\Upload\\Image\\Temp\\"); - super.addResourceHandlers(registry); - } -} \ No newline at end of file +package com.dite.znpt.config; + +import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Bear.G + * @date 2025/5/23/周五 11:19 + * @description + */ + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Value(value = "${upload.temp-path.image}") + private String uploadTempPath; + + @Value(value = "${upload.perm-path.image}") + private String uploadPermPath; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + registry.addResourceHandler("/static/image/**").addResourceLocations("file:" + uploadPermPath); + registry.addResourceHandler("/static/image/temp/**").addResourceLocations("file:" + uploadTempPath); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册 Sa-Token 拦截器,定义详细认证规则 +// registry.addInterceptor(new SaInterceptor(handler -> { +// SaRouter +// .match("/**") // 拦截的 path 列表,可以写多个 */ +// .notMatch(excludePaths()) +// .check(r -> StpUtil.checkLogin()); +// })).addPathPatterns("/**"); + } + + // 动态获取哪些 path 可以忽略鉴权 + public List excludePaths() { + // 此处仅为示例,实际项目你可以写任意代码来查询这些path + return Arrays.asList("/login", "/favicon.ico", "/favicon.ico", "/doc.html", "/swagger-ui/**", "/swagger-resources","/webjars/**", "/v3/api-docs/**", "/**/v3/api-docs", "/static/image/**","/static/image/temp/**"); + } + +} diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index c724e6d..e5364f1 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -17,6 +17,26 @@ public class Constants { public static final String SERVICE_EXCEPTION_MESSAGE = "服务开小差,请稍后再试!"; + /** + * 账号密码错误 + */ + public static final String PASSWORD_ERROR_EXCEPTION = "500000"; + + public static final String PASSWORD_ERROR_EXCEPTION_MESSAGE = "用户名或者密码错误!"; + /** + * 账号停用 + */ + public static final String USER_DISABLE_EXCEPTION = "500001"; + + public static final String USER_DISABLE_EXCEPTION_MESSAGE = "用户已停用!"; + + /** + * 默认密码 + */ + public static final String DEFAULT_PASSWORD_EXCEPTION = "500002"; + + public static final String DEFAULT_PASSWORD_EXCEPTION_MESSAGE = "初始密码,请修改密码后登陆!"; + /** * 参数异常 */ diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index ca16bd4..e5f0d6b 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -41,6 +41,8 @@ public interface Converts { UserResp toUserResp(UserEntity entity); + UserListResp toUserListResp(UserEntity entity); + UserEntity toUserEntity(UserReq req); DeptEntity toDeptEntity(DeptReq req); diff --git a/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java b/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java new file mode 100644 index 0000000..c434484 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java @@ -0,0 +1,30 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/22/周四 17:36 + * @description + */ +@Data +@ApiModel("登录请求实体") +public class LoginReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1782729268877852765L; + + @NotBlank(message = "账号不能为空") + @ApiModelProperty("账号") + private String account; + + @NotBlank(message = "密码不能为空") + @ApiModelProperty("密码,密文传输,采用aes加密,秘钥为账号") + private String password; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java new file mode 100644 index 0000000..ce5bbfc --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/23/周五 14:54 + * @description + */ +@Data +@ApiModel("用户信息") +public class UserInfo { + + @ApiModelProperty("用户信息") + private UserListResp user; + + @ApiModelProperty("部门信息") + private DeptResp dept; + + @ApiModelProperty("岗位信息") + private List posts; + + @ApiModelProperty("角色信息") + private List roles; +} diff --git a/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java b/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java index 80d5dfa..4863260 100644 --- a/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java +++ b/core/src/main/java/com/dite/znpt/exception/RestResponseEntityExceptionHandler.java @@ -1,5 +1,6 @@ package com.dite.znpt.exception; +import cn.dev33.satoken.exception.SaTokenException; import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.Result; import org.slf4j.Logger; @@ -17,6 +18,10 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class RestResponseEntityExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class); + @ExceptionHandler(SaTokenException.class) + public final Result handlerSaTokenException(SaTokenException e) { + return Result.error("5".concat(String.valueOf(e.getCode())), e.getMessage()); + } @ExceptionHandler(Exception.class) public final Result handler(Exception e) { diff --git a/core/src/main/java/com/dite/znpt/service/LoginService.java b/core/src/main/java/com/dite/znpt/service/LoginService.java new file mode 100644 index 0000000..33f4e05 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/LoginService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.hutool.core.lang.tree.Tree; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.UserInfo; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/23/周五 14:31 + * @description + */ +public interface LoginService { + + Result doLogin(LoginReq req); + + List> getMenuInfo(String userId); + + UserInfo getUserInfo(String userId); +} diff --git a/core/src/main/java/com/dite/znpt/service/UserPostService.java b/core/src/main/java/com/dite/znpt/service/UserPostService.java index 4b67fd3..bc14fd1 100644 --- a/core/src/main/java/com/dite/znpt/service/UserPostService.java +++ b/core/src/main/java/com/dite/znpt/service/UserPostService.java @@ -1,7 +1,9 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.PostEntity; import com.dite.znpt.domain.entity.UserPostEntity; +import com.dite.znpt.domain.vo.PostResp; import java.util.List; @@ -11,6 +13,7 @@ import java.util.List; * @description */ public interface UserPostService extends IService { + List getPostsByUserId(String userId); void bindUserPost(String userId, List postIds); void bindPostUser(String postId, List userIds); } diff --git a/core/src/main/java/com/dite/znpt/service/UserRoleService.java b/core/src/main/java/com/dite/znpt/service/UserRoleService.java index 37dcd06..f4e508d 100644 --- a/core/src/main/java/com/dite/znpt/service/UserRoleService.java +++ b/core/src/main/java/com/dite/znpt/service/UserRoleService.java @@ -2,6 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.UserRoleEntity; +import com.dite.znpt.domain.vo.RoleResp; import com.dite.znpt.domain.vo.UserRoleReq; import java.util.List; @@ -13,6 +14,8 @@ import java.util.List; */ public interface UserRoleService extends IService { + List getRolesByUserId(String userId); + void bindUserRole(UserRoleReq req); void bindRoleUser(String roleId, List userIds); diff --git a/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..287b3c4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java @@ -0,0 +1,82 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.service.*; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/23/周五 14:31 + * @description + */ +@Service +public class LoginServiceImpl implements LoginService { + + @Resource + private UserService userService; + + @Resource + private UserRoleService userRoleService; + + @Resource + private UserPostService userPostService; + + @Resource + private DeptService deptService; + + @Override + public Result doLogin(LoginReq req) { + String key = SecureUtil.md5(req.getAccount()).substring(8,24); + String password = SecureUtil.aes(key.getBytes()).decryptStr(req.getPassword()); + UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); + String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(password).concat(user.getSalt())); + if(!pwdCiphertext.equals(user.getPassword())){ + return Result.error(Constants.PASSWORD_ERROR_EXCEPTION, Constants.PASSWORD_ERROR_EXCEPTION_MESSAGE); + } + if(!user.getStatus().equals(Constants.STATUS_0)){ + return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); + } + if(user.getIsDefaultPassword()){ + return Result.error(Constants.DEFAULT_PASSWORD_EXCEPTION, Constants.DEFAULT_PASSWORD_EXCEPTION_MESSAGE); + } + StpUtil.login(user.getUserId()); + saveUserSession(user); + return Result.ok(StpUtil.getTokenInfo()); + } + + @Override + public List> getMenuInfo(String userId) { + return null; + } + + @Override + public UserInfo getUserInfo(String userId) { + UserInfo userInfo = new UserInfo(); + UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, userId).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); + userInfo.setUser(Converts.INSTANCE.toUserListResp(user)); + DeptEntity dept = deptService.getOne(Wrappers.lambdaQuery(DeptEntity.class).eq(StrUtil.isNotBlank(user.getDeptId()), DeptEntity::getDeptId, user.getDeptId()).eq(DeptEntity::getDelFlag, Constants.DEL_FLAG_0)); + userInfo.setDept(Converts.INSTANCE.toDeptResp(dept)); + userInfo.setRoles(userRoleService.getRolesByUserId(userId)); + userInfo.setPosts(userPostService.getPostsByUserId(userId)); + return userInfo; + } + + private void saveUserSession(UserEntity user){ + StpUtil.getSession().set(user.getUserId(), user); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java index 8e6410e..313f11b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java @@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.PostEntity; import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.entity.UserPostEntity; +import com.dite.znpt.domain.vo.PostResp; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.UserPostMapper; import com.dite.znpt.service.PostService; @@ -33,6 +35,13 @@ public class UserPostServiceImpl extends ServiceImpl getPostsByUserId(String userId) { + List postIds = this.list(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getUserId, userId)).stream().map(UserPostEntity::getPostId).toList(); + List posts= postService.listByIds(postIds).stream().filter(post -> Constants.STATUS_0.equals(post.getStatus())).toList(); + return Converts.INSTANCE.toPostResp(posts); + } + @Override @Transactional(rollbackFor = Exception.class) public void bindUserPost(String userId, List postIds) { diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java index c08c3c0..f3fbd39 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java @@ -1,12 +1,15 @@ package com.dite.znpt.service.impl; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.RoleEntity; import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.entity.UserRoleEntity; +import com.dite.znpt.domain.vo.RoleResp; import com.dite.znpt.domain.vo.UserRoleReq; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.UserRoleMapper; @@ -34,6 +37,13 @@ public class UserRoleServiceImpl extends ServiceImpl getRolesByUserId(String userId) { + List roleIds = this.list(Wrappers.lambdaQuery(UserRoleEntity.class).eq(UserRoleEntity::getUserId, userId)).stream().map(UserRoleEntity::getRoleId).toList(); + List roles = roleService.listByIds(roleIds).stream().filter(role -> Constants.DEL_FLAG_0.equals(role.getDelFlag()) && Constants.STATUS_0.equals(role.getStatus())).toList(); + return Converts.INSTANCE.toRoleResp(roles); + } + @Transactional(rollbackFor = Exception.class) @Override public void bindUserRole(UserRoleReq req) { diff --git a/core/src/main/java/com/dite/znpt/util/PasswordUtil.java b/core/src/main/java/com/dite/znpt/util/PasswordUtil.java index 349ab84..2f02366 100644 --- a/core/src/main/java/com/dite/znpt/util/PasswordUtil.java +++ b/core/src/main/java/com/dite/znpt/util/PasswordUtil.java @@ -1,8 +1,5 @@ package com.dite.znpt.util; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collections; @@ -10,15 +7,6 @@ import java.util.List; import java.util.Random; public class PasswordUtil { - private static final PasswordEncoder encoder = new BCryptPasswordEncoder(); - - public static String encrypt(String rawPassword) { - return encoder.encode(rawPassword); - } - - public static boolean matches(String rawPassword, String encodedPassword) { - return encoder.matches(rawPassword, encodedPassword); - } // 字符集定义 private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; diff --git a/doc/aesDemo.html b/doc/aesDemo.html new file mode 100644 index 0000000..6f84f51 --- /dev/null +++ b/doc/aesDemo.html @@ -0,0 +1,459 @@ + + + + + + AES加密解密工具 + + + + + + + +
      + +
      +

      + AES加密解密工具 +

      +

      + 使用先进的AES加密算法保护您的数据安全,支持多种加密模式和密钥长度 +

      +
      + + +
      + +
      +

      + 加密 +

      +
      +
      + + +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      + + + + +
      +
      + + +
      +

      + 解密 +

      +
      +
      + + +
      + +
      + + +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      + + + + +
      +
      +
      + + +
      +

      + 结果 +

      +
      +
      + +
      + + +
      +
      +
      + +
      + + +
      +
      +
      +
      + + +
      + + 操作成功 +
      +
      + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/LoginController.java b/web/src/main/java/com/dite/znpt/web/controller/LoginController.java index b0c9d7e..6bb8ea8 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/LoginController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/LoginController.java @@ -1,9 +1,24 @@ package com.dite.znpt.web.controller; +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.service.LoginService; +import com.dite.znpt.service.UserService; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + /** * @author Bear.G * @date 2025/5/19/周一 14:32 @@ -12,4 +27,13 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "登录") @RestController public class LoginController { + + @Resource + private LoginService loginService; + + @ApiOperation(value = "登陆",httpMethod = "POST") + @PostMapping("/login") + public Result login(@Validated @RequestBody LoginReq req) { + return loginService.doLogin(req); + } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index ac76c38..713a10b 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -82,6 +82,23 @@ spring: # domain: # prefix: /minio/ +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## +sa-token: + # token 名称(同时也是 cookie 名称) + token-name: Authorization + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: false + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + sip-config: name: 信令服务 ip: 127.0.0.1 From 08d48aac2b31d1a8b9ff7bd74fafb6ffe810fc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Tue, 27 May 2025 14:17:12 +0800 Subject: [PATCH 047/143] =?UTF-8?q?1=E3=80=81=E7=99=BB=E9=99=86=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=8C=E6=88=90=202=E3=80=81=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=99=BB=E5=BD=95=E9=AA=8C=E8=AF=81=203?= =?UTF-8?q?=E3=80=81=E7=99=BB=E5=BD=95=E5=90=8E=EF=BC=8C=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=8F=9C=E5=8D=95=E6=8E=A5=E5=8F=A3=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/config/WebMvcConfig.java | 14 +-- .../com/dite/znpt/constant/Constants.java | 41 ++++-- .../{LoginService.java => AuthService.java} | 4 +- .../znpt/service/impl/AuthServiceImpl.java | 119 ++++++++++++++++++ .../znpt/service/impl/DeptServiceImpl.java | 4 + .../znpt/service/impl/LoginServiceImpl.java | 82 ------------ .../znpt/service/impl/MenuServiceImpl.java | 5 +- .../service/impl/UserPostServiceImpl.java | 3 + .../service/impl/UserRoleServiceImpl.java | 3 + .../znpt/web/controller/AuthController.java | 55 ++++++++ .../znpt/web/controller/LoginController.java | 39 ------ 11 files changed, 231 insertions(+), 138 deletions(-) rename core/src/main/java/com/dite/znpt/service/{LoginService.java => AuthService.java} (85%) create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AuthController.java delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/LoginController.java diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index d87716b..9cbae0f 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -41,18 +41,18 @@ public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册 Sa-Token 拦截器,定义详细认证规则 -// registry.addInterceptor(new SaInterceptor(handler -> { -// SaRouter -// .match("/**") // 拦截的 path 列表,可以写多个 */ -// .notMatch(excludePaths()) -// .check(r -> StpUtil.checkLogin()); -// })).addPathPatterns("/**"); + registry.addInterceptor(new SaInterceptor(handler -> { + SaRouter + .match("/**") // 拦截的 path 列表,可以写多个 */ + .notMatch(excludePaths()) + .check(r -> StpUtil.checkLogin()); + })).addPathPatterns("/**"); } // 动态获取哪些 path 可以忽略鉴权 public List excludePaths() { // 此处仅为示例,实际项目你可以写任意代码来查询这些path - return Arrays.asList("/login", "/favicon.ico", "/favicon.ico", "/doc.html", "/swagger-ui/**", "/swagger-resources","/webjars/**", "/v3/api-docs/**", "/**/v3/api-docs", "/static/image/**","/static/image/temp/**"); + return Arrays.asList("/auth/login", "/favicon.ico", "/favicon.ico", "/doc.html", "/swagger-ui/**", "/swagger-resources","/webjars/**", "/v3/api-docs/**", "/**/v3/api-docs", "/static/image/**","/static/image/temp/**"); } } diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index e5364f1..38b7a02 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -15,33 +15,48 @@ public class Constants { */ public static final String SERVICE_EXCEPTION = "000002"; + /** + * 参数异常 + */ + public static final String PARAMETER_EXCEPTION = "000003"; + public static final String SERVICE_EXCEPTION_MESSAGE = "服务开小差,请稍后再试!"; /** * 账号密码错误 */ - public static final String PASSWORD_ERROR_EXCEPTION = "500000"; + public static final String ACCOUNT_ERROR_EXCEPTION = "500000"; + + public static final String ACCOUNT_ERROR_EXCEPTION_MESSAGE = "用户名或者密码错误!"; + + /** + * 账号密码错误 + */ + public static final String PASSWORD_ERROR_EXCEPTION = "500001"; public static final String PASSWORD_ERROR_EXCEPTION_MESSAGE = "用户名或者密码错误!"; + + /** + * 账号密码错误 + */ + public static final String PASSWORD_EXCEPTION = "500002"; + + public static final String PASSWORD_EXCEPTION_MESSAGE = "用户名或者密码错误!"; + /** * 账号停用 */ - public static final String USER_DISABLE_EXCEPTION = "500001"; + public static final String USER_DISABLE_EXCEPTION = "500100"; public static final String USER_DISABLE_EXCEPTION_MESSAGE = "用户已停用!"; /** * 默认密码 */ - public static final String DEFAULT_PASSWORD_EXCEPTION = "500002"; + public static final String DEFAULT_PASSWORD_EXCEPTION = "500200"; public static final String DEFAULT_PASSWORD_EXCEPTION_MESSAGE = "初始密码,请修改密码后登陆!"; - /** - * 参数异常 - */ - public static final String PARAMETER_EXCEPTION = "000003"; - /** * 0:代表存在 */ @@ -62,4 +77,14 @@ public class Constants { */ public static final Integer STATUS_1 = 1; + /** + * 0:代表显示 + */ + public static final String VISIBLE_0 = "0"; + + /** + * 1:代表隐藏 + */ + public static final String VISIBLE_1 = "1"; + } diff --git a/core/src/main/java/com/dite/znpt/service/LoginService.java b/core/src/main/java/com/dite/znpt/service/AuthService.java similarity index 85% rename from core/src/main/java/com/dite/znpt/service/LoginService.java rename to core/src/main/java/com/dite/znpt/service/AuthService.java index 33f4e05..dd54c0d 100644 --- a/core/src/main/java/com/dite/znpt/service/LoginService.java +++ b/core/src/main/java/com/dite/znpt/service/AuthService.java @@ -13,10 +13,12 @@ import java.util.List; * @date 2025/5/23/周五 14:31 * @description */ -public interface LoginService { +public interface AuthService { Result doLogin(LoginReq req); + void doLogout(); + List> getMenuInfo(String userId); UserInfo getUserInfo(String userId); diff --git a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java new file mode 100644 index 0000000..4c76bd7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java @@ -0,0 +1,119 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.MenuEntity; +import com.dite.znpt.domain.entity.RoleMenuEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.RoleResp; +import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.service.*; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/23/周五 14:31 + * @description + */ +@AllArgsConstructor +@Service +public class AuthServiceImpl implements AuthService { + + private final UserService userService; + + private final UserRoleService userRoleService; + + private final UserPostService userPostService; + + private final MenuService menuService; + + private final RoleMenuService roleMenuService; + + private final DeptService deptService; + + @Override + public Result doLogin(LoginReq req) { + String key = SecureUtil.md5(req.getAccount()).substring(8,24); + UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); + if(null == user){ + return Result.error(Constants.ACCOUNT_ERROR_EXCEPTION, Constants.ACCOUNT_ERROR_EXCEPTION_MESSAGE); + } + try { + String password = SecureUtil.aes(key.getBytes()).decryptStr(req.getPassword()); + String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(password).concat(user.getSalt())); + if(!pwdCiphertext.equals(user.getPassword())){ + return Result.error(Constants.PASSWORD_ERROR_EXCEPTION, Constants.PASSWORD_ERROR_EXCEPTION_MESSAGE); + } + }catch (Exception e){ + return Result.error(Constants.PASSWORD_EXCEPTION, Constants.PASSWORD_EXCEPTION_MESSAGE); + } + if(!user.getStatus().equals(Constants.STATUS_0)){ + return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); + } + if(user.getIsDefaultPassword()){ + return Result.error(Constants.DEFAULT_PASSWORD_EXCEPTION, Constants.DEFAULT_PASSWORD_EXCEPTION_MESSAGE); + } + StpUtil.login(user.getUserId()); + saveSession(user.getUserId()); + return Result.ok(StpUtil.getTokenInfo()); + } + + @Override + public void doLogout() { + StpUtil.logout(); + } + + @Override + public List> getMenuInfo(String userId) { + return (List>) StpUtil.getSession().get("menuInfo"); + } + + @Override + public UserInfo getUserInfo(String userId) { + return (UserInfo)StpUtil.getSession().get("userInfo"); + } + + private void saveSession(String userId){ + StpUtil.getSession().set("userInfo", queryUserInfo(userId)); + StpUtil.getSession().set("menuInfo", queryMenuInfo(userId)); + } + + private UserInfo queryUserInfo(String userId){ + UserInfo userInfo = new UserInfo(); + UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getUserId, userId).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); + userInfo.setUser(Converts.INSTANCE.toUserListResp(user)); + if(StrUtil.isNotBlank(user.getDeptId())){ + DeptEntity dept = deptService.getOne(Wrappers.lambdaQuery(DeptEntity.class).eq(DeptEntity::getDeptId, user.getDeptId()).eq(DeptEntity::getDelFlag, Constants.DEL_FLAG_0)); + userInfo.setDept(Converts.INSTANCE.toDeptResp(dept)); + } + userInfo.setRoles(userRoleService.getRolesByUserId(userId)); + userInfo.setPosts(userPostService.getPostsByUserId(userId)); + return userInfo; + } + + private List> queryMenuInfo(String userId){ + List roleIds = userRoleService.getRolesByUserId(userId).stream().map(RoleResp::getRoleId).toList(); + if(CollUtil.isEmpty(roleIds)){ + return new ArrayList<>(); + } + List menuIds = roleMenuService.list(Wrappers.lambdaQuery(RoleMenuEntity.class).in(CollUtil.isNotEmpty(roleIds), RoleMenuEntity::getRoleId, roleIds)).stream().map(RoleMenuEntity::getMenuId).toList(); + List menuList = menuService.list( + Wrappers.lambdaQuery(MenuEntity.class).in(CollUtil.isNotEmpty(menuIds), MenuEntity::getMenuId,menuIds) + ).stream().filter(menu -> Constants.VISIBLE_0.equals(menu.getVisible())).toList(); + return MenuServiceImpl.buildMenuTree(menuList); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java index 583e11e..9bb5d1c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DeptServiceImpl.java @@ -36,6 +36,10 @@ public class DeptServiceImpl extends ServiceImpl impleme @Override public List> tree(String deptName) { List deptList = StrUtil.isBlank(deptName) ? this.baseMapper.downwardRecursionSelect(null) : this.baseMapper.upwardRecursionSelect(deptName); + return buildDeptTree(deptList); + } + + public static List> buildDeptTree(List deptList) { //配置 TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); treeNodeConfig.setIdKey("deptId"); diff --git a/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java deleted file mode 100644 index 287b3c4..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/LoginServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.dite.znpt.service.impl; - -import cn.dev33.satoken.stp.SaTokenInfo; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.lang.tree.Tree; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.dite.znpt.constant.Constants; -import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.DeptEntity; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.vo.LoginReq; -import com.dite.znpt.domain.vo.UserInfo; -import com.dite.znpt.service.*; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author Bear.G - * @date 2025/5/23/周五 14:31 - * @description - */ -@Service -public class LoginServiceImpl implements LoginService { - - @Resource - private UserService userService; - - @Resource - private UserRoleService userRoleService; - - @Resource - private UserPostService userPostService; - - @Resource - private DeptService deptService; - - @Override - public Result doLogin(LoginReq req) { - String key = SecureUtil.md5(req.getAccount()).substring(8,24); - String password = SecureUtil.aes(key.getBytes()).decryptStr(req.getPassword()); - UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); - String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(password).concat(user.getSalt())); - if(!pwdCiphertext.equals(user.getPassword())){ - return Result.error(Constants.PASSWORD_ERROR_EXCEPTION, Constants.PASSWORD_ERROR_EXCEPTION_MESSAGE); - } - if(!user.getStatus().equals(Constants.STATUS_0)){ - return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); - } - if(user.getIsDefaultPassword()){ - return Result.error(Constants.DEFAULT_PASSWORD_EXCEPTION, Constants.DEFAULT_PASSWORD_EXCEPTION_MESSAGE); - } - StpUtil.login(user.getUserId()); - saveUserSession(user); - return Result.ok(StpUtil.getTokenInfo()); - } - - @Override - public List> getMenuInfo(String userId) { - return null; - } - - @Override - public UserInfo getUserInfo(String userId) { - UserInfo userInfo = new UserInfo(); - UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, userId).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); - userInfo.setUser(Converts.INSTANCE.toUserListResp(user)); - DeptEntity dept = deptService.getOne(Wrappers.lambdaQuery(DeptEntity.class).eq(StrUtil.isNotBlank(user.getDeptId()), DeptEntity::getDeptId, user.getDeptId()).eq(DeptEntity::getDelFlag, Constants.DEL_FLAG_0)); - userInfo.setDept(Converts.INSTANCE.toDeptResp(dept)); - userInfo.setRoles(userRoleService.getRolesByUserId(userId)); - userInfo.setPosts(userPostService.getPostsByUserId(userId)); - return userInfo; - } - - private void saveUserSession(UserEntity user){ - StpUtil.getSession().set(user.getUserId(), user); - } -} diff --git a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java index b6c93a3..3034c91 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.DeptEntity; import com.dite.znpt.domain.entity.MenuEntity; import com.dite.znpt.domain.vo.MenuReq; import com.dite.znpt.domain.vo.MenuResp; @@ -30,6 +29,10 @@ public class MenuServiceImpl extends ServiceImpl impleme @Override public List> tree(String menuName) { List menuList = StrUtil.isBlank(menuName) ? this.baseMapper.downwardRecursionSelect(null) : this.baseMapper.upwardRecursionSelect(menuName); + return buildMenuTree(menuList); + } + + public static List> buildMenuTree(List menuList) { //配置 TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); treeNodeConfig.setIdKey("menuId"); diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java index 313f11b..cb3a371 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java @@ -38,6 +38,9 @@ public class UserPostServiceImpl extends ServiceImpl getPostsByUserId(String userId) { List postIds = this.list(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getUserId, userId)).stream().map(UserPostEntity::getPostId).toList(); + if (CollUtil.isEmpty(postIds)) { + return new ArrayList<>(); + } List posts= postService.listByIds(postIds).stream().filter(post -> Constants.STATUS_0.equals(post.getStatus())).toList(); return Converts.INSTANCE.toPostResp(posts); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java index f3fbd39..13688f5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java @@ -40,6 +40,9 @@ public class UserRoleServiceImpl extends ServiceImpl getRolesByUserId(String userId) { List roleIds = this.list(Wrappers.lambdaQuery(UserRoleEntity.class).eq(UserRoleEntity::getUserId, userId)).stream().map(UserRoleEntity::getRoleId).toList(); + if (CollUtil.isEmpty(roleIds)) { + return new ArrayList<>(); + } List roles = roleService.listByIds(roleIds).stream().filter(role -> Constants.DEL_FLAG_0.equals(role.getDelFlag()) && Constants.STATUS_0.equals(role.getStatus())).toList(); return Converts.INSTANCE.toRoleResp(roles); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/AuthController.java b/web/src/main/java/com/dite/znpt/web/controller/AuthController.java new file mode 100644 index 0000000..745b7a2 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AuthController.java @@ -0,0 +1,55 @@ +package com.dite.znpt.web.controller; + +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.lang.tree.Tree; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.service.AuthService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/19/周一 14:32 + * @description + */ +@Api(tags = "认证相关") +@RestController +@RequestMapping("/auth") +public class AuthController { + + @Resource + private AuthService authService; + + @ApiOperation(value = "登录",httpMethod = "POST", notes = "密码加密采用aes(加密模式ECB,填充方式PKCS#7)加密传输,加密密钥产生逻辑:对账号做md5()计算,然后取值8-24位。demo数据:账号:admin,加密后的密码:Csq+AVwlEzX3r5vfxL7d/g== 账号:tino,加密后的密码:owbegSu4cMJRD4CiWO+WyQ==") + @PostMapping("/login") + public Result login(@Validated @RequestBody LoginReq req) { + return authService.doLogin(req); + } + + @GetMapping("/userInfo") + @ApiOperation(value = "获取用户信息",httpMethod = "GET") + public Result userInfo() { + return Result.ok(authService.getUserInfo(StpUtil.getLoginId().toString())); + } + + @GetMapping("/menu") + @ApiOperation(value = "获取菜单",httpMethod = "GET") + public Result>> getMenuInfo() { + return Result.ok(authService.getMenuInfo(StpUtil.getLoginId().toString())); + } + + @ApiOperation(value = "登出",httpMethod = "POST") + @PostMapping("/logout") + public Result logout() { + authService.doLogout(); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/LoginController.java b/web/src/main/java/com/dite/znpt/web/controller/LoginController.java deleted file mode 100644 index 6bb8ea8..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/LoginController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dite.znpt.web.controller; - -import cn.dev33.satoken.stp.SaTokenInfo; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.crypto.SecureUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.dite.znpt.constant.Constants; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.vo.LoginReq; -import com.dite.znpt.service.LoginService; -import com.dite.znpt.service.UserService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * @author Bear.G - * @date 2025/5/19/周一 14:32 - * @description - */ -@Api(tags = "登录") -@RestController -public class LoginController { - - @Resource - private LoginService loginService; - - @ApiOperation(value = "登陆",httpMethod = "POST") - @PostMapping("/login") - public Result login(@Validated @RequestBody LoginReq req) { - return loginService.doLogin(req); - } -} From 716e7646893d4e81d72012c44eeaf608885bc461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Tue, 27 May 2025 14:34:29 +0800 Subject: [PATCH 048/143] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=94=BE=E5=BC=80?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E7=99=BB=E5=BD=95=E8=AE=A4=E8=AF=81=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E4=BE=BF=E5=89=8D=E7=AB=AF=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/config/WebMvcConfig.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index 9cbae0f..3271777 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -38,16 +38,16 @@ public class WebMvcConfig implements WebMvcConfigurer { registry.addResourceHandler("/static/image/temp/**").addResourceLocations("file:" + uploadTempPath); } - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 注册 Sa-Token 拦截器,定义详细认证规则 - registry.addInterceptor(new SaInterceptor(handler -> { - SaRouter - .match("/**") // 拦截的 path 列表,可以写多个 */ - .notMatch(excludePaths()) - .check(r -> StpUtil.checkLogin()); - })).addPathPatterns("/**"); - } +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// // 注册 Sa-Token 拦截器,定义详细认证规则 +// registry.addInterceptor(new SaInterceptor(handler -> { +// SaRouter +// .match("/**") // 拦截的 path 列表,可以写多个 */ +// .notMatch(excludePaths()) +// .check(r -> StpUtil.checkLogin()); +// })).addPathPatterns("/**"); +// } // 动态获取哪些 path 可以忽略鉴权 public List excludePaths() { From da92479da0fcb0384c4cf7c33306faa4c6768993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Wed, 4 Jun 2025 17:40:18 +0800 Subject: [PATCH 049/143] =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=B5=84=E8=B4=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 4 + .../java/com/dite/znpt/converts/Converts.java | 6 + .../domain/entity/CertificationEntity.java | 62 ++++++++++ .../znpt/domain/vo/CertificationListReq.java | 29 +++++ .../dite/znpt/domain/vo/CertificationReq.java | 55 +++++++++ .../znpt/domain/vo/CertificationResp.java | 54 ++++++++ .../dite/znpt/enums/CertificationEnum.java | 56 +++++++++ .../dite/znpt/mapper/CertificationMapper.java | 17 +++ .../znpt/service/CertificationService.java | 24 ++++ .../impl/CertificationServiceImpl.java | 116 ++++++++++++++++++ .../resources/mapper/CertificationMapper.xml | 21 ++++ .../controller/CertificationController.java | 68 ++++++++++ 12 files changed, 512 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/CertificationEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/CertificationService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java create mode 100644 core/src/main/resources/mapper/CertificationMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/CertificationController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index e0ab24e..5736018 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -34,4 +34,8 @@ public class Message implements Serializable { public static final String ROLE_ID_NOT_EXIST_OR_ILLEGAL = "角色id不存在或者不合法"; public static final String MENU_ID_NOT_EXIST = "菜单id不存在"; public static final String MENU_ID_NOT_EXIST_OR_ILLEGAL = "菜单id不存在或者不合法"; + public static final String USER_CERTIFICATION_EXIST = "用户{}已存在{}证书"; + public static final String CERTIFICATION_TYPE_ILLEGAL = "证书类型不合法"; + public static final String CERTIFICATION_CODE_EXIST = "证书编码已存在"; + public static final String CERTIFICATION_ID_NOT_EXIST = "证书id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index e5f0d6b..e9c4a73 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -65,5 +65,11 @@ public interface Converts { MenuResp toMenuResp(MenuEntity entity); + CertificationEntity toCertificationEntity(CertificationReq req); + + CertificationResp toCertificationResp(CertificationEntity entity); + + List toCertificationResp(List list); + } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java new file mode 100644 index 0000000..a8c7ce4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:15 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("certification") +@ApiModel(value="CertificationEntity对象", description="人员资质") +public class CertificationEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5650015300122333342L; + + @ApiModelProperty("证书id") + @TableId(value = "certification_id", type = IdType.ASSIGN_UUID) + private String certificationId; + + @ApiModelProperty("用户id") + @TableField("user_id") + private String userId; + + @ApiModelProperty("证书编号") + @TableField("certification_code") + private String certificationCode; + + @ApiModelProperty("证书名称") + @TableField("certification_name") + private String certificationName; + + @ApiModelProperty("证书类型") + @TableField("certification_type") + private String certificationType; + + @ApiModelProperty("证书有效期-起") + @TableField("validity_date_begin") + private LocalDate validityDateBegin; + + @ApiModelProperty("证书有效期-讫") + @TableField("validity_date_end") + private LocalDate validityDateEnd; + + @ApiModelProperty("证书图片") + @TableField("certification_image") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java new file mode 100644 index 0000000..ef27291 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质列表请求实体") +public class CertificationListReq implements Serializable { + @Serial + private static final long serialVersionUID = -2663690591627122279L; + + @ApiModelProperty("姓名") + private String userName; + + @ApiModelProperty("证书名称") + private String certificationName; + + @ApiModelProperty("证书类型") + private String certificationType; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java new file mode 100644 index 0000000..d525c3e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质请求实体") +public class CertificationReq implements Serializable { + @Serial + private static final long serialVersionUID = 1737569842748352413L; + + @NotBlank(message = "用户id不能为空") + @ApiModelProperty("用户id") + private String userId; + + @NotBlank(message = "证书名称不能为空") + @Size(max = 50, message = "证书名称长度不能超过50") + @ApiModelProperty("证书名称") + private String certificationName; + + @NotBlank(message = "证书编号不能为空") + @Size(max = 50, message = "证书编号长度不能超过50") + @ApiModelProperty("证书编号") + private String certificationCode; + + @NotBlank(message = "证书类型不能为空") + @ApiModelProperty("证书类型") + private String certificationType; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-起") + private LocalDate validityDateBegin; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-讫") + private LocalDate validityDateEnd; + + @NotBlank(message = "证书图片不能为空") + @ApiModelProperty("证书图片") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java new file mode 100644 index 0000000..835d3fa --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质响应实体") +public class CertificationResp implements Serializable { + @Serial + private static final long serialVersionUID = 4123163394817757998L; + + @ApiModelProperty("证书id") + private String certificationId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("证书编号") + private String certificationCode; + + @ApiModelProperty("证书名称") + private String certificationName; + + @ApiModelProperty("证书类型") + private String certificationType; + + @ApiModelProperty("证书类型描述") + private String certificationTypeLabel; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-起") + private LocalDate validityDateBegin; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-讫") + private LocalDate validityDateEnd; + + @ApiModelProperty("证书图片") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java b/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java new file mode 100644 index 0000000..f50cf73 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java @@ -0,0 +1,56 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:33 + * @description + */ +@Getter +public enum CertificationEnum { + + HEIGHT_OPERATION("height-operation", "高处作业"), + LOW_VOLTAGE_OPERATION("low-voltage-operation", "低压电工"), + HIGH_VOLTAGE_OPERATION("high-voltage-operation", "高压电工"), + MARITIME_TRAFFIC_SAFETY("maritime-traffic-safety", "海上交通安全"), + DRIVING_LICENSE("driving-license", "驾驶证"), + LIGHTNING_PROTECTION_DETECTION("lightning-protection-detection", "防雷检测"), + DRONE_DRIVING("drone-driving", "无人机驾驶"); + + private final String code; + private final String desc; + + CertificationEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static CertificationEnum getByCode(String code){ + for (CertificationEnum e : CertificationEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + CertificationEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(CertificationEnum.values().length); + for (CertificationEnum e : CertificationEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java b/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java new file mode 100644 index 0000000..9d48e29 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java @@ -0,0 +1,17 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.CertificationEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:21 + * @description + */ +public interface CertificationMapper extends BaseMapper { + List selectCertification(CertificationListReq req); +} diff --git a/core/src/main/java/com/dite/znpt/service/CertificationService.java b/core/src/main/java/com/dite/znpt/service/CertificationService.java new file mode 100644 index 0000000..7f62b67 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/CertificationService.java @@ -0,0 +1,24 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.CertificationEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:22 + * @description + */ +public interface CertificationService extends IService { + + List page(CertificationListReq req); + List list(CertificationListReq req); + CertificationResp detail(String certificationId); + void save(CertificationReq req); + void update(String certificationId, CertificationReq req); + void deleteById(String certificationId); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java new file mode 100644 index 0000000..0e99937 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java @@ -0,0 +1,116 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.CertificationEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; +import com.dite.znpt.enums.CertificationEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.CertificationMapper; +import com.dite.znpt.service.CertificationService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:23 + * @description + */ +@AllArgsConstructor +@Service +public class CertificationServiceImpl extends ServiceImpl implements CertificationService { + + private final UserService userService; + + @Override + public List page(CertificationListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(CertificationListReq req) { + List list = this.baseMapper.selectCertification(req); + list.stream().forEach(resp -> { + resp.setCertificationTypeLabel(CertificationEnum.getDescByCode(resp.getCertificationType())); + }); + return list; + } + + @Override + public CertificationResp detail(String certificationId) { + CertificationResp resp = Converts.INSTANCE.toCertificationResp(this.getById(certificationId)); + resp.setCertificationTypeLabel(CertificationEnum.getDescByCode(resp.getCertificationType())); + resp.setUserName(userService.getById(resp.getUserId()).getName()); + return resp; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(CertificationReq req) { + this.save(validation(null, req)); + } + + private CertificationEntity validation(String certificationId, CertificationReq req) { + UserEntity user = userService.getById(req.getUserId()); + if(null == user || !Constants.DEL_FLAG_0.equals(user.getDelFlag()) || !Constants.STATUS_0.equals(user.getStatus())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + if(null == CertificationEnum.getByCode(req.getCertificationType())){ + throw new ServiceException(Message.CERTIFICATION_TYPE_ILLEGAL); + } + List userIdTypeList = this.list(Wrappers.lambdaQuery(CertificationEntity.class).eq(CertificationEntity::getCertificationType, req.getCertificationType()).eq(CertificationEntity::getUserId, req.getUserId())); + List codeList = this.list(Wrappers.lambdaQuery(CertificationEntity.class).eq(CertificationEntity::getCertificationCode, req.getCertificationCode())); + if(StrUtil.isBlank(certificationId)){ + if(CollUtil.isNotEmpty(userIdTypeList)){ + throw new ServiceException(StrUtil.format(Message.USER_CERTIFICATION_EXIST, user.getName(), CertificationEnum.getDescByCode(req.getCertificationType()))); + } + if(CollUtil.isNotEmpty(codeList)){ + throw new ServiceException(Message.CERTIFICATION_CODE_EXIST); + } + }else{ + CertificationEntity entity = this.getById(certificationId); + if(null == entity){ + throw new ServiceException(Message.CERTIFICATION_ID_NOT_EXIST); + } + if((!entity.getUserId().equals(req.getUserId()) ||!entity.getCertificationType().equals(req.getCertificationType())) && CollUtil.isNotEmpty(userIdTypeList)){ + throw new ServiceException(StrUtil.format(Message.USER_CERTIFICATION_EXIST, user.getName(), CertificationEnum.getDescByCode(req.getCertificationType()))); + } + if(!entity.getCertificationCode().equals(req.getCertificationCode()) && CollUtil.isNotEmpty(codeList)){ + throw new ServiceException(Message.CERTIFICATION_CODE_EXIST); + } + } + return Converts.INSTANCE.toCertificationEntity(req); + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String certificationId, CertificationReq req) { + CertificationEntity entity = validation(certificationId, req); + entity.setCertificationId(certificationId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String certificationId) { + if(null == this.getById(certificationId)){ + throw new ServiceException(Message.CERTIFICATION_ID_NOT_EXIST); + } + this.removeById(certificationId); + } +} diff --git a/core/src/main/resources/mapper/CertificationMapper.xml b/core/src/main/resources/mapper/CertificationMapper.xml new file mode 100644 index 0000000..e4cc340 --- /dev/null +++ b/core/src/main/resources/mapper/CertificationMapper.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java new file mode 100644 index 0000000..a64b534 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; +import com.dite.znpt.service.CertificationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:24 + * @description + */ +@Api(tags = "人员资质") +@RestController +@RequestMapping("/certification") +@AllArgsConstructor +public class CertificationController { + + private final CertificationService certificationService; + + @GetMapping("/page") + @ApiOperation(value = "分页查询人员资质信息", httpMethod = "GET") + public PageResult page(CertificationListReq req){ + return PageResult.ok(certificationService.page(req)); + } + + @GetMapping("/list") + @ApiOperation(value = "查询人员资质信息列表", httpMethod = "GET") + public Result> list(CertificationListReq req){ + return Result.ok(certificationService.list(req)); + } + + @GetMapping("/detail/{certificationId}") + @ApiOperation(value = "查询人员资质详情", httpMethod = "GET") + public Result detail(@PathVariable String certificationId){ + return Result.ok(certificationService.detail(certificationId)); + } + + @PostMapping + @ApiOperation(value = "新增人员资质", httpMethod = "POST") + public Result add(@Validated @RequestBody CertificationReq req){ + certificationService.save(req); + return Result.ok(); + } + + @PutMapping("/{certificationId}") + @ApiOperation(value = "修改人员资质信息", httpMethod = "PUT") + public Result update(@PathVariable String certificationId, @Validated @RequestBody CertificationReq req){ + certificationService.update(certificationId, req); + return Result.ok(); + } + + @DeleteMapping("/{certificationId}") + @ApiOperation(value = "删除人员资质信息", httpMethod = "DELETE") + public Result remove(@PathVariable String certificationId){ + certificationService.deleteById(certificationId); + return Result.ok(); + } +} From 824a1e849210a5d1d2ea8eccfa006b906d4f5b5f Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Fri, 6 Jun 2025 09:38:05 +0800 Subject: [PATCH 050/143] =?UTF-8?q?feature:1.=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96APP=E4=B8=8A=E4=BC=A0=E7=9A=84=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/bo/PartFullInfoBo.java | 23 ++++ .../com/dite/znpt/domain/vo/AppImageResp.java | 29 +++++ .../com/dite/znpt/service/ImageService.java | 6 + .../com/dite/znpt/service/PartService.java | 7 ++ .../znpt/service/impl/ImageServiceImpl.java | 109 ++++++++++++++++-- .../znpt/service/impl/PartServiceImpl.java | 22 +++- .../znpt/web/controller/CommonController.java | 8 ++ .../znpt/web/controller/DeptController.java | 2 +- 8 files changed, 196 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java diff --git a/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java b/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java new file mode 100644 index 0000000..e9c3103 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java @@ -0,0 +1,23 @@ +package com.dite.znpt.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import com.dite.znpt.domain.entity.PartEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PartFullInfoBo extends PartEntity { + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组名称") + private String projectName; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java new file mode 100644 index 0000000..83303cf --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.ImageEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AppImageResp extends ImageEntity { + + @ApiModelProperty("部件名称") + private String partName; + + @ApiModelProperty("机组号") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组名称") + private String projectName; + + @ApiModelProperty("上传用户") + private String uploadUser; +} diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 15d902b..49e594b 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -28,4 +28,10 @@ public interface ImageService extends IService { List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; void delete(String imageId); + + /** + * 分页列出APP上传的图片,并关联查询机组信息 + * @return {@link List }<{@link AppImageResp }> + */ + List listAppUploadImages(); } diff --git a/core/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java index 1c7c4ed..1eba964 100644 --- a/core/src/main/java/com/dite/znpt/service/PartService.java +++ b/core/src/main/java/com/dite/znpt/service/PartService.java @@ -1,6 +1,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.PartListReq; import com.dite.znpt.domain.vo.PartListResp; @@ -82,5 +83,11 @@ public interface PartService extends IService { **/ void deleteByTurbineIds(List turbineIds); + /** + * 查询完整部件信息,包含机组、项目 + * @param partIds + * @return {@link List }<{@link PartFullInfoBo }> + */ + List listInfos(List partIds); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 886c7de..1052508 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -1,14 +1,18 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.PathUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; +import com.dite.znpt.domain.page.PageDomain; import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.enums.ImageTypeEnum; @@ -31,13 +35,16 @@ import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.net.URI; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -172,8 +179,7 @@ public class ImageServiceImpl extends ServiceImpl impl for (MultipartFile multipartFile : files) { String path = path_prefix + multipartFile.getOriginalFilename(); FileUtil.writeBytes(multipartFile.getBytes(),path); - String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, permPath)); - result.add(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + result.add(getImageDownPath(StrUtil.removePrefix(path, permPath))); } return result; } @@ -203,8 +209,7 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(FileUtil.FILE_SEPARATOR).concat("temp").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, tempPath)); - req.setImagePath(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + req.setImagePath(getTmpImageDownPath(StrUtil.removePrefix(path, tempPath))); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -258,4 +263,92 @@ public class ImageServiceImpl extends ServiceImpl impl } } + /** + * 功能描述:获取图像下载路径 + * + * @param relativePath + * @return {@link String } + * @author cuizhibin + * @date 2025/06/06 09:07 + **/ + public static String getImageDownPath(String relativePath) { + String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat(relativePath); + return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); + } + /** + * 功能描述:获取tmp图像下载路径 + * + * @param relativePath + * @return {@link String } + * @author cuizhibin + * @date 2025/06/06 09:07 + **/ + public static String getTmpImageDownPath(String relativePath) { + String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat("temp").concat(StrUtil.SLASH).concat(relativePath); + return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); + } + + @Override + public List listAppUploadImages() { + List filePaths = new ArrayList<>(); + PathUtil.walkFiles(Path.of(permPath), new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { + if (path.toFile().isFile()) { + String relativePath = StrUtil.removePrefix(path.toFile().getAbsolutePath(), permPath); + filePaths.add(getImageDownPath(relativePath)); + } + return FileVisitResult.CONTINUE; + } + }); + +// 查询图片关联记录 + List imageList = new ArrayList<>(); + CollUtil.split(filePaths, 1000).forEach(paths -> { + imageList.addAll(lambdaQuery().in(ImageEntity::getImagePath, paths).list()); + }); + Map imageMap = imageList.stream() + .collect(Collectors.toMap(ImageEntity::getImagePath, Function.identity(), (a, b) -> a)); + +// 查询部件信息 + Map partInfoMap = new HashMap<>(); + CollUtil.split(imageList, 1000).forEach(images -> { + List partIds = images.stream().map(ImageEntity::getPartId).collect(Collectors.toList()); + List partList = partService.listInfos(partIds); + partInfoMap.putAll(partList.stream().collect(Collectors.toMap(PartFullInfoBo::getPartId, Function.identity()))); + }); + +// 将信息写入返回实体 + List respList = new ArrayList<>(); + for (String filePath : filePaths) { + AppImageResp resp = new AppImageResp(); + resp.setImagePath(filePath); + + List split = StrUtil.split(filePath, StrUtil.SLASH, true, true); + + ImageEntity image = imageMap.get(filePath); + if (image != null) { + BeanUtil.copyProperties(image, resp); + PartFullInfoBo part = partInfoMap.get(image.getPartId()); + if (part != null) { + resp.setPartId(part.getPartId()); + resp.setPartName(part.getPartName()); + resp.setTurbineId(part.getTurbineId()); + resp.setTurbineName(part.getTurbineName()); + resp.setProjectId(part.getProjectId()); + resp.setProjectName(part.getProjectName()); + } + } else { + List gps = StrUtil.split(split.get(5), " "); + resp.setLongitude(gps.get(0)); + resp.setLatitude(gps.get(1)); + resp.setAltitude(gps.get(2)); + } + resp.setUploadUser(split.get(4)); + resp.setImageType(split.get(2)); + + respList.add(resp); + } + return respList; + } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index b32ac99..f4df3a7 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -1,10 +1,12 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.TurbineEntity; @@ -15,6 +17,7 @@ import com.dite.znpt.domain.vo.PartResp; import com.dite.znpt.enums.PartTypeEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.PartMapper; +import com.dite.znpt.mapper.TurbineMapper; import com.dite.znpt.service.PartService; import com.dite.znpt.service.ProjectService; import com.dite.znpt.service.TurbineService; @@ -25,6 +28,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author huise23 @@ -160,5 +166,19 @@ public class PartServiceImpl extends ServiceImpl impleme this.baseMapper.delete(Wrappers.lambdaQuery().in(PartEntity::getTurbineId, turbineIds)); } - + @Override + public List listInfos(List partIds) { + List list = lambdaQuery().in(PartEntity::getPartId, partIds).list(); + List turbineList = turbineService.lambdaQuery().in(TurbineEntity::getTurbineId, list.stream().map(PartEntity::getTurbineId).collect(Collectors.toList())).list(); + Map turbineMap = turbineList.stream().collect(Collectors.toMap(TurbineEntity::getTurbineId, Function.identity())); + Map projectMap = projectService.lambdaQuery().in(ProjectEntity::getProjectId, turbineList.stream().map(TurbineEntity::getProjectId).collect(Collectors.toList())).list() + .stream().collect(Collectors.toMap(ProjectEntity::getProjectId, Function.identity())); + return BeanUtil.copyToList(list, PartFullInfoBo.class).stream().peek(partBo -> { + TurbineEntity turbineEntity = turbineMap.get(partBo.getTurbineId()); + ProjectEntity projectEntity = projectMap.get(turbineEntity.getProjectId()); + partBo.setTurbineName(turbineEntity.getTurbineName()); + partBo.setProjectId(projectEntity.getProjectId()); + partBo.setProjectName(projectEntity.getProjectName()); + }).collect(Collectors.toList()); + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 0405b14..b206679 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -2,6 +2,7 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.AppImageResp; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; @@ -14,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; +import java.util.List; /** * @Author: gaoxiong @@ -141,6 +143,12 @@ public class CommonController { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } + @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST") + @GetMapping("/list/app-upload-images") + public Result> listAppUploadImages() throws IOException { + return Result.ok(imageService.listAppUploadImages()); + } + @ApiOperation(value = "查询菜单类型", httpMethod = "GET") @GetMapping("/list/menu-type") public Result listMenuType(){ diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java index 1e63893..64bad82 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java @@ -39,7 +39,7 @@ public class DeptController { return Result.ok(deptService.detail(deptId)); } - @ApiOperation(value = "新增部门信息", httpMethod = "Post") + @ApiOperation(value = "新增部门信息", httpMethod = "POST") @PostMapping public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { deptService.save(req); From 939aeaaabfa9dc692d6bbe98116b9057c70d2829 Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Fri, 6 Jun 2025 10:29:35 +0800 Subject: [PATCH 051/143] =?UTF-8?q?feature:1.=E6=96=B0=E5=A2=9E=E5=85=B3?= =?UTF-8?q?=E8=81=94APP=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87=E5=88=B0?= =?UTF-8?q?=E6=9C=BA=E7=BB=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/vo/AppImageResp.java | 3 + .../znpt/domain/vo/AppImageToPartReq.java | 53 ++++++++++++++++ .../dite/znpt/domain/vo/ImageCollectReq.java | 2 +- .../com/dite/znpt/service/ImageService.java | 8 +++ .../znpt/service/impl/ImageServiceImpl.java | 61 ++++++++++++++++++- .../java/com/dite/znpt/util/EXIFUtil.java | 1 - .../znpt/web/controller/CommonController.java | 6 -- .../znpt/web/controller/ImageController.java | 14 +++++ 8 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AppImageToPartReq.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java index 83303cf..ad8c028 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java @@ -26,4 +26,7 @@ public class AppImageResp extends ImageEntity { @ApiModelProperty("上传用户") private String uploadUser; + + @ApiModelProperty(name = "图像来源,枚举:ImageSourceEnum") + private String imageSource; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AppImageToPartReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AppImageToPartReq.java new file mode 100644 index 0000000..13d4502 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AppImageToPartReq.java @@ -0,0 +1,53 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class AppImageToPartReq { + + @ApiModelProperty(value = "图片路径列表", required = true) + private List imagePaths; + + @ApiModelProperty(value = "部件id", required = true) + private String partId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("拍摄时间-起") + private LocalDateTime shootingTimeBegin; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("拍摄时间-止") + private LocalDateTime shootingTimeEnd; + + @ApiModelProperty("天气,枚举:WeatherEnum") + private String weather; + + @ApiModelProperty("湿度(百分比)") + private Integer humidness; + + @ApiModelProperty("温度-低") + private Double temperatureMin; + + @ApiModelProperty("温度-高") + private Double temperatureMax; + + @ApiModelProperty("风力等级") + private Integer windLevel; + + @ApiModelProperty("拍摄方式,枚举ShootingMethodEnum") + private String shootingMethod; + + @ApiModelProperty("拍摄距离") + private Integer shootingDistance; + + @ApiModelProperty("采集员id") + private String collectorId; + + @ApiModelProperty("采集员姓名") + private String collectorName; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java index 0c6eba2..e225d93 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -28,7 +28,7 @@ public class ImageCollectReq implements Serializable { private LocalDateTime shootingTimeBegin; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("拍摄时间-讫") + @ApiModelProperty("拍摄时间-止") private LocalDateTime shootingTimeEnd; @ApiModelProperty("天气,枚举:WeatherEnum") diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 49e594b..1b6dfaa 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -34,4 +34,12 @@ public interface ImageService extends IService { * @return {@link List }<{@link AppImageResp }> */ List listAppUploadImages(); + + /** + * 功能描述:链接APP上传的图像到部件 + * + * @author cuizhibin + * @date 2025/06/06 09:44 + **/ + void linkAppImagesToPart(AppImageToPartReq partReq); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 1052508..7516700 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -4,12 +4,14 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.PathUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.bo.PartFullInfoBo; +import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.page.PageDomain; @@ -25,6 +27,7 @@ import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,6 +58,7 @@ import java.util.stream.Collectors; * @date 2025/4/24/周四 13:23 * @description */ +@Slf4j @Service public class ImageServiceImpl extends ServiceImpl implements ImageService { @@ -345,10 +349,65 @@ public class ImageServiceImpl extends ServiceImpl impl resp.setAltitude(gps.get(2)); } resp.setUploadUser(split.get(4)); - resp.setImageType(split.get(2)); + resp.setImageSource(split.get(2)); respList.add(resp); } return respList; } + + /** + * 功能描述:链接APP上传的图像到部件 + * + * @author cuizhibin + * @date 2025/06/06 09:44 + **/ + @Transactional(rollbackFor = Exception.class) + public void linkAppImagesToPart(AppImageToPartReq partReq) { + PartEntity part = partService.getById(partReq.getPartId()); + if (Objects.isNull(part)) { + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } +// 查询图片关联记录 + List imageList = new ArrayList<>(); + CollUtil.split(partReq.getImagePaths(), 1000).forEach(paths -> { + imageList.addAll(lambdaQuery().in(ImageEntity::getImagePath, paths).list()); + }); + partReq.getImagePaths().removeAll(imageList.stream().map(ImageEntity::getImagePath).toList()); + + String collectId = IdUtil.simpleUUID(); + imageList.forEach(imageEntity -> { + imageEntity.setPartId(partReq.getPartId()); + imageEntity.setCollectId(collectId); + }); + baseMapper.updateById(imageList); +// 新增 + List newImageList = new ArrayList<>(); + partReq.getImagePaths().forEach(path -> { + ImageEntity imageEntity = new ImageEntity(); + String absolutePath = permPath + StrUtil.removePrefix(path, "/static/image/"); + try { + ImageReq imageReq = imageRespBuilder(absolutePath); + BeanUtil.copyProperties(imageReq, imageEntity); + } catch (Exception e) { + log.debug("读取文件信息失败:{}", path); + imageEntity.setImageName(FileUtil.getName(absolutePath)); + BigDecimal imageSize = new BigDecimal(FileUtil.size(FileUtil.file(absolutePath))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); + imageEntity.setImageSize(imageSize.toString().concat("M")); + } + if (StrUtil.isEmpty(imageEntity.getLongitude()) || imageEntity.getLongitude().equals("0.0")) { + List split = StrUtil.split(path, StrUtil.SLASH, true, true); + List gps = StrUtil.split(split.get(5), " "); + imageEntity.setLongitude(gps.get(0)); + imageEntity.setLatitude(gps.get(1)); + imageEntity.setAltitude(gps.get(2)); + } + imageEntity.setImagePath(path); + imageEntity.setPartId(partReq.getPartId()); + imageEntity.setCollectId(collectId); + newImageList.add(imageEntity); + }); + imageCollectService.save(BeanUtil.copyProperties(partReq, ImageCollectEntity.class)); + baseMapper.insert(newImageList); + } } diff --git a/core/src/main/java/com/dite/znpt/util/EXIFUtil.java b/core/src/main/java/com/dite/znpt/util/EXIFUtil.java index 136a5a7..5dff2c2 100644 --- a/core/src/main/java/com/dite/znpt/util/EXIFUtil.java +++ b/core/src/main/java/com/dite/znpt/util/EXIFUtil.java @@ -51,7 +51,6 @@ public class EXIFUtil { } } } - System.out.println("**********" + jsonObject.toString()); return jsonObject; } diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index b206679..04d75dd 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -143,12 +143,6 @@ public class CommonController { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } - @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST") - @GetMapping("/list/app-upload-images") - public Result> listAppUploadImages() throws IOException { - return Result.ok(imageService.listAppUploadImages()); - } - @ApiOperation(value = "查询菜单类型", httpMethod = "GET") @GetMapping("/list/menu-type") public Result listMenuType(){ diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index e6eda67..8c53542 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -76,4 +77,17 @@ public class ImageController { imageService.delete(imageId); return Result.ok(); } + + @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST") + @GetMapping("/list/app-upload-images") + public Result> listAppUploadImages() throws IOException { + return Result.ok(imageService.listAppUploadImages()); + } + + @ApiOperation(value = "关联APP上传图片到机组", httpMethod = "POST") + @PostMapping("/linkAppImagesToPart") + public Result linkAppImagesToPart(@RequestBody AppImageToPartReq partReq) { + imageService.linkAppImagesToPart(partReq); + return Result.ok(); + } } From 9b01a787899de32020f81ac6e8b3b2520ebd014c Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 6 Jun 2025 13:49:05 +0800 Subject: [PATCH 052/143] =?UTF-8?q?method=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/web/controller/ImageController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 8c53542..07a21f6 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -78,7 +78,7 @@ public class ImageController { return Result.ok(); } - @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST") + @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "GET") @GetMapping("/list/app-upload-images") public Result> listAppUploadImages() throws IOException { return Result.ok(imageService.listAppUploadImages()); From af4c318a10d3b59f8f0398b33e66866411ef368b Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 6 Jun 2025 14:01:52 +0800 Subject: [PATCH 053/143] =?UTF-8?q?APP=E4=B8=8A=E4=BC=A0=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=8B=A5=E6=8C=87=E5=AE=9A=E5=8F=82=E6=95=B0=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=EF=BC=8C=E5=88=99=E7=BB=99=E4=BA=88=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/service/impl/ImageServiceImpl.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 7516700..0918f8c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -166,15 +166,11 @@ public class ImageServiceImpl extends ServiceImpl impl String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String path_prefix = permPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); if (Objects.nonNull(imageWorkReq)) { - if (StrUtil.isNotBlank(imageWorkReq.getUploadUser())) { - path_prefix = path_prefix.concat(imageWorkReq.getUploadUser()).concat(FileUtil.FILE_SEPARATOR); - } - if (StrUtil.isNotBlank(imageWorkReq.getLongitude())) { - path_prefix = path_prefix.concat(imageWorkReq.getLongitude()) - .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getLatitude(), "0")) - .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getAltitude(), "0")) - .concat(FileUtil.FILE_SEPARATOR); - } + path_prefix = path_prefix.concat(StrUtil.nullToDefault(imageWorkReq.getUploadUser(), "默认用户")).concat(FileUtil.FILE_SEPARATOR) + .concat(StrUtil.nullToDefault(imageWorkReq.getLongitude(), "0")) + .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getLatitude(), "0")) + .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getAltitude(), "0")) + .concat(FileUtil.FILE_SEPARATOR); } if (!FileUtil.exist(path_prefix)) { FileUtil.mkdir(path_prefix); @@ -344,9 +340,11 @@ public class ImageServiceImpl extends ServiceImpl impl } } else { List gps = StrUtil.split(split.get(5), " "); - resp.setLongitude(gps.get(0)); - resp.setLatitude(gps.get(1)); - resp.setAltitude(gps.get(2)); + if (gps.size() > 1) { + resp.setLongitude(gps.get(0)); + resp.setLatitude(gps.get(1)); + resp.setAltitude(gps.get(2)); + } } resp.setUploadUser(split.get(4)); resp.setImageSource(split.get(2)); From b36cb3d38b93c7b302b1bd1f84a692b5dc70e808 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 9 Jun 2025 10:45:52 +0800 Subject: [PATCH 054/143] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .../com/dite/znpt/config/WebMvcConfig.java | 15 +- .../com/dite/znpt/constant/Constants.java | 6 + .../com/dite/znpt/domain/AuditableEntity.java | 3 + .../domain/entity/VideoFileInfoEntity.java | 75 ++++++++++ .../znpt/domain/vo/VideoFileInfoListReq.java | 49 ++++++ .../dite/znpt/domain/vo/VideoFileInfoReq.java | 41 ++++++ .../znpt/domain/vo/VideoFileInfoResp.java | 19 +++ .../com/dite/znpt/enums/MenuTypeEnum.java | 6 +- .../dite/znpt/mapper/VideoFileInfoMapper.java | 19 +++ .../znpt/service/VideoFileInfoService.java | 68 +++++++++ .../service/impl/CombinedDictServiceImpl.java | 2 +- .../service/impl/FileInfoServiceImpl.java | 2 +- .../znpt/service/impl/ImageServiceImpl.java | 15 +- .../impl/TConstructionServiceImpl.java | 2 +- .../impl/VideoFileInfoServiceImpl.java | 139 ++++++++++++++++++ .../service/impl/WeatherTypeServiceImpl.java | 2 +- .../resources/mapper/VideoFileInfoMapper.xml | 44 ++++++ .../controller/VideoFileInfoController.java | 63 ++++++++ web/src/main/resources/application-dev.yml | 1 + 20 files changed, 555 insertions(+), 19 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/VideoFileInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/VideoFileInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java create mode 100644 core/src/main/resources/mapper/VideoFileInfoMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/VideoFileInfoController.java diff --git a/.gitignore b/.gitignore index 1be540f..5c11c82 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,5 @@ build/ ### VS Code ### .vscode/ -target/ \ No newline at end of file +target/ +logs/ \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index 3271777..609a88f 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -1,18 +1,13 @@ package com.dite.znpt.config; -import cn.dev33.satoken.interceptor.SaInterceptor; -import cn.dev33.satoken.router.SaRouter; -import cn.dev33.satoken.stp.StpUtil; +import com.dite.znpt.constant.Constants; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** * @author Bear.G @@ -29,13 +24,17 @@ public class WebMvcConfig implements WebMvcConfigurer { @Value(value = "${upload.perm-path.image}") private String uploadPermPath; + @Value(value = "${upload.perm-path.video}") + private String uploadPermVideoPath; + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); - registry.addResourceHandler("/static/image/**").addResourceLocations("file:" + uploadPermPath); - registry.addResourceHandler("/static/image/temp/**").addResourceLocations("file:" + uploadTempPath); + registry.addResourceHandler(Constants.PERM_IMAGE_PATH + "**").addResourceLocations("file:" + uploadPermPath); + registry.addResourceHandler(Constants.PERM_VIDEO_PATH + "**").addResourceLocations("file:" + uploadPermVideoPath); + registry.addResourceHandler(Constants.TEMP_IMAGE_PATH + "**").addResourceLocations("file:" + uploadTempPath); } // @Override diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index 38b7a02..6e6d2b9 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -87,4 +87,10 @@ public class Constants { */ public static final String VISIBLE_1 = "1"; + // 持久化图片路径请求前缀 + public static final String TEMP_IMAGE_PATH = "/static/image/temp/"; + // 临时图片路径请求前缀 + public static final String PERM_IMAGE_PATH = "/static/image/"; + // 持久化视频文件路径请求前缀 + public static final String PERM_VIDEO_PATH = "/static/video/"; } diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index befb37a..7994845 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -2,6 +2,7 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; @@ -29,9 +30,11 @@ public class AuditableEntity implements Serializable { @ApiParam(hidden = true) private String updateBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "创建时间", example = "2022-01-22", notes = "创建时间", hidden = true) private LocalDateTime createTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(hidden = true) private LocalDateTime updateTime; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java new file mode 100644 index 0000000..8cdb713 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java @@ -0,0 +1,75 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serial; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/06/09 09:44 + * @Description: 视频文件信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("video_file_info") +@ApiModel(value="VideoFileInfoEntity对象", description="视频文件信息表") +public class VideoFileInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 306867911204598834L; + + @ExcelProperty("id") + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ExcelProperty("机组id") + @ApiModelProperty(value = "机组id",required = true) + @TableField("part_id") + private String partId; + + @ExcelProperty("测试点") + @ApiModelProperty("测试点") + @TableField("test_point") + private String testPoint; + + @ExcelProperty("作业人员id") + @ApiModelProperty("作业人员id") + @TableField("worker_user_id") + private String workerUserId; + + @ExcelProperty("拍摄时间") + @ApiModelProperty("拍摄时间") + @TableField("shooting_time") + private LocalDateTime shootingTime; + + @ExcelProperty("拍摄地点") + @ApiModelProperty("拍摄地点") + @TableField("location") + private String location; + + @ExcelProperty("是否合格,默认合格1") + @ApiModelProperty("是否合格,默认合格1") + @TableField("qualified") + private Integer qualified; + + @ExcelProperty("是否已抓帧,默认未抓帧0") + @ApiModelProperty("是否已抓帧,默认未抓帧0") + @TableField("frame_capture") + private Integer frameCapture; + + @ExcelProperty("文件保存路径") + @ApiModelProperty("文件保存路径") + @TableField("file_path") + private String filePath; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoListReq.java new file mode 100644 index 0000000..fd95fae --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoListReq.java @@ -0,0 +1,49 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/06/09 09:44 + * @Description: 视频文件信息请求实体 + */ +@Data +@ApiModel("视频文件信息列表请求实体") +public class VideoFileInfoListReq implements Serializable { + + private static final long serialVersionUID = 499752243735301115L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("视频文件信息Id") + private String id; + + @ApiModelProperty("机组id") + private String partId; + + @ApiModelProperty("测试点") + private String testPoint; + + @ApiModelProperty("作业人员id") + private String workerUserId; + + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("拍摄地点") + private String location; + + @ApiModelProperty("是否合格,默认合格1") + private Integer qualified; + + @ApiModelProperty("是否已抓帧,默认未抓帧0") + private Integer frameCapture; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java new file mode 100644 index 0000000..2dd861a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质请求实体") +public class VideoFileInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 1737569842748352413L; + + @NotBlank(message = "机组id不能为空") + @ApiModelProperty(value = "机组id",required = true) + private String partId; + + @ApiModelProperty("测试点") + private String testPoint; + + @ApiModelProperty("作业人员id") + private String workerUserId; + + @ApiModelProperty("拍摄时间") + private LocalDateTime shootingTime; + + @ApiModelProperty("拍摄地点") + private String location; + + @ApiModelProperty("是否合格,默认合格1") + private Integer qualified; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoResp.java new file mode 100644 index 0000000..36e1099 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.VideoFileInfoEntity; + +/** + * @author huise23 + * @date 2025/06/09 09:45 + * @Description: 视频文件信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("视频文件信息响应实体") +public class VideoFileInfoResp extends VideoFileInfoEntity { +} + diff --git a/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java index 3cd0543..fb12a87 100644 --- a/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/MenuTypeEnum.java @@ -14,9 +14,9 @@ import java.util.List; @Getter public enum MenuTypeEnum { - DEFECT("catalog", "目录"), - TYPICAL("route", "菜单"), - OTHER("button", "按钮"); + CATALOG("catalog", "目录"), + ROUTE("route", "菜单"), + BUTTON("button", "按钮"); private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/mapper/VideoFileInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/VideoFileInfoMapper.java new file mode 100644 index 0000000..817c439 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/VideoFileInfoMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.VideoFileInfoEntity; +import com.dite.znpt.domain.vo.VideoFileInfoListReq; +import com.dite.znpt.domain.vo.VideoFileInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/09 09:45 + * @Description: 视频文件信息表数据库访问层 + */ +public interface VideoFileInfoMapper extends BaseMapper { + List queryBySelective(VideoFileInfoListReq videoFileInfoReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/VideoFileInfoService.java b/core/src/main/java/com/dite/znpt/service/VideoFileInfoService.java new file mode 100644 index 0000000..7a968a7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/VideoFileInfoService.java @@ -0,0 +1,68 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.VideoFileInfoEntity; +import com.dite.znpt.domain.vo.VideoFileInfoListReq; +import com.dite.znpt.domain.vo.VideoFileInfoReq; +import com.dite.znpt.domain.vo.VideoFileInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/09 09:45 + * @Description: 视频文件信息表服务接口 + */ +public interface VideoFileInfoService extends IService { + + /** + * 功能描述:查询视频文件信息列表 + * + * @param videoFileInfoReq 视频文件信息 + * @return {@link List }<{@link VideoFileInfoEntity }> + * @author huise23 + * @date 2025/06/09 09:45 + **/ + List selectList(VideoFileInfoListReq videoFileInfoReq); + + /** + * 功能描述:查询单条视频文件信息 + * + * @param id 视频文件信息Id + * @return {@link VideoFileInfoResp } + * @author huise23 + * @date 2025/06/09 09:45 + **/ + VideoFileInfoResp selectById(String id); + + /** + * 功能描述:更新视频文件信息 + * + * @param videoFileInfo 视频文件信息 + * @author huise23 + * @date 2025/06/09 09:45 + **/ + void updateData(VideoFileInfoEntity videoFileInfo); + + /** + * 功能描述:删除视频文件信息 + * + * @param id 视频文件信息Id + * @author huise23 + * @date 2025/06/09 09:45 + **/ + void deleteById(String id); + + /** + * 功能描述:批量上传 + * + * @param infoReq 视频文件信息实体 + * @param files 文件 + * @return + * @author cuizhibin + * @date 2025/06/09 10:14 + */ + List batchUpload(VideoFileInfoReq infoReq, MultipartFile[] files); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java index a22e5ae..e1cbe7d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java @@ -54,7 +54,7 @@ public class CombinedDictServiceImpl extends ServiceImpl list = selectList(combinedDictReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new CombinedDictResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new CombinedDictResp(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java index 383dae9..975b43f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java @@ -54,7 +54,7 @@ public class FileInfoServiceImpl extends ServiceImpl list = selectList(fileInfoReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new FileInfoResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new FileInfoResp(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 0918f8c..02704ed 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -2,6 +2,7 @@ package com.dite.znpt.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.PathUtil; import cn.hutool.core.util.IdUtil; @@ -9,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.ImageCollectEntity; @@ -272,9 +274,10 @@ public class ImageServiceImpl extends ServiceImpl impl * @date 2025/06/06 09:07 **/ public static String getImageDownPath(String relativePath) { - String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat(relativePath); + String url = Constants.PERM_IMAGE_PATH.concat(relativePath); return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); } + /** * 功能描述:获取tmp图像下载路径 * @@ -284,7 +287,7 @@ public class ImageServiceImpl extends ServiceImpl impl * @date 2025/06/06 09:07 **/ public static String getTmpImageDownPath(String relativePath) { - String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat("temp").concat(StrUtil.SLASH).concat(relativePath); + String url = Constants.TEMP_IMAGE_PATH.concat(StrUtil.SLASH).concat(relativePath); return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); } @@ -296,7 +299,13 @@ public class ImageServiceImpl extends ServiceImpl impl public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { if (path.toFile().isFile()) { String relativePath = StrUtil.removePrefix(path.toFile().getAbsolutePath(), permPath); - filePaths.add(getImageDownPath(relativePath)); + String imageDownPath = getImageDownPath(relativePath); + List split = StrUtil.split(imageDownPath, StrUtil.SLASH, true, true); +// /static/image/source/date + try { + DateUtil.parseDate(split.get(4)); + filePaths.add(imageDownPath); + } catch (Exception ignore) {} } return FileVisitResult.CONTINUE; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java index b43687a..8e8ddfb 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java @@ -54,7 +54,7 @@ public class TConstructionServiceImpl extends ServiceImpl list = selectList(tConstructionReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new TConstructionResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new TConstructionResp(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java new file mode 100644 index 0000000..dafbca4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java @@ -0,0 +1,139 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.VideoFileInfoEntity; +import com.dite.znpt.domain.vo.VideoFileInfoListReq; +import com.dite.znpt.domain.vo.VideoFileInfoReq; +import com.dite.znpt.domain.vo.VideoFileInfoResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.service.PartService; +import com.dite.znpt.service.VideoFileInfoService; +import com.dite.znpt.mapper.VideoFileInfoMapper; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author huise23 + * @date 2025/06/09 09:45 + * @Description: 视频文件信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class VideoFileInfoServiceImpl extends ServiceImpl implements VideoFileInfoService { + + private final PartService partService; + @Value(value = "${upload.perm-path.video}") + private String uploadPermVideoPath; + + /** + * 功能描述:查询视频文件信息列表 + * + * @param videoFileInfoReq 视频文件信息信息 + * @return {@link List }<{@link VideoFileInfoResp }> + * @author huise23 + * @date 2025/06/09 09:45 + **/ + @Override + public List selectList(VideoFileInfoListReq videoFileInfoReq) { + PageUtil.startPage(); + List videoFileInfoList = this.baseMapper.queryBySelective(videoFileInfoReq); + videoFileInfoList.forEach(resp -> { + + }); + return videoFileInfoList; + } + + /** + * 功能描述:查询单条视频文件信息 + * + * @param id 视频文件信息Id + * @return {@link VideoFileInfoResp } + * @author huise23 + * @date 2025/06/09 09:45 + **/ + @Override + public VideoFileInfoResp selectById(String id) { + VideoFileInfoListReq videoFileInfoReq = new VideoFileInfoListReq(); + videoFileInfoReq.setId(id); + + List list = selectList(videoFileInfoReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new VideoFileInfoResp(); + } + + /** + * 功能描述:更新视频文件信息 + * + * @param videoFileInfo 视频文件信息 + * @author huise23 + * @date 2025/06/09 09:45 + **/ + @Override + public void updateData(VideoFileInfoEntity videoFileInfo) { + updateById(videoFileInfo); + } + + /** + * 功能描述:删除视频文件信息 + * + * @param id 视频文件信息Id + * @author huise23 + * @date 2025/06/09 09:45 + **/ + @Override + public void deleteById(String id) { + removeById(id); + } + + /** + * 功能描述:批量上传 + * + * @param infoReq 视频文件信息实体 + * @param files 文件 + * @return + * @author cuizhibin + * @date 2025/06/09 10:14 + */ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public List batchUpload(VideoFileInfoReq infoReq, MultipartFile[] files) { + if (null == partService.getById(infoReq.getPartId())) { + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } + if (null == files || files.length == 0) { + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String path_prefix = uploadPermVideoPath.concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + if (!FileUtil.exist(path_prefix)) { + FileUtil.mkdir(path_prefix); + } + List result = new ArrayList<>(files.length); + for (MultipartFile multipartFile : files) { + VideoFileInfoEntity info = BeanUtil.copyProperties(infoReq, VideoFileInfoEntity.class); + String path = path_prefix + multipartFile.getOriginalFilename(); + FileUtil.writeBytes(multipartFile.getBytes(), path); + info.setFilePath(Constants.PERM_VIDEO_PATH + StrUtil.removePrefix(path, uploadPermVideoPath).replace(FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + result.add(info); + } + baseMapper.insert(result); + return result.stream().map(VideoFileInfoEntity::getFilePath).collect(Collectors.toList()); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java index f131c4b..d9f7667 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/WeatherTypeServiceImpl.java @@ -54,7 +54,7 @@ public class WeatherTypeServiceImpl extends ServiceImpl list = selectList(weatherTypeReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new WeatherTypeResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new WeatherTypeResp(); } /** diff --git a/core/src/main/resources/mapper/VideoFileInfoMapper.xml b/core/src/main/resources/mapper/VideoFileInfoMapper.xml new file mode 100644 index 0000000..46a5d26 --- /dev/null +++ b/core/src/main/resources/mapper/VideoFileInfoMapper.xml @@ -0,0 +1,44 @@ + + + + + + a.id, a.part_id, a.test_point, a.worker_user_id, + a.shooting_time, a.location, a.qualified, a.frame_capture, + a.file_path, a.update_by, a.create_time, a.create_by, + a.update_time + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoFileInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoFileInfoController.java new file mode 100644 index 0000000..86d2e95 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/VideoFileInfoController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.VideoFileInfoEntity; +import com.dite.znpt.domain.vo.VideoFileInfoListReq; +import com.dite.znpt.domain.vo.VideoFileInfoReq; +import com.dite.znpt.domain.vo.VideoFileInfoResp; +import com.dite.znpt.service.VideoFileInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * @author huise23 + * @date 2025/06/09 09:42 + */ +@Api(tags = "视频文件信息") +@RestController +@RequestMapping("/video-file-info") +public class VideoFileInfoController { + @Resource + private VideoFileInfoService videoFileInfoService; + + @ApiOperation(value = "获取视频文件信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(VideoFileInfoListReq videoFileInfoReq) { + return PageResult.ok(videoFileInfoService.selectList(videoFileInfoReq)); + } + + @ApiOperation(value = "根据视频文件信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{id}") + public Result getInfo(@PathVariable String id) { + return Result.ok(videoFileInfoService.selectById(id)); + } + + @ApiOperation(value = "批量上传视频文件", httpMethod = "POST") + @PostMapping("/batch-upload") + public Result batchUploadImage(VideoFileInfoReq infoReq, + @RequestParam("file") MultipartFile[] files) throws IOException { + return Result.ok(videoFileInfoService.batchUpload(infoReq, files)); + } + + @ApiOperation(value = "修改视频文件信息", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody VideoFileInfoEntity videoFileInfo) { + videoFileInfoService.updateData(videoFileInfo); + return Result.ok(); + } + + @ApiOperation(value = "删除视频文件信息", httpMethod = "DELETE") + @DeleteMapping("/{id}") + public Result remove(@PathVariable String id) { + videoFileInfoService.deleteById(id); + return Result.ok(); + } +} + diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 713a10b..6681fd9 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -138,4 +138,5 @@ upload: image: D:\Upload\Image\Temp\ perm-path: image: D:\Upload\Image\ + video: D:\Upload\Video\ From 97ac2920694b746d08f06a80fb2ddbb7a617a80a Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 12 Jun 2025 15:13:16 +0800 Subject: [PATCH 055/143] =?UTF-8?q?=E5=BC=95=E7=94=A8=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/service/impl/ImageServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 02704ed..79f3550 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -303,7 +303,7 @@ public class ImageServiceImpl extends ServiceImpl impl List split = StrUtil.split(imageDownPath, StrUtil.SLASH, true, true); // /static/image/source/date try { - DateUtil.parseDate(split.get(4)); + DateUtil.parseDate(split.get(3)); filePaths.add(imageDownPath); } catch (Exception ignore) {} } From 4c7b7b434763ff7b72788ed8ef12230cb70679fb Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 23 Jun 2025 13:36:28 +0800 Subject: [PATCH 056/143] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E9=83=A8=E4=BB=B6id?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E7=9B=B4=E6=8E=A5=E4=B8=8A=E4=BC=A0=E5=B9=B6?= =?UTF-8?q?=E5=85=B3=E8=81=94=E9=83=A8=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/VideoFileInfoEntity.java | 4 +- .../com/dite/znpt/domain/vo/ImageWorkReq.java | 3 ++ .../dite/znpt/domain/vo/VideoFileInfoReq.java | 12 ++--- .../service/impl/ImageCollectServiceImpl.java | 3 +- .../znpt/service/impl/ImageServiceImpl.java | 44 ++++++++++++++++--- .../znpt/web/controller/CommonController.java | 25 +---------- 6 files changed, 54 insertions(+), 37 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java index 8cdb713..442e47a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/VideoFileInfoEntity.java @@ -32,8 +32,8 @@ public class VideoFileInfoEntity extends AuditableEntity implements Serializable @TableId(value = "id", type = IdType.ASSIGN_ID) private String id; - @ExcelProperty("机组id") - @ApiModelProperty(value = "机组id",required = true) + @ExcelProperty("部件id") + @ApiModelProperty(value = "部件id",required = true) @TableField("part_id") private String partId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java index 4581c1b..2b02b44 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageWorkReq.java @@ -29,4 +29,7 @@ public class ImageWorkReq implements Serializable { @ApiModelProperty("海拔") private String altitude; + + @ApiModelProperty("部件id") + private String partId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java index 2dd861a..4743eee 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java @@ -10,18 +10,18 @@ import java.io.Serializable; import java.time.LocalDateTime; /** - * @author Bear.G - * @date 2025/5/27/周二 15:25 - * @description + * @author cuizhibin + * @date 2025/06/23 11:04 + * @description 视频文件信息要求 */ @Data -@ApiModel("人员资质请求实体") +@ApiModel("视频文件请求实体") public class VideoFileInfoReq implements Serializable { @Serial private static final long serialVersionUID = 1737569842748352413L; - @NotBlank(message = "机组id不能为空") - @ApiModelProperty(value = "机组id",required = true) + @NotBlank(message = "部件id不能为空") + @ApiModelProperty(value = "部件id",required = true) private String partId; @ApiModelProperty("测试点") diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index cb8f22c..8188df1 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; @@ -67,7 +68,7 @@ public class ImageCollectServiceImpl extends ServiceImpl impl String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String path_prefix = permPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); if (Objects.nonNull(imageWorkReq)) { - path_prefix = path_prefix.concat(StrUtil.nullToDefault(imageWorkReq.getUploadUser(), "默认用户")).concat(FileUtil.FILE_SEPARATOR) - .concat(StrUtil.nullToDefault(imageWorkReq.getLongitude(), "0")) - .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getLatitude(), "0")) - .concat(" ").concat(StrUtil.nullToDefault(imageWorkReq.getAltitude(), "0")) + path_prefix = path_prefix.concat(StrUtil.emptyToDefault(imageWorkReq.getUploadUser(), "默认用户")).concat(FileUtil.FILE_SEPARATOR) + .concat(StrUtil.emptyToDefault(imageWorkReq.getLongitude(), "0")) + .concat(" ").concat(StrUtil.emptyToDefault(imageWorkReq.getLatitude(), "0")) + .concat(" ").concat(StrUtil.emptyToDefault(imageWorkReq.getAltitude(), "0")) .concat(FileUtil.FILE_SEPARATOR); } if (!FileUtil.exist(path_prefix)) { @@ -183,6 +184,39 @@ public class ImageServiceImpl extends ServiceImpl impl FileUtil.writeBytes(multipartFile.getBytes(),path); result.add(getImageDownPath(StrUtil.removePrefix(path, permPath))); } + String partId = imageWorkReq.getPartId(); + if (Objects.nonNull(partId)) { + ImageCollectEntity imageCollect = new ImageCollectEntity(); + imageCollect.setCollectId(IdUtil.simpleUUID()); + imageCollect.setCollectorName(imageWorkReq.getUploadUser()); + PartEntity part = partService.getById(partId); + if (Objects.isNull(part)) { + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } + List imageList = new ArrayList<>(); + result.forEach(path -> { + ImageEntity imageEntity = new ImageEntity(); + String absolutePath = permPath + StrUtil.removePrefix(path, Constants.PERM_IMAGE_PATH); + try { + ImageReq imageReq = imageRespBuilder(absolutePath); + BeanUtil.copyProperties(imageReq, imageEntity); + } catch (Exception e) { + log.debug("读取文件信息失败:{}", path); + imageEntity.setImageName(FileUtil.getName(absolutePath)); + BigDecimal imageSize = new BigDecimal(FileUtil.size(FileUtil.file(absolutePath))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); + imageEntity.setImageSize(imageSize.toString().concat("M")); + } + imageEntity.setLongitude(imageWorkReq.getLongitude()); + imageEntity.setLatitude(imageWorkReq.getLatitude()); + imageEntity.setAltitude(imageWorkReq.getAltitude()); + imageEntity.setImagePath(path); + imageEntity.setPartId(partId); + imageEntity.setCollectId(imageCollect.getCollectId()); + imageList.add(imageEntity); + }); + imageCollectService.save(imageCollect); + baseMapper.insert(imageList); + } return result; } @@ -392,7 +426,7 @@ public class ImageServiceImpl extends ServiceImpl impl List newImageList = new ArrayList<>(); partReq.getImagePaths().forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = permPath + StrUtil.removePrefix(path, "/static/image/"); + String absolutePath = permPath + StrUtil.removePrefix(path, Constants.PERM_IMAGE_PATH); try { ImageReq imageReq = imageRespBuilder(absolutePath); BeanUtil.copyProperties(imageReq, imageEntity); diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 04d75dd..8933223 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -2,20 +2,17 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.AppImageResp; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.ImageService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.Parameter; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; -import java.util.List; /** * @Author: gaoxiong @@ -110,36 +107,18 @@ public class CommonController { @ApiOperation(value = "上传图片", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") - public Result uploadImage(@PathVariable String imageSource, - @Parameter(description = "上传用户")@RequestParam(required = false) String uploadUser, - @Parameter(description = "经度")@RequestParam(required = false) String longitude, - @Parameter(description = "纬度")@RequestParam(required = false) String latitude, - @Parameter(description = "海拔")@RequestParam(required = false) String altitude, + public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, MultipartFile file) throws IOException { if(null == file){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } - ImageWorkReq workReq = new ImageWorkReq(); - workReq.setUploadUser(uploadUser); - workReq.setLongitude(longitude); - workReq.setLatitude(latitude); - workReq.setAltitude(altitude); return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "批量上传图片", httpMethod = "POST") @PostMapping("/batch-upload-image/{imageSource}") - public Result batchUploadImage(@PathVariable String imageSource, - @Parameter(description = "上传用户") @RequestParam(required = false) String uploadUser, - @Parameter(description = "经度") @RequestParam(required = false) String longitude, - @Parameter(description = "纬度") @RequestParam(required = false) String latitude, - @Parameter(description = "海拔") @RequestParam(required = false) String altitude, + public Result batchUploadImage(@PathVariable String imageSource, ImageWorkReq workReq, @RequestParam("file") MultipartFile[] files) throws IOException { - ImageWorkReq workReq = new ImageWorkReq(); - workReq.setUploadUser(uploadUser); - workReq.setLongitude(longitude); - workReq.setLatitude(latitude); - workReq.setAltitude(altitude); return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } From fe75768d05dc3ca71e4562ea5b88d1a7f549b3ff Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 23 Jun 2025 14:56:15 +0800 Subject: [PATCH 057/143] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=94=B9=E4=B8=BA=EF=BC=9A=E4=BB=85?= =?UTF-8?q?=E5=9C=A8=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=80=BB=E8=B7=AF=E5=BE=84=EF=BC=8C=E5=AD=90=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=9C=A8FilePathEnum=E5=A4=84=E7=90=86=E5=8F=8A=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/config/WebMvcConfig.java | 24 ++++---- .../com/dite/znpt/constant/Constants.java | 7 --- .../com/dite/znpt/domain/AuditableEntity.java | 11 ++-- .../com/dite/znpt/enums/FilePathEnum.java | 47 +++++++++++++++ .../service/impl/ImageCollectServiceImpl.java | 12 ++-- .../znpt/service/impl/ImageServiceImpl.java | 59 ++++--------------- .../impl/VideoFileInfoServiceImpl.java | 7 +-- web/src/main/resources/application-dev.yml | 7 +-- 8 files changed, 86 insertions(+), 88 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/enums/FilePathEnum.java diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index 609a88f..7f8d651 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -1,11 +1,14 @@ package com.dite.znpt.config; +import cn.hutool.core.collection.ListUtil; import com.dite.znpt.constant.Constants; +import com.dite.znpt.enums.FilePathEnum; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -18,23 +21,14 @@ import java.util.List; @Configuration public class WebMvcConfig implements WebMvcConfigurer { - @Value(value = "${upload.temp-path.image}") - private String uploadTempPath; - - @Value(value = "${upload.perm-path.image}") - private String uploadPermPath; - - @Value(value = "${upload.perm-path.video}") - private String uploadPermVideoPath; - @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); - registry.addResourceHandler(Constants.PERM_IMAGE_PATH + "**").addResourceLocations("file:" + uploadPermPath); - registry.addResourceHandler(Constants.PERM_VIDEO_PATH + "**").addResourceLocations("file:" + uploadPermVideoPath); - registry.addResourceHandler(Constants.TEMP_IMAGE_PATH + "**").addResourceLocations("file:" + uploadTempPath); + for (FilePathEnum pathEnum : FilePathEnum.values()) { + registry.addResourceHandler(pathEnum.getUrlPath() + "**").addResourceLocations("file:" + pathEnum.getFileAbsolutePath()); + } } // @Override @@ -51,7 +45,11 @@ public class WebMvcConfig implements WebMvcConfigurer { // 动态获取哪些 path 可以忽略鉴权 public List excludePaths() { // 此处仅为示例,实际项目你可以写任意代码来查询这些path - return Arrays.asList("/auth/login", "/favicon.ico", "/favicon.ico", "/doc.html", "/swagger-ui/**", "/swagger-resources","/webjars/**", "/v3/api-docs/**", "/**/v3/api-docs", "/static/image/**","/static/image/temp/**"); + ArrayList list = ListUtil.toList("/auth/login", "/favicon.ico", "/favicon.ico", "/doc.html", "/swagger-ui/**", "/swagger-resources", "/webjars/**", "/v3/api-docs/**", "/**/v3/api-docs"); + for (FilePathEnum pathEnum : FilePathEnum.values()) { + list.add(pathEnum.getUrlPath() + "**"); + } + return list; } } diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index 6e6d2b9..bb6b6d4 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -86,11 +86,4 @@ public class Constants { * 1:代表隐藏 */ public static final String VISIBLE_1 = "1"; - - // 持久化图片路径请求前缀 - public static final String TEMP_IMAGE_PATH = "/static/image/temp/"; - // 临时图片路径请求前缀 - public static final String PERM_IMAGE_PATH = "/static/image/"; - // 持久化视频文件路径请求前缀 - public static final String PERM_VIDEO_PATH = "/static/video/"; } diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index 7994845..0eb68a1 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; @@ -10,6 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; import java.util.List; @@ -22,20 +24,21 @@ import java.util.List; @NoArgsConstructor @Data public class AuditableEntity implements Serializable { + @Serial private static final long serialVersionUID = 141481953116476081L; - @ApiParam(hidden = true) + @ApiModelProperty(value = "创建人id", hidden = true) private String createBy; - @ApiParam(hidden = true) + @ApiModelProperty(value = "更新时间", hidden = true) private String updateBy; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "创建时间", example = "2022-01-22", notes = "创建时间", hidden = true) + @ApiModelProperty(value = "创建时间", hidden = true) private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(hidden = true) + @ApiModelProperty(value = "修改人id", hidden = true) private LocalDateTime updateTime; @ExcelIgnore diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java new file mode 100644 index 0000000..46ed9bb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -0,0 +1,47 @@ +package com.dite.znpt.enums; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.core.env.Environment; + +@Getter +@AllArgsConstructor +public enum FilePathEnum { + + IMAGE("/static/image/", "/image/"), + IMAGE_TEMP("/static/image/temp/", "/image/temp/"), + VIDEO("/static/video/", "/video/"), + AUDIO("/static/audio/", "/audio/"), + ; + + private final String urlPath; + private final String fileRelativePath; + + /** + * 功能描述:获取文件绝对路径 + * + * @return {@link String } + * @author cuizhibin + * @date 2025/06/23 14:46 + **/ + public String getFileAbsolutePath() { + return SpringUtil.getBean(Environment.class).getProperty("upload.save-path") + fileRelativePath; + } + + /** + * 功能描述:获取图像下载路径 + * + * @param absolutePath + * @return {@link String } + * @author cuizhibin + * @date 2025/06/06 09:07 + **/ + public String getImageDownPath(String absolutePath) { + String relativePath = StrUtil.removePrefix(absolutePath, getFileAbsolutePath()); + return StrUtil.replace(urlPath.concat(relativePath), FileUtil.FILE_SEPARATOR, StrUtil.SLASH); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 8188df1..3271a0f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -10,6 +10,7 @@ import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageCollectMapper; @@ -34,11 +35,6 @@ import java.util.List; @Service public class ImageCollectServiceImpl extends ServiceImpl implements ImageCollectService { - @Value("${upload.perm-path.image}") - private String permPath; - @Value("${upload.temp-path.image}") - private String tempPath; - @Resource private ImageService imageService; @@ -58,8 +54,8 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String permPathPrefix = permPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); - String temPathPrefix = tempPath.concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); @@ -68,7 +64,7 @@ public class ImageCollectServiceImpl extends ServiceImpl impl @Resource private PartService partService; - @Value("${upload.temp-path.image}") - private String tempPath; - - @Value("${upload.perm-path.image}") - private String permPath; @Override public List list(ImageListReq req) { List partList= this.baseMapper.queryImageList(req); @@ -100,8 +92,8 @@ public class ImageServiceImpl extends ServiceImpl impl Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); list.forEach(req -> { if(partIdMap.containsKey(req.getPartId())){ - String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); - String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String temp_path_prefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); File file = new File(req.getImagePath()); if(file.exists() && req.getImagePath().contains(temp_path_prefix)){ ImageEntity entity = new ImageEntity(); @@ -140,12 +132,12 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } List list = new ArrayList<>(files.length); - File temCategory = new File(tempPath); + File temCategory = new File(FilePathEnum.IMAGE_TEMP.getFileAbsolutePath()); if (!temCategory.exists()) { // 创建完整的目录 temCategory.mkdirs(); } - String temPathPrefix = tempPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); for (MultipartFile file : files) { if (!file.isEmpty()) { try { @@ -167,7 +159,7 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String path_prefix = permPath.concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); if (Objects.nonNull(imageWorkReq)) { path_prefix = path_prefix.concat(StrUtil.emptyToDefault(imageWorkReq.getUploadUser(), "默认用户")).concat(FileUtil.FILE_SEPARATOR) .concat(StrUtil.emptyToDefault(imageWorkReq.getLongitude(), "0")) @@ -182,7 +174,7 @@ public class ImageServiceImpl extends ServiceImpl impl for (MultipartFile multipartFile : files) { String path = path_prefix + multipartFile.getOriginalFilename(); FileUtil.writeBytes(multipartFile.getBytes(),path); - result.add(getImageDownPath(StrUtil.removePrefix(path, permPath))); + result.add(FilePathEnum.IMAGE.getImageDownPath(path)); } String partId = imageWorkReq.getPartId(); if (Objects.nonNull(partId)) { @@ -196,7 +188,7 @@ public class ImageServiceImpl extends ServiceImpl impl List imageList = new ArrayList<>(); result.forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = permPath + StrUtil.removePrefix(path, Constants.PERM_IMAGE_PATH); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); try { ImageReq imageReq = imageRespBuilder(absolutePath); BeanUtil.copyProperties(imageReq, imageEntity); @@ -245,7 +237,7 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - req.setImagePath(getTmpImageDownPath(StrUtil.removePrefix(path, tempPath))); + req.setImagePath(FilePathEnum.IMAGE_TEMP.getImageDownPath(path)); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -299,41 +291,14 @@ public class ImageServiceImpl extends ServiceImpl impl } } - /** - * 功能描述:获取图像下载路径 - * - * @param relativePath - * @return {@link String } - * @author cuizhibin - * @date 2025/06/06 09:07 - **/ - public static String getImageDownPath(String relativePath) { - String url = Constants.PERM_IMAGE_PATH.concat(relativePath); - return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); - } - - /** - * 功能描述:获取tmp图像下载路径 - * - * @param relativePath - * @return {@link String } - * @author cuizhibin - * @date 2025/06/06 09:07 - **/ - public static String getTmpImageDownPath(String relativePath) { - String url = Constants.TEMP_IMAGE_PATH.concat(StrUtil.SLASH).concat(relativePath); - return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH); - } - @Override public List listAppUploadImages() { List filePaths = new ArrayList<>(); - PathUtil.walkFiles(Path.of(permPath), new SimpleFileVisitor<>() { + PathUtil.walkFiles(Path.of(FilePathEnum.IMAGE.getFileAbsolutePath()), new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { if (path.toFile().isFile()) { - String relativePath = StrUtil.removePrefix(path.toFile().getAbsolutePath(), permPath); - String imageDownPath = getImageDownPath(relativePath); + String imageDownPath = FilePathEnum.IMAGE.getImageDownPath(path.toFile().getAbsolutePath()); List split = StrUtil.split(imageDownPath, StrUtil.SLASH, true, true); // /static/image/source/date try { @@ -426,7 +391,7 @@ public class ImageServiceImpl extends ServiceImpl impl List newImageList = new ArrayList<>(); partReq.getImagePaths().forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = permPath + StrUtil.removePrefix(path, Constants.PERM_IMAGE_PATH); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); try { ImageReq imageReq = imageRespBuilder(absolutePath); BeanUtil.copyProperties(imageReq, imageEntity); diff --git a/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java index dafbca4..a93ee3c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java @@ -10,6 +10,7 @@ import com.dite.znpt.domain.entity.VideoFileInfoEntity; import com.dite.znpt.domain.vo.VideoFileInfoListReq; import com.dite.znpt.domain.vo.VideoFileInfoReq; import com.dite.znpt.domain.vo.VideoFileInfoResp; +import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.PartService; import com.dite.znpt.service.VideoFileInfoService; @@ -39,8 +40,6 @@ import java.util.stream.Collectors; public class VideoFileInfoServiceImpl extends ServiceImpl implements VideoFileInfoService { private final PartService partService; - @Value(value = "${upload.perm-path.video}") - private String uploadPermVideoPath; /** * 功能描述:查询视频文件信息列表 @@ -121,7 +120,7 @@ public class VideoFileInfoServiceImpl extends ServiceImpl Date: Mon, 23 Jun 2025 15:41:40 +0800 Subject: [PATCH 058/143] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/AudioFileInfoEntity.java | 46 +++++++ .../znpt/domain/vo/AudioFileInfoListReq.java | 32 +++++ .../znpt/domain/vo/AudioFileInfoResp.java | 39 ++++++ .../dite/znpt/domain/vo/ImageListResp.java | 8 ++ .../com/dite/znpt/domain/vo/ImageResp.java | 5 + .../dite/znpt/mapper/AudioFileInfoMapper.java | 19 +++ .../znpt/service/AudioFileInfoService.java | 68 ++++++++++ .../impl/AudioFileInfoServiceImpl.java | 126 ++++++++++++++++++ .../znpt/service/impl/ImageServiceImpl.java | 32 +++-- .../resources/mapper/AudioFileInfoMapper.xml | 30 +++++ .../znpt/web/controller/AudioController.java | 74 ++++++++++ 11 files changed, 470 insertions(+), 9 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/AudioFileInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/AudioFileInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java create mode 100644 core/src/main/resources/mapper/AudioFileInfoMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AudioController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java new file mode 100644 index 0000000..58339b7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.entity; + +import java.io.Serial; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("audio_file_info") +@ApiModel(value="AudioFileInfoEntity对象", description="音频文件信息表") +public class AudioFileInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -86870801917845298L; + + @ExcelProperty("id") + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ExcelProperty("图片id") + @ApiModelProperty("图片id") + @TableField("image_id") + private String imageId; + + @ExcelProperty("文件保存路径") + @ApiModelProperty("文件保存路径") + @TableField("file_path") + private String filePath; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoListReq.java new file mode 100644 index 0000000..bd1e780 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoListReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息请求实体 + */ +@Data +@ApiModel("音频文件信息列表请求实体") +public class AudioFileInfoListReq implements Serializable { + + private static final long serialVersionUID = -88739013562163458L; + + @ApiModelProperty("音频文件信息Id") + private String audioId; + + @ApiModelProperty("图片id") + private String imageId; + + @ApiModelProperty("图片ids") + private List imageIds; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java new file mode 100644 index 0000000..c222a75 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息响应实体 + */ +@Data +@ApiModel("音频文件信息响应实体") +public class AudioFileInfoResp { + + @ExcelProperty("id") + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ExcelProperty("图片id") + @ApiModelProperty("图片id") + @TableField("image_id") + private String imageId; + + @ExcelProperty("文件保存路径") + @ApiModelProperty("文件保存路径") + @TableField("file_path") + private String filePath; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index e632fda..cf8088b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,6 +10,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; /** * @Author: gaoxiong @@ -29,6 +31,9 @@ public class ImageListResp implements Serializable { @TableField("image_name") private String imageName; + @ApiModelProperty("部件id") + private String partId; + @ApiModelProperty("部件名称") private String partName; @@ -83,4 +88,7 @@ public class ImageListResp implements Serializable { @ApiModelProperty("影像类型描述") private String imageTypeLabel; + + @ApiModelProperty("关联图像的音频列表") + private List audioList; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 8784839..4105c44 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,6 +10,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; /** * @author Bear.G @@ -42,4 +44,7 @@ public class ImageResp implements Serializable { @ApiModelProperty("图像拍摄信息") private ImageCollectInfo imageCollectInfo; + @ApiModelProperty("关联图像的音频列表") + private List audioList; + } diff --git a/core/src/main/java/com/dite/znpt/mapper/AudioFileInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/AudioFileInfoMapper.java new file mode 100644 index 0000000..d404c72 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/AudioFileInfoMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; +import com.dite.znpt.domain.vo.AudioFileInfoListReq; +import com.dite.znpt.domain.vo.AudioFileInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息表数据库访问层 + */ +public interface AudioFileInfoMapper extends BaseMapper { + List queryBySelective(AudioFileInfoListReq audioFileInfoReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/AudioFileInfoService.java b/core/src/main/java/com/dite/znpt/service/AudioFileInfoService.java new file mode 100644 index 0000000..753b20b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/AudioFileInfoService.java @@ -0,0 +1,68 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; +import com.dite.znpt.domain.vo.AudioFileInfoListReq; +import com.dite.znpt.domain.vo.AudioFileInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息表服务接口 + */ +public interface AudioFileInfoService extends IService { + + /** + * 功能描述:查询音频文件信息列表 + * + * @param audioFileInfoReq 音频文件信息 + * @return {@link List }<{@link AudioFileInfoEntity }> + * @author huise23 + * @date 2025/06/23 13:39 + **/ + List selectList(AudioFileInfoListReq audioFileInfoReq); + + /** + * 功能描述:查询单条音频文件信息 + * + * @param audioId 音频文件信息Id + * @return {@link AudioFileInfoResp } + * @author huise23 + * @date 2025/06/23 13:39 + **/ + AudioFileInfoResp selectById(String audioId); + + /** + * 功能描述:查询单条音频文件信息 + * + * @param imageIds 图像id列表 + * @return {@link List } + * @author huise23 + * @date 2025/06/23 13:39 + **/ + List selectByImageIds(List imageIds); + + /** + * 功能描述:删除音频文件信息 + * + * @param audioId 音频文件信息Id + * @author huise23 + * @date 2025/06/23 13:39 + **/ + void deleteById(String audioId); + + /** + * 功能描述:批量上传 + * + * @param imageId 图像id + * @param files 文件 + * @return {@link List }<{@link AudioFileInfoResp }> + * @author cuizhibin + * @date 2025/06/23 13:57 + **/ + List batchUpload(String imageId, MultipartFile[] files); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java new file mode 100644 index 0000000..c2232ec --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java @@ -0,0 +1,126 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.AudioFileInfoListReq; +import com.dite.znpt.domain.vo.AudioFileInfoResp; +import com.dite.znpt.domain.vo.PartResp; +import com.dite.znpt.enums.FilePathEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.AudioFileInfoMapper; +import com.dite.znpt.mapper.ImageMapper; +import com.dite.znpt.service.AudioFileInfoService; +import com.dite.znpt.service.PartService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author huise23 + * @date 2025/06/23 13:39 + * @Description: 音频文件信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class AudioFileInfoServiceImpl extends ServiceImpl implements AudioFileInfoService { + + private final PartService partService; + private final ImageMapper imageMapper; + + /** + * 功能描述:查询音频文件信息列表 + * + * @param audioFileInfoReq 音频文件信息信息 + * @return {@link List }<{@link AudioFileInfoEntity }> + * @author huise23 + * @date 2025/06/23 13:39 + **/ + @Override + public List selectList(AudioFileInfoListReq audioFileInfoReq) { + PageUtil.startPage(); + return lambdaQuery() + .eq(Objects.nonNull(audioFileInfoReq.getImageId()), AudioFileInfoEntity::getImageId, audioFileInfoReq.getImageId()) + .in(CollUtil.isNotEmpty(audioFileInfoReq.getImageIds()), AudioFileInfoEntity::getImageId, audioFileInfoReq.getImageIds()) + .eq(Objects.nonNull(audioFileInfoReq.getAudioId()), AudioFileInfoEntity::getId, audioFileInfoReq.getAudioId()).list(); + } + + /** + * 功能描述:查询单条音频文件信息 + * + * @param audioId 音频文件信息Id + * @return {@link AudioFileInfoEntity } + * @author huise23 + * @date 2025/06/23 13:39 + **/ + @Override + public AudioFileInfoResp selectById(String audioId) { + AudioFileInfoListReq req = new AudioFileInfoListReq(); + req.setAudioId(audioId); + List list = baseMapper.queryBySelective(req); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : null; + } + + /** + * 功能描述:查询单条音频文件信息 + * + * @param imageIds 图像id列表 + * @return {@link List } + * @author huise23 + * @date 2025/06/23 13:39 + **/ + @Override + public List selectByImageIds(List imageIds) { + AudioFileInfoListReq req = new AudioFileInfoListReq(); + req.setImageIds(imageIds); + return baseMapper.queryBySelective(req); + } + + /** + * 功能描述:删除音频文件信息 + * + * @param audioId 音频文件信息Id + * @author huise23 + * @date 2025/06/23 13:39 + **/ + @Override + public void deleteById(String audioId) { + removeById(audioId); + } + + @Override + public List batchUpload(String imageId, MultipartFile[] files) { + ImageEntity image = imageMapper.selectById(imageId); + if(null == image){ + throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); + } + PartResp partResp = partService.detail(image.getPartId()); + String audioFilePrefix = FilePathEnum.AUDIO.getFileAbsolutePath() + partResp.getProjectName().concat(FileUtil.FILE_SEPARATOR).concat(partResp.getTurbineName()).concat(FileUtil.FILE_SEPARATOR); + List list = new ArrayList<>(); + for (MultipartFile file : files) { + AudioFileInfoEntity audio = new AudioFileInfoEntity(); + audio.setImageId(imageId); + if (!file.isEmpty()) { + try { + String path = audioFilePrefix + file.getOriginalFilename(); + FileUtil.writeBytes(file.getBytes(),path); + audio.setFilePath(FilePathEnum.AUDIO.getImageDownPath(path)); + list.add(audio); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + baseMapper.insert(list); + return BeanUtil.copyToList(list, AudioFileInfoResp.class); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 2604875..d71e65d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.PathUtil; @@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.bo.PartFullInfoBo; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; @@ -22,12 +24,14 @@ import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageMapper; +import com.dite.znpt.service.AudioFileInfoService; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -67,15 +71,22 @@ public class ImageServiceImpl extends ServiceImpl impl @Resource private PartService partService; + @Autowired + private AudioFileInfoService audioFileInfoService; @Override public List list(ImageListReq req) { List partList= this.baseMapper.queryImageList(req); - partList.forEach(resp -> { - resp.setWeatherLabel(WeatherEnum.getDescByCode(resp.getWeather())); - resp.setShootingMethodLabel(ShootingMethodEnum.getDescByCode(resp.getShootingMethod())); - resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); - }); + if (CollUtil.isNotEmpty(partList)) { + Map> audioMap = audioFileInfoService.selectByImageIds(partList.stream().map(ImageListResp::getImageId).collect(Collectors.toList())) + .stream().collect(Collectors.groupingBy(AudioFileInfoResp::getImageId)); + partList.forEach(resp -> { + resp.setAudioList(BeanUtil.copyToList(audioMap.get(resp.getImageId()), AudioFileInfoResp.class)); + resp.setWeatherLabel(WeatherEnum.getDescByCode(resp.getWeather())); + resp.setShootingMethodLabel(ShootingMethodEnum.getDescByCode(resp.getShootingMethod())); + resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); + }); + } return partList; } @@ -114,11 +125,14 @@ public class ImageServiceImpl extends ServiceImpl impl @Override public ImageResp detail(String imageId) { ImageResp imageResp = this.baseMapper.detail(imageId); - if(null != imageResp && null != imageResp.getImageCollectInfo()){ - imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); - imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + if (null != imageResp) { + List list = audioFileInfoService.selectByImageIds(ListUtil.toList(imageId)); + imageResp.setAudioList(list); + if (null != imageResp.getImageCollectInfo()) { + imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); + imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + } } - return imageResp; } diff --git a/core/src/main/resources/mapper/AudioFileInfoMapper.xml b/core/src/main/resources/mapper/AudioFileInfoMapper.xml new file mode 100644 index 0000000..ccc6b6a --- /dev/null +++ b/core/src/main/resources/mapper/AudioFileInfoMapper.xml @@ -0,0 +1,30 @@ + + + + + + a.audio_id, a.image_id, a.file_path, a.update_by, + a.create_time, a.create_by, a.update_time + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/AudioController.java b/web/src/main/java/com/dite/znpt/web/controller/AudioController.java new file mode 100644 index 0000000..7fa125e --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AudioController.java @@ -0,0 +1,74 @@ +package com.dite.znpt.web.controller; + + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ArrayUtil; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.AudioFileInfoEntity; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.ImageSourceEnum; +import com.dite.znpt.service.AudioFileInfoService; +import com.dite.znpt.service.ImageCollectService; +import com.dite.znpt.service.ImageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * @author cuizhibin + * @date 2025/06/23 13:39 + * @description 音频控制器 + */ +@Api(tags = "音频信息") +@RestController +@RequestMapping("/audio") +@RequiredArgsConstructor +public class AudioController { + + private final AudioFileInfoService audioFileInfoService; + + @ApiOperation(value = "分页查询音频列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(AudioFileInfoListReq req) { + return PageResult.ok(audioFileInfoService.selectList(req)); + } + + @ApiOperation(value = "查询音频列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(AudioFileInfoListReq req){ + return Result.ok(audioFileInfoService.selectList(req)); + } + + @ApiOperation(value = "查询音频详情", httpMethod = "GET") + @GetMapping("/detail/{audioId}") + public Result detail(@PathVariable String audioId){ + return Result.ok(audioFileInfoService.selectById(audioId)); + } + + @ApiOperation(value = "删除图像", httpMethod = "DELETE") + @DeleteMapping("/{imageId}") + public Result remove(@PathVariable String imageId){ + audioFileInfoService.deleteById(imageId); + return Result.ok(); + } + + @ApiOperation(value = "上传音频", httpMethod = "POST") + @PostMapping("/upload/{imageId}") + public Result uploadBatch(@PathVariable String imageId, @RequestParam("file") MultipartFile file) { + return Result.ok(audioFileInfoService.batchUpload(imageId, new MultipartFile[]{file}).get(0)); + } + + @ApiOperation(value = "批量上传音频", httpMethod = "POST") + @PostMapping("/upload-batch/{imageId}") + public Result> uploadBatch(@PathVariable String imageId, @RequestParam("files") MultipartFile[] files) { + return Result.ok(audioFileInfoService.batchUpload(imageId, files)); + } +} From ab2bbfd990c3b5647bdd697e132a32eaaa2bf412 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 23 Jun 2025 16:14:56 +0800 Subject: [PATCH 059/143] =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/enums/FilePathEnum.java | 12 ++++++------ .../com/dite/znpt/service/impl/ImageServiceImpl.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 46ed9bb..6b7e3f7 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -7,16 +7,16 @@ import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.core.env.Environment; -@Getter @AllArgsConstructor public enum FilePathEnum { - IMAGE("/static/image/", "/image/"), - IMAGE_TEMP("/static/image/temp/", "/image/temp/"), - VIDEO("/static/video/", "/video/"), - AUDIO("/static/audio/", "/audio/"), + IMAGE("/static/image/", "image"), + IMAGE_TEMP("/static/image/temp/", "image-temp"), + VIDEO("/static/video/", "video"), + AUDIO("/static/audio/", "audio"), ; + @Getter private final String urlPath; private final String fileRelativePath; @@ -28,7 +28,7 @@ public enum FilePathEnum { * @date 2025/06/23 14:46 **/ public String getFileAbsolutePath() { - return SpringUtil.getBean(Environment.class).getProperty("upload.save-path") + fileRelativePath; + return SpringUtil.getBean(Environment.class).getProperty("upload.save-path") + fileRelativePath + FileUtil.FILE_SEPARATOR; } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index d71e65d..b7348f2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -191,7 +191,7 @@ public class ImageServiceImpl extends ServiceImpl impl result.add(FilePathEnum.IMAGE.getImageDownPath(path)); } String partId = imageWorkReq.getPartId(); - if (Objects.nonNull(partId)) { + if (StrUtil.isNotEmpty(partId)) { ImageCollectEntity imageCollect = new ImageCollectEntity(); imageCollect.setCollectId(IdUtil.simpleUUID()); imageCollect.setCollectorName(imageWorkReq.getUploadUser()); From 58032da00af31e0a445c7ef868ed3b7ed43cdaa4 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 23 Jun 2025 16:24:18 +0800 Subject: [PATCH 060/143] =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/web/controller/AudioController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/AudioController.java b/web/src/main/java/com/dite/znpt/web/controller/AudioController.java index 7fa125e..8cea262 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/AudioController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/AudioController.java @@ -53,7 +53,7 @@ public class AudioController { return Result.ok(audioFileInfoService.selectById(audioId)); } - @ApiOperation(value = "删除图像", httpMethod = "DELETE") + @ApiOperation(value = "删除音频", httpMethod = "DELETE") @DeleteMapping("/{imageId}") public Result remove(@PathVariable String imageId){ audioFileInfoService.deleteById(imageId); From af9fc57463795255585c0526d563876c3526b190 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 24 Jun 2025 00:53:06 +0800 Subject: [PATCH 061/143] =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=8E=9F=E5=9E=8B=E8=B0=83=E6=95=B4=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/RoleEntity.java | 4 +- .../dite/znpt/domain/entity/UserEntity.java | 19 ++++- .../com/dite/znpt/domain/vo/UserListReq.java | 14 ++-- .../com/dite/znpt/domain/vo/UserListResp.java | 37 +++++---- .../java/com/dite/znpt/domain/vo/UserReq.java | 13 ++- .../com/dite/znpt/domain/vo/UserResp.java | 12 ++- .../com/dite/znpt/domain/vo/UserRoleReq.java | 2 + .../com/dite/znpt/enums/UserStatusEnum.java | 52 ++++++++++++ .../com/dite/znpt/enums/UserTypeEnum.java | 51 ++++++++++++ .../znpt/service/impl/AuthServiceImpl.java | 2 +- .../impl/CertificationServiceImpl.java | 2 +- .../service/impl/UserPostServiceImpl.java | 4 +- .../service/impl/UserRoleServiceImpl.java | 2 +- .../znpt/service/impl/UserServiceImpl.java | 80 +++++++++++++++---- core/src/main/resources/mapper/UserMapper.xml | 26 +++--- 15 files changed, 258 insertions(+), 62 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/enums/UserStatusEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/UserTypeEnum.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java index fbdbe5a..43331dd 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java @@ -43,8 +43,8 @@ public class RoleEntity extends AuditableEntity implements Serializable { @TableField("role_key") private String roleKey; - @ExcelProperty("1正常0禁用") - @ApiModelProperty("1正常0禁用") + @ExcelProperty("0正常1禁用") + @ApiModelProperty("0正常1禁用") @TableField("status") private Integer status; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java index cabdef5..bb6cf0a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/UserEntity.java @@ -55,8 +55,8 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("salt") private String salt; - @ExcelProperty("1正常0禁用") - @ApiModelProperty("1正常0禁用") + @ExcelProperty("0正常1禁用") + @ApiModelProperty("0正常1禁用") @TableField("status") private Integer status; @@ -65,6 +65,21 @@ public class UserEntity extends AuditableEntity implements Serializable { @TableField("name") private String name; + @ExcelProperty("用户编码") + @ApiModelProperty("用户编码") + @TableField("user_code") + private String userCode; + + @ExcelProperty("用户类型") + @ApiModelProperty("用户类型") + @TableField("user_type") + private String userType; + + @ExcelProperty("用户状态") + @ApiModelProperty("用户状态") + @TableField("user_status") + private String userStatus; + @ApiModelProperty("所属部门") @TableField("dept_id") private String deptId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java index 6d60091..bf56563 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListReq.java @@ -17,6 +17,9 @@ public class UserListReq implements Serializable { private static final long serialVersionUID = -10363935468256543L; + @ApiModelProperty("员工编码") + private String userCode; + @ApiModelProperty("账号") private String account; @@ -26,17 +29,14 @@ public class UserListReq implements Serializable { @ApiModelProperty("所属部门id") private String deptId; - @ApiModelProperty("岗位id") - private String postId; - @ApiModelProperty("手机号码") private String mobile; - @ApiModelProperty("邮箱") - private String email; + @ApiModelProperty("在职状态,枚举UserStatusEnum") + private String userStatus; - @ApiModelProperty("1正常0禁用") - private Integer status; + @ApiModelProperty("员工性质,枚举UserTypeEnum") + private String userType; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java index f99c724..14383a4 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserListResp.java @@ -8,6 +8,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; +import java.time.LocalDateTime; /** * @author huise23 @@ -27,34 +28,42 @@ public class UserListResp implements Serializable { @ApiModelProperty("账号") private String account; - @ApiModelProperty("1正常0禁用") + @ApiModelProperty("0正常1禁用") private Integer status; @ApiModelProperty("姓名") private String name; + @ApiModelProperty("员工编码") + private String userCode; + + @ApiModelProperty("员工性质") + private String userType; + + @ApiModelProperty("员工性质描述") + private String userTypeLabel; + + @ApiModelProperty("在职状态") + private String userStatus; + + @ApiModelProperty("在职状态描述") + private String userStatusLabel; + @ApiModelProperty("所属部门名称") private String deptName; + @ApiModelProperty("角色名称") + private String roleName; + @ApiModelProperty("岗位名称") private String postName; - @ApiModelProperty("身份证") - private String identityCard; - @ApiModelProperty("手机号码") private String mobile; - @ApiModelProperty("邮箱") - private String email; - - @JsonFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty("入职日期") - private LocalDate hiredate; - - @JsonFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty("出生日期") - private LocalDate birthdate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("创建时间") + private LocalDateTime createTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index cee022c..0b49e39 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -32,19 +32,30 @@ public class UserReq implements Serializable { @ApiModelProperty("头像地址") private String avatar; - @ApiModelProperty("1正常0禁用") + @ApiModelProperty("0正常1禁用") private Integer status; @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "姓名长度不能超过20字符") @ApiModelProperty("姓名") private String name; + @NotBlank(message = "员工性质不能为空") + @ApiModelProperty("员工性质") + private String userType; + + @NotBlank(message = "在职状态不能为空") + @ApiModelProperty("在职状态") + private String userStatus; + @ApiModelProperty("所属部门") private String deptId; @ApiModelProperty("岗位") private List postIds; + @ApiModelProperty("角色") + private List roleIds; + @Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp = "^$|\\d(?:\\d{15}|\\d{17})$", message = "身份证号码格式不正确") @ApiModelProperty("身份证") private String identityCard; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java index fe1bf6d..db10ead 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java @@ -22,18 +22,24 @@ public class UserResp extends UserReq implements Serializable{ @ApiModelProperty("用户名") private String userId; - @ApiModelProperty("账号") - private String account; - @ApiModelProperty("所属部门") private String deptName; @ApiModelProperty("岗位,多个岗位英文逗号隔开") private String postName; + @ApiModelProperty("角色,多个角色英文逗号隔开") + private String roleName; + @ApiModelProperty("学历描述") private String educationLabel; + @ApiModelProperty("员工性质描述") + private String userTypeLabel; + + @ApiModelProperty("在职状态描述") + private String userStatusLabel; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java index 4f7502d..4fef747 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserRoleReq.java @@ -4,6 +4,7 @@ import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @@ -17,6 +18,7 @@ import java.util.List; * @description */ @Data +@Accessors(chain = true) @ApiModel("用户角色绑定请求实体") public class UserRoleReq implements Serializable { @Serial diff --git a/core/src/main/java/com/dite/znpt/enums/UserStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/UserStatusEnum.java new file mode 100644 index 0000000..6107111 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/UserStatusEnum.java @@ -0,0 +1,52 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/6/23 22:38 + * @Description: + */ +@Getter +public enum UserStatusEnum { + + EMPLOYED("EMPLOYED", "在职"), + DIMISSION("DIMISSION", "正常离职"), + ABNORMAL_DIMISSION("ABNORMAL_DIMISSION", "非正常离职"); + + private final String code; + private final String desc; + + UserStatusEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static UserStatusEnum getByCode(String code){ + for (UserStatusEnum e : UserStatusEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + UserStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(UserStatusEnum.values().length); + for (UserStatusEnum e : UserStatusEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/enums/UserTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/UserTypeEnum.java new file mode 100644 index 0000000..7d3d17a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/UserTypeEnum.java @@ -0,0 +1,51 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/6/23 22:38 + * @Description: + */ +@Getter +public enum UserTypeEnum { + + PERMANENT("PERMANENT", "正式工"), + TEMPORARY("TEMPORARY", "临时工"); + + private final String code; + private final String desc; + + UserTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static UserTypeEnum getByCode(String code){ + for (UserTypeEnum e : UserTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + UserTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(UserTypeEnum.values().length); + for (UserTypeEnum e : UserTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java index 4c76bd7..36e9d97 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java @@ -61,7 +61,7 @@ public class AuthServiceImpl implements AuthService { }catch (Exception e){ return Result.error(Constants.PASSWORD_EXCEPTION, Constants.PASSWORD_EXCEPTION_MESSAGE); } - if(!user.getStatus().equals(Constants.STATUS_0)){ + if(!user.getStatus().equals(Constants.STATUS_1)){ return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); } if(user.getIsDefaultPassword()){ diff --git a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java index 0e99937..f7d57a0 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java @@ -66,7 +66,7 @@ public class CertificationServiceImpl extends ServiceImpl(); } - List posts= postService.listByIds(postIds).stream().filter(post -> Constants.STATUS_0.equals(post.getStatus())).toList(); + List posts= postService.listByIds(postIds).stream().filter(post -> Constants.STATUS_1.equals(post.getStatus())).toList(); return Converts.INSTANCE.toPostResp(posts); } @@ -71,7 +71,7 @@ public class UserPostServiceImpl extends ServiceImpl userIds) { PostEntity post = postService.getById(postId); - if(null == post || !Constants.STATUS_0.equals(post.getStatus())){ + if(null == post || !Constants.STATUS_1.equals(post.getStatus())){ throw new ServiceException(Message.POST_ID_NOT_EXIST_OR_ILLEGAL); } List userList = userService.listByIds(userIds).stream().filter(userEntity -> !Constants.DEL_FLAG_1.equals(userEntity.getDelFlag())).toList(); diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java index 13688f5..1299612 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java @@ -43,7 +43,7 @@ public class UserRoleServiceImpl extends ServiceImpl(); } - List roles = roleService.listByIds(roleIds).stream().filter(role -> Constants.DEL_FLAG_0.equals(role.getDelFlag()) && Constants.STATUS_0.equals(role.getStatus())).toList(); + List roles = roleService.listByIds(roleIds).stream().filter(role -> Constants.DEL_FLAG_0.equals(role.getDelFlag()) && Constants.STATUS_1.equals(role.getStatus())).toList(); return Converts.INSTANCE.toRoleResp(roles); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index 6197865..08b6af0 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -6,24 +6,19 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.PostEntity; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.entity.UserPostEntity; -import com.dite.znpt.domain.vo.UserListReq; -import com.dite.znpt.domain.vo.UserListResp; -import com.dite.znpt.domain.vo.UserReq; -import com.dite.znpt.domain.vo.UserResp; +import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.UserStatusEnum; +import com.dite.znpt.enums.UserTypeEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.UserMapper; -import com.dite.znpt.service.DeptService; -import com.dite.znpt.service.PostService; -import com.dite.znpt.service.UserPostService; -import com.dite.znpt.service.UserService; +import com.dite.znpt.service.*; import com.dite.znpt.util.PageUtil; import com.dite.znpt.util.PasswordUtil; import lombok.RequiredArgsConstructor; @@ -33,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -50,14 +46,22 @@ public class UserServiceImpl extends ServiceImpl impleme @Value("${password.enable-default:true}") private Boolean enableDefaultPassword; + private static final String USER_CODE_PREFIX = "YG"; + private static final Integer USER_CODE_LENGTH = 4; + @Resource private DeptService deptService; @Resource private PostService postService; + @Resource + private RoleService roleService; + @Resource private UserPostService userPostService; + @Resource + private UserRoleService userRoleService; /** * 功能描述:分页查询用户信息列表 @@ -83,7 +87,11 @@ public class UserServiceImpl extends ServiceImpl impleme **/ @Override public List list(UserListReq req) { - return this.baseMapper.queryBySelective(req); + return this.baseMapper.queryBySelective(req).stream().map(resp -> { + resp.setUserTypeLabel(UserTypeEnum.getDescByCode(resp.getUserType())); + resp.setUserStatusLabel(UserStatusEnum.getDescByCode(resp.getUserStatus())); + return resp; + }).collect(Collectors.toList()); } /** @@ -101,13 +109,18 @@ public class UserServiceImpl extends ServiceImpl impleme if(StrUtil.isNotBlank(userResp.getDeptId())){ userResp.setUserId(deptService.getById(userResp.getDeptId()).getDeptName()); } + userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType())); + userResp.setUserStatusLabel(UserStatusEnum.getDescByCode(userResp.getUserStatus())); List userPostList = userPostService.list(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getUserId, userId)); if(CollUtil.isNotEmpty(userPostList)){ - String postName = postService.listByIds( - userPostList.stream().map(UserPostEntity::getPostId).toList() - ).stream().map(PostEntity::getPostName).collect(Collectors.joining(StrUtil.COMMA)); + String postName = postService.listByIds(userPostList.stream().map(UserPostEntity::getPostId).toList()).stream().map(PostEntity::getPostName).collect(Collectors.joining(StrUtil.COMMA)); userResp.setPostName(postName); } + List userRoleList = userRoleService.list(Wrappers.lambdaQuery(UserRoleEntity.class).eq(UserRoleEntity::getUserId, userId)); + if(CollUtil.isNotEmpty(userRoleList)){ + String roleName = roleService.listByIds(userRoleList.stream().map(UserRoleEntity::getRoleId).toList()).stream().map(RoleEntity::getRoleName).collect(Collectors.joining(StrUtil.COMMA)); + userResp.setRoleName(roleName); + } return userResp; } @@ -127,13 +140,48 @@ public class UserServiceImpl extends ServiceImpl impleme entity.setSalt(salt); String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword(); entity.setPassword(SaSecureUtil.md5(req.getAccount().concat(password).concat(salt))); + entity.setUserCode(userCodeGenerator()); this.save(entity); if(CollUtil.isNotEmpty(req.getPostIds())){ - userPostService.bindUserPost(entity.getUserId(), req.getPostIds()); + List postIds = postService.listByIds(req.getPostIds()).stream().filter(post -> Constants.STATUS_0.equals(post.getPostId())).map(PostEntity::getPostId).toList(); + if(CollUtil.isNotEmpty(postIds)){ + userPostService.bindUserPost(entity.getUserId(),postIds); + } + } + if(CollUtil.isNotEmpty(req.getRoleIds())){ + List roleIds = roleService.listByIds(req.getRoleIds()).stream().filter(role -> Constants.STATUS_0.equals(role.getStatus())).map(RoleEntity::getRoleId).toList(); + if(CollUtil.isNotEmpty(roleIds)){ + userRoleService.bindUserRole(new UserRoleReq().setUserId(entity.getUserId()).setRoleIds(req.getRoleIds())); + } } return SaBase64Util.encode(password); } + private String userCodeGenerator(){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.select("max(user_code) as userCode"); + List> list = this.baseMapper.selectMaps(queryWrapper); + if(CollUtil.isEmpty(list)){ + return USER_CODE_PREFIX.concat("0001"); + }else { + String maxUserCode = list.get(0).get("userCode").toString(); + String num = maxUserCode.replace(USER_CODE_PREFIX, StrUtil.EMPTY); + Integer nextNum = Integer.parseInt(num) + 1; + if(nextNum.toString().length() < USER_CODE_LENGTH){ + return USER_CODE_PREFIX.concat(StrUtil.fillBefore(nextNum.toString(), '0', USER_CODE_LENGTH)); + }else { + return USER_CODE_PREFIX.concat(nextNum.toString()); + } + } + + } + + public static void main(String[] args) { + System.out.println(Integer.parseInt("00001") + 1); + System.out.println(StrUtil.fillBefore("2",'0', 5)); + } + + /** * 功能描述:更新用户信息 * diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index 343fefb..d61f50d 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -8,13 +8,18 @@ From 52d2a2f4866264e615356c23c7f0535a8b774535 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 24 Jun 2025 23:00:32 +0800 Subject: [PATCH 062/143] =?UTF-8?q?1=E3=80=81=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A0=B9=E6=8D=AE=E5=8E=9F=E5=9E=8B=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E4=BC=98=E5=8C=96=202=E3=80=81=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E6=A0=B9=E6=8D=AE=E5=8E=9F=E5=9E=8B?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8F=8A=E4=BC=98=E5=8C=96=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0pc=E7=AB=AF=E8=8F=9C=E5=8D=95=E5=92=8Capp=E7=AB=AF?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../com/dite/znpt/context/UserContext.java | 2 +- .../dite/znpt/domain/entity/MenuEntity.java | 4 ++ .../dite/znpt/domain/entity/RoleEntity.java | 5 ++ .../java/com/dite/znpt/domain/vo/MenuReq.java | 4 ++ .../java/com/dite/znpt/domain/vo/RoleReq.java | 5 ++ .../com/dite/znpt/domain/vo/RoleResp.java | 3 ++ .../com/dite/znpt/enums/TerminalTypeEnum.java | 50 +++++++++++++++++++ .../java/com/dite/znpt/mapper/MenuMapper.java | 4 +- .../com/dite/znpt/service/MenuService.java | 2 +- .../znpt/service/impl/AuthServiceImpl.java | 28 ++++++++--- .../znpt/service/impl/MenuServiceImpl.java | 5 +- .../znpt/service/{ => impl}/RedisService.java | 9 +--- .../znpt/service/impl/RoleServiceImpl.java | 15 +++++- core/src/main/resources/mapper/MenuMapper.xml | 6 +-- .../media/zlm/cache/MediaServerCache.java | 3 +- .../zlm/cache/MediaServerChannelCache.java | 2 +- .../service/impl/DeviceVideoServiceImpl.java | 2 +- .../cmd/impl/SipDeviceCommanderImpl.java | 2 +- .../znpt/web/controller/CommonController.java | 21 +++++++- .../znpt/web/controller/MenuController.java | 4 +- 21 files changed, 140 insertions(+), 37 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/enums/TerminalTypeEnum.java rename core/src/main/java/com/dite/znpt/service/{ => impl}/RedisService.java (94%) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 5736018..c12a266 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -31,6 +31,7 @@ public class Message implements Serializable { public static final String POST_ID_NOT_EXIST = "岗位id不存在"; public static final String POST_ID_NOT_EXIST_OR_ILLEGAL = "岗位id不存在或者不合法"; public static final String ROLE_ID_NOT_EXIST = "角色id不存在"; + public static final String ROLE_CODE_EXIST = "角色编码已经存在"; public static final String ROLE_ID_NOT_EXIST_OR_ILLEGAL = "角色id不存在或者不合法"; public static final String MENU_ID_NOT_EXIST = "菜单id不存在"; public static final String MENU_ID_NOT_EXIST_OR_ILLEGAL = "菜单id不存在或者不合法"; diff --git a/core/src/main/java/com/dite/znpt/context/UserContext.java b/core/src/main/java/com/dite/znpt/context/UserContext.java index fdd2bdf..e92b61c 100644 --- a/core/src/main/java/com/dite/znpt/context/UserContext.java +++ b/core/src/main/java/com/dite/znpt/context/UserContext.java @@ -4,7 +4,7 @@ package com.dite.znpt.context; import cn.hutool.extra.spring.SpringUtil; import com.dite.znpt.domain.vo.UserResp; -import com.dite.znpt.service.RedisService; +import com.dite.znpt.service.impl.RedisService; /** * @author wujinsong diff --git a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java index 4758cd4..7161d33 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java @@ -67,4 +67,8 @@ public class MenuEntity extends AuditableEntity implements Serializable { @ApiModelProperty("权限标识") @TableField("perms") private String perms; + + @ApiModelProperty("终端类型(PC-电脑端,APP-移动端)") + @TableField("terminal_type") + private String terminalType; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java index 43331dd..cf47658 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RoleEntity.java @@ -38,6 +38,11 @@ public class RoleEntity extends AuditableEntity implements Serializable { @TableField("role_name") private String roleName; + @ExcelProperty("角色编码") + @ApiModelProperty("角色编码") + @TableField("role_code") + private String roleCode; + @ExcelProperty("角色权限字符") @ApiModelProperty("角色权限字符") @TableField("role_key") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java index 5783322..b283c5b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java @@ -47,6 +47,10 @@ public class MenuReq implements Serializable { @ApiModelProperty("参数") private String perms; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "终端类型不能为空") + @ApiModelProperty("终端类型") + private String terminalType; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java b/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java index 40134e0..3e44035 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/RoleReq.java @@ -26,6 +26,11 @@ public class RoleReq implements Serializable { @ApiModelProperty("角色名称") private String roleName; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "角色编码不能为空") + @Size(max = 20, message = "角色编码不能超过20个字符") + @ApiModelProperty("角色编码") + private String roleCode; + @NotBlank(groups = {ValidationGroup.Insert.class}, message = "角色权限字符不能为空") @Size(groups = {ValidationGroup.Insert.class}, max = 20, message = "角色权限字符不能超过20个字符") @ApiModelProperty("角色权限字符") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java b/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java index a8c5390..22853e6 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/RoleResp.java @@ -25,6 +25,9 @@ public class RoleResp implements Serializable { @ApiModelProperty("角色名称") private String roleName; + @ApiModelProperty("角色编码") + private String roleCode; + @ApiModelProperty("角色权限字符") private String roleKey; diff --git a/core/src/main/java/com/dite/znpt/enums/TerminalTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/TerminalTypeEnum.java new file mode 100644 index 0000000..70f5d0e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/TerminalTypeEnum.java @@ -0,0 +1,50 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 21:53 + * @Description: + */ +@Getter +public enum TerminalTypeEnum { + PC("PC","电脑端"), + APP("APP","移动端"); + + private final String code; + private final String desc; + + TerminalTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static TerminalTypeEnum getByCode(String code){ + for (TerminalTypeEnum e : TerminalTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + TerminalTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(TerminalTypeEnum.values().length); + for (TerminalTypeEnum e : TerminalTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java b/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java index 831a489..56b6d3f 100644 --- a/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/MenuMapper.java @@ -20,7 +20,7 @@ public interface MenuMapper extends BaseMapper { * @param menuName * @return **/ - List upwardRecursionSelect(@Param("menuName") String menuName); + List upwardRecursionSelect(@Param("menuName") String menuName, @Param("terminalType") String terminalType); /** * @Author Bear.G @@ -29,5 +29,5 @@ public interface MenuMapper extends BaseMapper { * @param menuId * @return **/ - List downwardRecursionSelect(@Param("menuId") String menuId); + List downwardRecursionSelect(@Param("menuId") String menuId, @Param("terminalType") String terminalType); } diff --git a/core/src/main/java/com/dite/znpt/service/MenuService.java b/core/src/main/java/com/dite/znpt/service/MenuService.java index d57c773..e87f2bb 100644 --- a/core/src/main/java/com/dite/znpt/service/MenuService.java +++ b/core/src/main/java/com/dite/znpt/service/MenuService.java @@ -15,7 +15,7 @@ import java.util.List; */ public interface MenuService extends IService { - List> tree(String menuName); + List> tree(String menuName, String terminalType); MenuResp detail(String menuId); void save(MenuReq req); void update(String menuId, MenuReq req); diff --git a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java index 36e9d97..29591f1 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java @@ -2,25 +2,30 @@ package com.dite.znpt.service.impl; import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentInfo; +import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dite.znpt.constant.Constants; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.DeptEntity; -import com.dite.znpt.domain.entity.MenuEntity; -import com.dite.znpt.domain.entity.RoleMenuEntity; -import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.*; import com.dite.znpt.domain.vo.LoginReq; import com.dite.znpt.domain.vo.RoleResp; import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.enums.TerminalTypeEnum; import com.dite.znpt.service.*; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -61,13 +66,16 @@ public class AuthServiceImpl implements AuthService { }catch (Exception e){ return Result.error(Constants.PASSWORD_EXCEPTION, Constants.PASSWORD_EXCEPTION_MESSAGE); } - if(!user.getStatus().equals(Constants.STATUS_1)){ + if(!user.getStatus().equals(Constants.STATUS_0)){ return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); } if(user.getIsDefaultPassword()){ return Result.error(Constants.DEFAULT_PASSWORD_EXCEPTION, Constants.DEFAULT_PASSWORD_EXCEPTION_MESSAGE); } - StpUtil.login(user.getUserId()); + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = servletRequestAttributes.getRequest(); + UserAgent userAgent = UserAgentUtil.parse(request .getHeader("User-Agent")); + StpUtil.login(user.getUserId(), new SaLoginParameter().setDeviceType(userAgent.isMobile() ? TerminalTypeEnum.APP.getCode() : TerminalTypeEnum.PC.getCode())); saveSession(user.getUserId()); return Result.ok(StpUtil.getTokenInfo()); } @@ -110,9 +118,13 @@ public class AuthServiceImpl implements AuthService { if(CollUtil.isEmpty(roleIds)){ return new ArrayList<>(); } - List menuIds = roleMenuService.list(Wrappers.lambdaQuery(RoleMenuEntity.class).in(CollUtil.isNotEmpty(roleIds), RoleMenuEntity::getRoleId, roleIds)).stream().map(RoleMenuEntity::getMenuId).toList(); + List menuIds = roleMenuService.list( + Wrappers.lambdaQuery(RoleMenuEntity.class) + .in(CollUtil.isNotEmpty(roleIds), RoleMenuEntity::getRoleId, roleIds) + ).stream().map(RoleMenuEntity::getMenuId).toList(); List menuList = menuService.list( - Wrappers.lambdaQuery(MenuEntity.class).in(CollUtil.isNotEmpty(menuIds), MenuEntity::getMenuId,menuIds) + Wrappers.lambdaQuery(MenuEntity.class) + .in(CollUtil.isNotEmpty(menuIds), MenuEntity::getMenuId,menuIds).eq(MenuEntity::getTerminalType, StpUtil.getLoginDeviceType()) ).stream().filter(menu -> Constants.VISIBLE_0.equals(menu.getVisible())).toList(); return MenuServiceImpl.buildMenuTree(menuList); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java index 3034c91..ed656af 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; @@ -27,8 +28,8 @@ import java.util.List; public class MenuServiceImpl extends ServiceImpl implements MenuService { @Override - public List> tree(String menuName) { - List menuList = StrUtil.isBlank(menuName) ? this.baseMapper.downwardRecursionSelect(null) : this.baseMapper.upwardRecursionSelect(menuName); + public List> tree(String menuName, String terminalType) { + List menuList = StrUtil.isBlank(menuName) ? this.baseMapper.downwardRecursionSelect(null, terminalType) : this.baseMapper.upwardRecursionSelect(menuName, terminalType); return buildMenuTree(menuList); } diff --git a/core/src/main/java/com/dite/znpt/service/RedisService.java b/core/src/main/java/com/dite/znpt/service/impl/RedisService.java similarity index 94% rename from core/src/main/java/com/dite/znpt/service/RedisService.java rename to core/src/main/java/com/dite/znpt/service/impl/RedisService.java index 485ba3d..6145799 100644 --- a/core/src/main/java/com/dite/znpt/service/RedisService.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RedisService.java @@ -1,17 +1,10 @@ -package com.dite.znpt.service; +package com.dite.znpt.service.impl; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; import java.util.*; diff --git a/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java index fa1cb66..543d507 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RoleServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -45,6 +46,10 @@ public class RoleServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public void save(RoleReq req) { + List roles = this.list(Wrappers.lambdaQuery(RoleEntity.class).eq(RoleEntity::getRoleCode, req.getRoleCode()).eq(RoleEntity::getDelFlag, Constants.DEL_FLAG_0)); + if(CollUtil.isNotEmpty(roles)){ + throw new ServiceException(Message.ROLE_CODE_EXIST); + } RoleEntity entity = Converts.INSTANCE.toRoleEntity(req); this.save(entity); } @@ -52,10 +57,16 @@ public class RoleServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public void update(String roleId, RoleReq req) { - RoleEntity originEntity = this.getById(roleId); - if(null == originEntity || !Constants.DEL_FLAG_0.equals(originEntity.getDelFlag())) { + RoleEntity role = this.getById(roleId); + if(null == role || !Constants.DEL_FLAG_0.equals(role.getDelFlag())) { throw new ServiceException(Message.ROLE_ID_NOT_EXIST); } + if(!role.getRoleCode().equals(req.getRoleCode())){ + List roles = this.list(Wrappers.lambdaQuery(RoleEntity.class).eq(RoleEntity::getRoleCode, req.getRoleCode()).eq(RoleEntity::getDelFlag, Constants.DEL_FLAG_0)); + if(CollUtil.isNotEmpty(roles)){ + throw new ServiceException(Message.ROLE_CODE_EXIST); + } + } RoleEntity entity = Converts.INSTANCE.toRoleEntity(req); entity.setRoleId(roleId); entity.setRoleKey(null); diff --git a/core/src/main/resources/mapper/MenuMapper.xml b/core/src/main/resources/mapper/MenuMapper.xml index f2a0ca3..34436b1 100644 --- a/core/src/main/resources/mapper/MenuMapper.xml +++ b/core/src/main/resources/mapper/MenuMapper.xml @@ -6,7 +6,7 @@ WITH RECURSIVE SubMenus AS ( SELECT * FROM menu - + WHERE terminal_type = #{terminalType} AND menu_id = #{menuId} -- 起始菜单ID @@ -33,7 +32,6 @@ AND parent_id = '0' -- 起始菜单 - UNION ALL SELECT d.* FROM menu d INNER JOIN SubMenus sd ON d.parent_id = sd.menu_id ) SELECT * FROM SubMenus; diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java index f4b8237..4f13dad 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java @@ -1,10 +1,9 @@ package com.dite.znpt.monitor.media.zlm.cache; import com.dite.znpt.monitor.media.zlm.dto.ServerItem; -import com.dite.znpt.service.RedisService; +import com.dite.znpt.service.impl.RedisService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; /** diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java index df1bb2b..27b7fbb 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java +++ b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java @@ -2,7 +2,7 @@ package com.dite.znpt.monitor.media.zlm.cache; import cn.hutool.core.util.StrUtil; import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.service.RedisService; +import com.dite.znpt.service.impl.RedisService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java index 58444ec..8c00abb 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java +++ b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java @@ -24,7 +24,7 @@ import com.dite.znpt.monitor.service.DeviceVideoChannelService; import com.dite.znpt.monitor.service.DeviceVideoService; import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.service.RedisService; +import com.dite.znpt.service.impl.RedisService; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java index bc686a9..72672fc 100644 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java +++ b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java @@ -6,7 +6,7 @@ import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; import com.dite.znpt.monitor.media.zlm.ZlmService; import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; import com.dite.znpt.monitor.sip.transmit.cmd.SipRequestHeaderProvider; -import com.dite.znpt.service.RedisService; +import com.dite.znpt.service.impl.RedisService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 8933223..bdefa42 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -107,8 +107,7 @@ public class CommonController { @ApiOperation(value = "上传图片", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") - public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, - MultipartFile file) throws IOException { + public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, MultipartFile file) throws IOException { if(null == file){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } @@ -128,5 +127,23 @@ public class CommonController { return Result.ok(MenuTypeEnum.listAll()); } + @ApiOperation(value = "查询终端类型", httpMethod = "GET") + @GetMapping("/list/terminal-type") + public Result listTerminalType(){ + return Result.ok(TerminalTypeEnum.listAll()); + } + + @ApiOperation(value = "查询在职状态", httpMethod = "GET") + @GetMapping("/list/user_status") + public Result listUserStatus(){ + return Result.ok(UserStatusEnum.listAll()); + } + + @ApiOperation(value = "查询员工性质", httpMethod = "GET") + @GetMapping("/list/user_type") + public Result listUserType(){ + return Result.ok(UserTypeEnum.listAll()); + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/MenuController.java b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java index cc39b84..2f651f7 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/MenuController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java @@ -25,8 +25,8 @@ public class MenuController { @ApiOperation(value = "查询菜单树", httpMethod = "GET") @GetMapping("/tree") - public Result tree (@RequestParam(name = "menuName", required = false) String menuName) { - return Result.ok(menuService.tree(menuName)); + public Result tree (@RequestParam(name = "menuName", required = false) String menuName, @RequestParam(defaultValue = "PC") String terminalType) { + return Result.ok(menuService.tree(menuName, terminalType)); } @ApiOperation(value = "查询菜单详情", httpMethod = "GET") From 5f77193e57161a5644dd90b0fe18c570a0feea71 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 10:31:06 +0800 Subject: [PATCH 063/143] =?UTF-8?q?gitee-webhook=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/web/controller/DeployController.java | 157 ++++++++++++++++++ web/src/main/resources/application-dev.yml | 4 + 2 files changed, 161 insertions(+) create mode 100644 web/src/main/java/com/dite/znpt/web/controller/DeployController.java diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeployController.java b/web/src/main/java/com/dite/znpt/web/controller/DeployController.java new file mode 100644 index 0000000..c3045e7 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/DeployController.java @@ -0,0 +1,157 @@ +package com.dite.znpt.web.controller; + +import org.apache.commons.codec.binary.Hex; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.MessageDigest; + +@RestController +public class DeployController { + + @Value("${deploy.secret}") + private String secret; + + @Value("${deploy.app-dir}") + private String appDir; + + private Process deploymentProcess; + + @PostMapping("/gitee-webhook") + public ResponseEntity handleWebhook( + @RequestHeader(value = "X-Gitee-Token", required = false) String signature, + @RequestBody String payload) { + + // 验证签名 + if (signature == null || !signature.equals(calculateSignature(payload))) { + return ResponseEntity.status(401).body("无效签名"); + } + + // 安全启动部署 + startDeployment(); + + return ResponseEntity.ok("部署流程已启动"); + } + + @GetMapping("/deployment-status") + public ResponseEntity getDeploymentStatus() { + try { + Path statusFile = Path.of(appDir, "deployment-status.txt"); + if (!Files.exists(statusFile)) { + return ResponseEntity.ok("尚未开始部署"); + } + + String statusContent = Files.readString(statusFile); + return ResponseEntity.ok(statusContent); + } catch (Exception e) { + return ResponseEntity.status(500).body("状态读取错误: " + e.getMessage()); + } + } + + @GetMapping("/deployment-log") + public ResponseEntity getDeploymentLog( + @RequestParam(defaultValue = "20") int lines) { + try { + Path logFile = Path.of(appDir, "deploy.log"); + if (!Files.exists(logFile)) { + return ResponseEntity.ok("无可用日志"); + } + + String logContent; + if (lines > 0) { + logContent = tail(logFile, lines); + } else { + logContent = Files.readString(logFile); + } + + return ResponseEntity.ok("
      " + logContent + "
      "); + } catch (Exception e) { + return ResponseEntity.status(500).body("日志读取错误: " + e.getMessage()); + } + } + + private synchronized void startDeployment() { + // 防止重复部署 + if (deploymentProcess != null && deploymentProcess.isAlive()) { + return; + } + + try { + // 清理旧状态 + Files.deleteIfExists(Path.of(appDir, "deployment-status.txt")); + + // 启动部署脚本 + ProcessBuilder builder = new ProcessBuilder("./deploy.sh"); + builder.directory(new File(appDir)); + builder.redirectErrorStream(true); + + deploymentProcess = builder.start(); + + // 启动日志监控线程 + new Thread(() -> { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(deploymentProcess.getInputStream()))) { + + while (deploymentProcess.isAlive()) { + String line = reader.readLine(); + if (line != null) { + System.out.println("[DEPLOY] " + line); + } + } + + int exitCode = deploymentProcess.waitFor(); + System.out.println("部署进程结束,状态码: " + exitCode); + deploymentProcess = null; + + } catch (Exception e) { + System.err.println("部署日志读取错误: " + e.getMessage()); + } + }).start(); + + } catch (Exception e) { + System.err.println("启动部署脚本失败: " + e.getMessage()); + try { + Files.writeString(Path.of(appDir, "deployment-status.txt"), + "START_FAILED - " + e.getMessage()); + } catch (Exception ex) { + // 忽略 + } + } + } + + private String tail(Path path, int lines) throws IOException { + ProcessBuilder builder = new ProcessBuilder("tail", "-n", String.valueOf(lines), path.toString()); + Process process = builder.start(); + + StringBuilder output = new StringBuilder(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + + String line; + while ((line = reader.readLine()) != null) { + output.append(line).append("\n"); + } + } + return output.toString(); + } + + private String calculateSignature(String payload) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] signatureBytes = digest.digest( + (payload + secret).getBytes(StandardCharsets.UTF_8) + ); + return Hex.encodeHexString(signatureBytes); + } catch (Exception e) { + throw new RuntimeException("签名生成失败", e); + } + } +} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index f1dcea0..04c6399 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -137,3 +137,7 @@ upload: # 此处仅定义总的父路径,细节定义到 FilePathEnum save-path: D:\Upload\ +# 部署配置 +deploy: + secret: cRc5888KAo4TxRS4y5iv35GM + app-dir: /home/dtyx/znpt-backend From 2c7a88f900fc91eb7dd3407eebaeb48956e0f5ff Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 11:37:36 +0800 Subject: [PATCH 064/143] =?UTF-8?q?gitee-webhook=20=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeployController.java | 55 ++++++------- .../web/build/GiteeSignatureVerifier.java | 79 +++++++++++++++++++ 2 files changed, 102 insertions(+), 32 deletions(-) rename web/src/main/java/com/dite/znpt/web/{controller => build}/DeployController.java (73%) create mode 100644 web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeployController.java b/web/src/main/java/com/dite/znpt/web/build/DeployController.java similarity index 73% rename from web/src/main/java/com/dite/znpt/web/controller/DeployController.java rename to web/src/main/java/com/dite/znpt/web/build/DeployController.java index c3045e7..83de059 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DeployController.java +++ b/web/src/main/java/com/dite/znpt/web/build/DeployController.java @@ -1,41 +1,47 @@ -package com.dite.znpt.web.controller; +package com.dite.znpt.web.build; -import org.apache.commons.codec.binary.Hex; +import cn.hutool.core.util.StrUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; + import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.MessageDigest; @RestController public class DeployController { @Value("${deploy.secret}") - private String secret; + private String webhookSecret; - @Value("${deploy.app-dir}") - private String appDir; + @Value("${deploy.build-dir}") + private String buildDir; private Process deploymentProcess; + private final GiteeSignatureVerifier signatureVerifier = new GiteeSignatureVerifier(); @PostMapping("/gitee-webhook") public ResponseEntity handleWebhook( - @RequestHeader(value = "X-Gitee-Token", required = false) String signature, + @RequestHeader(value = "X-Gitee-Token", required = false) String receivedSignature, + @RequestHeader(value = "X-Gitee-Timestamp", required = false) String timestamp, @RequestBody String payload) { - // 验证签名 - if (signature == null || !signature.equals(calculateSignature(payload))) { - return ResponseEntity.status(401).body("无效签名"); + // 0. 基本验证 + if (StrUtil.isAllNotBlank(receivedSignature, timestamp)) { + return ResponseEntity.status(403).body("签名验证失败"); } - // 安全启动部署 + // 1. 验证签名 + if (!signatureVerifier.verifySignature(receivedSignature, timestamp, payload, webhookSecret)) { + System.out.println("签名验证失败"); + return ResponseEntity.status(403).body("签名验证失败"); + } + + // 2. 启动部署流程 startDeployment(); return ResponseEntity.ok("部署流程已启动"); @@ -44,7 +50,7 @@ public class DeployController { @GetMapping("/deployment-status") public ResponseEntity getDeploymentStatus() { try { - Path statusFile = Path.of(appDir, "deployment-status.txt"); + Path statusFile = Path.of(buildDir, "deployment-status.txt"); if (!Files.exists(statusFile)) { return ResponseEntity.ok("尚未开始部署"); } @@ -60,7 +66,7 @@ public class DeployController { public ResponseEntity getDeploymentLog( @RequestParam(defaultValue = "20") int lines) { try { - Path logFile = Path.of(appDir, "deploy.log"); + Path logFile = Path.of(buildDir, "deploy.log"); if (!Files.exists(logFile)) { return ResponseEntity.ok("无可用日志"); } @@ -85,12 +91,9 @@ public class DeployController { } try { - // 清理旧状态 - Files.deleteIfExists(Path.of(appDir, "deployment-status.txt")); - // 启动部署脚本 ProcessBuilder builder = new ProcessBuilder("./deploy.sh"); - builder.directory(new File(appDir)); + builder.directory(new File(buildDir)); builder.redirectErrorStream(true); deploymentProcess = builder.start(); @@ -119,7 +122,7 @@ public class DeployController { } catch (Exception e) { System.err.println("启动部署脚本失败: " + e.getMessage()); try { - Files.writeString(Path.of(appDir, "deployment-status.txt"), + Files.writeString(Path.of(buildDir, "deployment-status.txt"), "START_FAILED - " + e.getMessage()); } catch (Exception ex) { // 忽略 @@ -142,16 +145,4 @@ public class DeployController { } return output.toString(); } - - private String calculateSignature(String payload) { - try { - MessageDigest digest = MessageDigest.getInstance("SHA-256"); - byte[] signatureBytes = digest.digest( - (payload + secret).getBytes(StandardCharsets.UTF_8) - ); - return Hex.encodeHexString(signatureBytes); - } catch (Exception e) { - throw new RuntimeException("签名生成失败", e); - } - } } diff --git a/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java new file mode 100644 index 0000000..0da970d --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java @@ -0,0 +1,79 @@ +package com.dite.znpt.web.build; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.Base64; + +public class GiteeSignatureVerifier { + + private static final long MAX_TIME_DIFF = 3600 * 1000; // 1小时(毫秒) + + public boolean verifySignature(String receivedSignature, + String receivedTimestamp, + String payload, + String secret) { + // 1. 验证时间有效性(避免重放攻击) + if (!validateTimestamp(receivedTimestamp)) { + System.out.println("时间戳超出允许范围"); + return false; + } + + // 2. 计算期望签名 + String computedSignature = computeSignature( + receivedTimestamp, + payload, + secret + ); + + // 3. 安全比较签名(防止时序攻击) + return constantTimeEquals(receivedSignature, computedSignature); + } + + private boolean validateTimestamp(String timestampStr) { + try { + long timestamp = Long.parseLong(timestampStr); + long currentTime = Instant.now().toEpochMilli(); + return Math.abs(currentTime - timestamp) < MAX_TIME_DIFF; + } catch (NumberFormatException e) { + System.err.println("无效的时间戳格式: " + timestampStr); + return false; + } + } + + private String computeSignature(String timestamp, String payload, String secret) { + try { + // Step 1: HMAC-SHA256(ts + "\n" + secret) + String data = timestamp + "\n" + secret; + Mac hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec keySpec = new SecretKeySpec( + secret.getBytes(StandardCharsets.UTF_8), + "HmacSHA256" + ); + hmac.init(keySpec); + byte[] rawSignature = hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)); + + // Step 2: Base64 encode + String base64Sig = Base64.getEncoder().encodeToString(rawSignature); + + // Step 3: URL encode + return URLEncoder.encode(base64Sig, StandardCharsets.UTF_8.toString()); + } catch (Exception e) { + throw new RuntimeException("签名计算失败", e); + } + } + + // 防止时序攻击的安全字符串比较 + private boolean constantTimeEquals(String a, String b) { + if (a == null || b == null || a.length() != b.length()) { + return false; + } + int result = 0; + for (int i = 0; i < a.length(); i++) { + result |= a.charAt(i) ^ b.charAt(i); + } + return result == 0; + } +} From 84348d3ee870dcf51a3574174d19f48d7ed85939 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 13:25:27 +0800 Subject: [PATCH 065/143] =?UTF-8?q?gitee-webhook=20=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/web/build/GiteeSignatureVerifier.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java index 0da970d..9501444 100644 --- a/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java +++ b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java @@ -1,5 +1,7 @@ package com.dite.znpt.web.build; +import lombok.extern.slf4j.Slf4j; + import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.net.URLEncoder; @@ -7,6 +9,7 @@ import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.Base64; +@Slf4j public class GiteeSignatureVerifier { private static final long MAX_TIME_DIFF = 3600 * 1000; // 1小时(毫秒) @@ -17,7 +20,7 @@ public class GiteeSignatureVerifier { String secret) { // 1. 验证时间有效性(避免重放攻击) if (!validateTimestamp(receivedTimestamp)) { - System.out.println("时间戳超出允许范围"); + log.debug("时间戳超出允许范围"); return false; } @@ -38,7 +41,7 @@ public class GiteeSignatureVerifier { long currentTime = Instant.now().toEpochMilli(); return Math.abs(currentTime - timestamp) < MAX_TIME_DIFF; } catch (NumberFormatException e) { - System.err.println("无效的时间戳格式: " + timestampStr); + log.debug("无效的时间戳格式: {}", timestampStr); return false; } } From c7de5c9db9e619e7ad693e8bc8bcd9a711b22e3d Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 13:43:58 +0800 Subject: [PATCH 066/143] =?UTF-8?q?gitee-webhook=20=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/web/build/DeployController.java | 8 +++++++- .../com/dite/znpt/web/build/GiteeSignatureVerifier.java | 8 ++++---- web/src/main/resources/application-dev.yml | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/build/DeployController.java b/web/src/main/java/com/dite/znpt/web/build/DeployController.java index 83de059..193e3bb 100644 --- a/web/src/main/java/com/dite/znpt/web/build/DeployController.java +++ b/web/src/main/java/com/dite/znpt/web/build/DeployController.java @@ -1,6 +1,8 @@ package com.dite.znpt.web.build; import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -12,6 +14,7 @@ import java.io.InputStreamReader; import java.nio.file.Files; import java.nio.file.Path; +@Api(tags = "webhook自动部署") @RestController public class DeployController { @@ -24,6 +27,7 @@ public class DeployController { private Process deploymentProcess; private final GiteeSignatureVerifier signatureVerifier = new GiteeSignatureVerifier(); + @ApiOperation(value = "自动部署", httpMethod = "POST") @PostMapping("/gitee-webhook") public ResponseEntity handleWebhook( @RequestHeader(value = "X-Gitee-Token", required = false) String receivedSignature, @@ -31,7 +35,7 @@ public class DeployController { @RequestBody String payload) { // 0. 基本验证 - if (StrUtil.isAllNotBlank(receivedSignature, timestamp)) { + if (!StrUtil.isAllNotBlank(receivedSignature, timestamp)) { return ResponseEntity.status(403).body("签名验证失败"); } @@ -47,6 +51,7 @@ public class DeployController { return ResponseEntity.ok("部署流程已启动"); } + @ApiOperation(value = "查询自动部署状态", httpMethod = "GET") @GetMapping("/deployment-status") public ResponseEntity getDeploymentStatus() { try { @@ -62,6 +67,7 @@ public class DeployController { } } + @ApiOperation(value = "查询自动部署日志", httpMethod = "GET") @GetMapping("/deployment-log") public ResponseEntity getDeploymentLog( @RequestParam(defaultValue = "20") int lines) { diff --git a/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java index 9501444..c828975 100644 --- a/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java +++ b/web/src/main/java/com/dite/znpt/web/build/GiteeSignatureVerifier.java @@ -1,13 +1,13 @@ package com.dite.znpt.web.build; +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.core.net.URLEncodeUtil; import lombok.extern.slf4j.Slf4j; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; -import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.Instant; -import java.util.Base64; @Slf4j public class GiteeSignatureVerifier { @@ -59,10 +59,10 @@ public class GiteeSignatureVerifier { byte[] rawSignature = hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)); // Step 2: Base64 encode - String base64Sig = Base64.getEncoder().encodeToString(rawSignature); + String base64Sig = Base64Encoder.encode(rawSignature); // Step 3: URL encode - return URLEncoder.encode(base64Sig, StandardCharsets.UTF_8.toString()); + return URLEncodeUtil.encode(base64Sig); } catch (Exception e) { throw new RuntimeException("签名计算失败", e); } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 04c6399..3890aab 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -140,4 +140,4 @@ upload: # 部署配置 deploy: secret: cRc5888KAo4TxRS4y5iv35GM - app-dir: /home/dtyx/znpt-backend + build-dir: /home/dtyx/znpt-backend From 6f1b6573b8180f918c1316f7f3e3ef7d9750c0af Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 13:46:02 +0800 Subject: [PATCH 067/143] =?UTF-8?q?gitee-webhook=20=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/main/resources/application-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 3890aab..912d667 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -141,3 +141,4 @@ upload: deploy: secret: cRc5888KAo4TxRS4y5iv35GM build-dir: /home/dtyx/znpt-backend + From 5f49a0ecc2c17a8503dba9fd8174e180721c74bc Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 13:49:24 +0800 Subject: [PATCH 068/143] =?UTF-8?q?gitee-webhook=20=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/main/resources/application-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 912d667..bbc969b 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -140,5 +140,5 @@ upload: # 部署配置 deploy: secret: cRc5888KAo4TxRS4y5iv35GM - build-dir: /home/dtyx/znpt-backend + build-dir: /home/dtyx/znpt-backend/build From 7306aaccd28fa3749810ddf70d209d97167dbd8b Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 25 Jun 2025 21:03:39 +0800 Subject: [PATCH 069/143] =?UTF-8?q?=E7=A7=BB=E9=99=A4data-bus=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data-bus/pom.xml | 32 ------- .../dite/znpt/data/bus/config/MQConfig.java | 90 ------------------- .../dite/znpt/data/bus/config/MQHandle.java | 21 ----- .../znpt/data/bus/entity/CommonMessage.java | 10 --- .../znpt/data/bus/entity/req/ProjectDTO.java | 12 --- .../znpt/data/bus/enums/MQOperationEnum.java | 33 ------- .../dite/znpt/data/bus/enums/MQTypeEnum.java | 31 ------- .../data/bus/handles/ProjectHandleImpl.java | 26 ------ pom.xml | 1 - 9 files changed, 256 deletions(-) delete mode 100644 data-bus/pom.xml delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java delete mode 100644 data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java diff --git a/data-bus/pom.xml b/data-bus/pom.xml deleted file mode 100644 index 0b33237..0000000 --- a/data-bus/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - com.dite.znpt - parent - 1.0.0-SNAPSHOT - - - data-bus - 1.0.0-SNAPSHOT - - - 17 - 17 - UTF-8 - - - - - com.dite.znpt - core - 1.0.0-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-amqp - - - \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java deleted file mode 100644 index b8f1fa5..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQConfig.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.dite.znpt.data.bus.config; - -import cn.hutool.extra.spring.SpringUtil; -import com.dite.znpt.data.bus.entity.CommonMessage; -import com.dite.znpt.data.bus.enums.MQTypeEnum; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.*; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitAdmin; -import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@Component -public class MQConfig { - @Autowired - private ConnectionFactory connectionFactory; - - @Bean - public RabbitAdmin rabbitAdmin() { - RabbitAdmin admin = new RabbitAdmin(connectionFactory); - admin.setAutoStartup(true); - return admin; - } - - @Bean - public TopicExchange topicExchange() { - return new TopicExchange("data.topic.exchange"); - } - - @Bean - public Declarables declarables(TopicExchange exchange) { - List declarables = new ArrayList<>(); - declarables.add(exchange); - - for (MQTypeEnum typeEnum : MQTypeEnum.values()) { - String queueName = typeEnum.getType() + ".queue"; - Queue queue = new Queue(queueName, true); - declarables.add(queue); - Binding binding = BindingBuilder.bind(queue) - .to(exchange) - .with(typeEnum.getType() + ".*"); - declarables.add(binding); - } - - return new Declarables(declarables); - } - - @Bean - public List registerListeners(Declarables declarables) { - List messageListeners = new ArrayList<>(); - for (MQTypeEnum typeEnum : MQTypeEnum.values()) { - String queueName = typeEnum.getType() + ".queue"; - - SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); - container.setConnectionFactory(connectionFactory); - container.setQueueNames(queueName); - container.setMessageListener(message -> { - String body = new String(message.getBody()); - log.debug("队列: " + queueName + " 收到消息: " + body); - try { - ObjectMapper objectMapper = new ObjectMapper(); - CommonMessage msg = objectMapper.readValue(body, - objectMapper.getTypeFactory().constructParametricType(CommonMessage.class, typeEnum.getDto())); - MQHandle handle = SpringUtil.getBean(typeEnum.getImpl()); - handleMessageWithType(handle, msg); - } catch (Exception e) { - log.error("mq队列处理出错", e); - } - }); - messageListeners.add(container); - // 启动监听 - container.start(); - } - log.info("mq监听启动完成"); - return messageListeners; - } - - @SuppressWarnings("unchecked") - private void handleMessageWithType(MQHandle handler, CommonMessage message) { - handler.handle((CommonMessage) message); - } - -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java b/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java deleted file mode 100644 index fef3cec..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/config/MQHandle.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dite.znpt.data.bus.config; - -import com.dite.znpt.data.bus.entity.CommonMessage; -import com.fasterxml.jackson.core.JsonProcessingException; - -/** - * @author cuizhibin - * @date 2025/04/22 17:03 - * @description mq处理接口 - */ -public interface MQHandle { - - /** - * 功能描述:mq处理类 - * - * @param msg 消息 - * @author cuizhibin - * @date 2025/04/22 17:03 - **/ - void handle(CommonMessage msg); -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java deleted file mode 100644 index b400872..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/CommonMessage.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dite.znpt.data.bus.entity; - -import com.dite.znpt.data.bus.enums.MQOperationEnum; -import lombok.Data; - -@Data -public class CommonMessage { - private MQOperationEnum operation; - private T payload; -} \ No newline at end of file diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java b/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java deleted file mode 100644 index 627b8d3..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/entity/req/ProjectDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.data.bus.entity.req; - -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor -@Data -public class ProjectDTO { - -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java deleted file mode 100644 index bdbebfe..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQOperationEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dite.znpt.data.bus.enums; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -@Getter -public enum MQOperationEnum { - ADD("add", "新增"), - UPDATE("update", "修改"), - DEL("del", "删除"), - ; - private final String code; - private final String desc; - - MQOperationEnum(String code, String desc) { - this.code = code; - this.desc = desc; - } - - @JsonValue - public String getCode() { - return code; - } - - @JsonCreator - public static MQOperationEnum fromCode(String code) { - for (MQOperationEnum s : values()) { - if (s.code.equals(code)) return s; - } - throw new IllegalArgumentException("Unknown code: " + code); - } -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java b/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java deleted file mode 100644 index 5091125..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/enums/MQTypeEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.data.bus.enums; - -import com.dite.znpt.data.bus.config.MQHandle; -import com.dite.znpt.data.bus.entity.req.ProjectDTO; -import com.dite.znpt.data.bus.handles.ProjectHandleImpl; -import lombok.Getter; - -/** - * @author cuizhibin - * @date 2025/04/22 17:05 - * @description mq类型枚举 - */ -@Getter -public enum MQTypeEnum { - PROJECT("project", "项目", ProjectHandleImpl.class, ProjectDTO.class), - CREW("crew", "机组", ProjectHandleImpl.class, ProjectDTO.class), - PARTS("parts", "部件", ProjectHandleImpl.class, ProjectDTO.class), - ; - - private final String type; - private final String desc; - private final Class> impl; - private final Class dto; - - MQTypeEnum(String type, String desc, Class> impl, Class dto) { - this.type = type; - this.desc = desc; - this.impl = impl; - this.dto = dto; - } -} diff --git a/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java b/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java deleted file mode 100644 index 63f745a..0000000 --- a/data-bus/src/main/java/com/dite/znpt/data/bus/handles/ProjectHandleImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.data.bus.handles; - -import com.dite.znpt.data.bus.config.MQHandle; -import com.dite.znpt.data.bus.entity.CommonMessage; -import com.dite.znpt.data.bus.entity.req.ProjectDTO; -import org.springframework.stereotype.Service; - -/** - * @author cuizhibin - * @date 2025/04/22 17:11 - * @description 项目处理 - */ -@Service -public class ProjectHandleImpl implements MQHandle { - /** - * 功能描述:mq处理类 - * - * @param msg 消息 - * @author cuizhibin - * @date 2025/04/22 17:03 - **/ - @Override - public void handle(CommonMessage msg) { - - } -} diff --git a/pom.xml b/pom.xml index e1ec815..0f34b69 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,6 @@ core sip web - data-bus pom From 941b5de453040a06b23fedc2b2ddd5952d66947b Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Wed, 25 Jun 2025 23:51:41 +0800 Subject: [PATCH 070/143] =?UTF-8?q?=E4=BF=9D=E9=99=A9=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=EF=BC=8C=E4=BF=9D=E9=99=A9=E7=B1=BB=E5=9E=8B=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E9=99=A9=E4=BF=A1=E6=81=AF=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/InsuranceCompanyEntity.java | 52 +++++++++++ .../domain/entity/InsuranceInfoEntity.java | 87 +++++++++++++++++++ .../domain/entity/InsuranceTypeEntity.java | 44 ++++++++++ .../znpt/domain/vo/InsuranceCompanyReq.java | 21 +++++ .../znpt/domain/vo/InsuranceCompanyResp.java | 21 +++++ .../znpt/domain/vo/InsuranceInfoListReq.java | 21 +++++ .../dite/znpt/domain/vo/InsuranceInfoReq.java | 21 +++++ .../znpt/domain/vo/InsuranceInfoResp.java | 21 +++++ .../dite/znpt/domain/vo/InsuranceTypeReq.java | 21 +++++ .../znpt/domain/vo/InsuranceTypeResp.java | 21 +++++ 10 files changed, 330 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java new file mode 100644 index 0000000..eca57df --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java @@ -0,0 +1,52 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:15 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("insurance_company") +@ApiModel(value="InsuranceCompanyEntity对象", description="保险公司信息") +public class InsuranceCompanyEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 6335457810854776901L; + + @ApiModelProperty("公司id") + @TableId(value = "insurance_company_id", type = IdType.ASSIGN_UUID) + private String insuranceCompanyId; + + @ApiModelProperty("公司名称") + @TableField("insurance_company_name") + private String insuranceCompanyName; + + @ApiModelProperty("联系人") + @TableField("contact") + private String contact; + + @ApiModelProperty("联系人电话") + @TableField("contact_phone") + private String contactPhone; + + @ApiModelProperty("状态:0-合作中,1-终止合作") + @TableField("status") + private String status; + + @ApiModelProperty("删除标志(0代表存在 ,1代表删除)") + @TableField("delFlag") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java new file mode 100644 index 0000000..2042e62 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java @@ -0,0 +1,87 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:15 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("insurance_info") +@ApiModel(value="InsuranceInfoEntity对象", description="保险信息") +public class InsuranceInfoEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 465741795038101117L; + + @ApiModelProperty("保险信息id") + @TableId(value = "insurance_info_id", type = IdType.ASSIGN_UUID) + private String insuranceInfoId; + + @ApiModelProperty("员工id") + @TableField("user_id") + private String userId; + + @ApiModelProperty("员工姓名") + @TableField("name") + private String name; + + @ApiModelProperty("员工工号") + @TableField("user_code") + private String userCode; + + @ApiModelProperty("保险公司id") + @TableField("insurance_company_id") + private String insuranceCompanyId; + + @ApiModelProperty("保险公司") + @TableField("insurance_company_name") + private String insuranceCompanyName; + + @ApiModelProperty("保险类型id") + @TableField("insurance_type_id") + private String insuranceTypeId; + + @ApiModelProperty("保险类型") + @TableField("insurance_type") + private String insuranceType; + + @ApiModelProperty("保险单号") + @TableField("insurance_bill_code") + private String insuranceBillCode; + + @ApiModelProperty("生效日期") + @TableField("effective_date") + private LocalDate effectiveDate; + + @ApiModelProperty("到期日期") + @TableField("expire_date") + private LocalDate expireDate; + + @ApiModelProperty("保费") + @TableField("insurance_premium") + private BigDecimal insurancePremium; + + @ApiModelProperty("保额") + @TableField("insurance_amount") + private BigDecimal insuranceAmount; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java new file mode 100644 index 0000000..fad7dc7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java @@ -0,0 +1,44 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:15 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("insurance_type") +@ApiModel(value="InsuranceTypeEntity对象", description="保险类型") +public class InsuranceTypeEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 3027186714895190416L; + + @ApiModelProperty("保险类型id") + @TableId(value = "insurance_type_id", type = IdType.ASSIGN_UUID) + private String insuranceTypeId; + + @ApiModelProperty("保险类型") + @TableField("insurance_type") + private String insuranceType; + + @ApiModelProperty("描述") + @TableField("description") + private String description; + + @ApiModelProperty("删除标志(0代表存在 ,1代表删除)") + @TableField("delFlag") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java new file mode 100644 index 0000000..bdf94f2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:44 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险公司请求实体") +public class InsuranceCompanyReq implements Serializable { + @Serial + private static final long serialVersionUID = -5949181233497299673L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java new file mode 100644 index 0000000..84baf7a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:46 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险公司响应实体") +public class InsuranceCompanyResp implements Serializable { + @Serial + private static final long serialVersionUID = 7275887907802349727L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java new file mode 100644 index 0000000..7981f75 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:44 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险信息查询条件") +public class InsuranceInfoListReq implements Serializable { + @Serial + private static final long serialVersionUID = -47047804822030641L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java new file mode 100644 index 0000000..13d3e0c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:44 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险信息请求实体") +public class InsuranceInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 3352397101804468290L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java new file mode 100644 index 0000000..28ac32a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:46 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险信息响应实体") +public class InsuranceInfoResp implements Serializable { + @Serial + private static final long serialVersionUID = 4703855943894592615L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java new file mode 100644 index 0000000..3e45be8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:44 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险类型请求实体") +public class InsuranceTypeReq implements Serializable { + @Serial + private static final long serialVersionUID = -47047804822030641L; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java new file mode 100644 index 0000000..02ec172 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:46 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险类型响应实体") +public class InsuranceTypeResp implements Serializable { + @Serial + private static final long serialVersionUID = -2745493272695038596L; +} From 1e2432c51e82ed1bf3afd45a6488c2e530b8d143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Thu, 26 Jun 2025 16:18:03 +0800 Subject: [PATCH 071/143] =?UTF-8?q?=E4=BF=9D=E9=99=A9=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E3=80=81=E4=BF=9D=E9=99=A9=E5=85=AC=E5=8F=B8=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E9=99=A9=E4=BF=A1=E6=81=AF=E7=9A=84=E5=A2=9E=E5=88=A0=E6=94=B9?= =?UTF-8?q?=E6=9F=A5=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 6 + .../java/com/dite/znpt/converts/Converts.java | 17 +++ .../domain/entity/InsuranceCompanyEntity.java | 2 +- .../domain/entity/InsuranceInfoEntity.java | 12 +- .../domain/entity/InsuranceTypeEntity.java | 8 +- .../domain/vo/InsuranceCompanyListReq.java | 36 +++++ .../znpt/domain/vo/InsuranceCompanyReq.java | 23 +++ .../znpt/domain/vo/InsuranceCompanyResp.java | 16 ++ .../znpt/domain/vo/InsuranceInfoListReq.java | 17 +++ .../dite/znpt/domain/vo/InsuranceInfoReq.java | 45 ++++++ .../znpt/domain/vo/InsuranceInfoResp.java | 51 +++++++ .../dite/znpt/domain/vo/InsuranceTypeReq.java | 12 ++ .../znpt/domain/vo/InsuranceTypeResp.java | 10 ++ .../dite/znpt/enums/InsuranceStatusEnum.java | 51 +++++++ .../znpt/mapper/InsuranceCompanyMapper.java | 12 ++ .../dite/znpt/mapper/InsuranceInfoMapper.java | 12 ++ .../dite/znpt/mapper/InsuranceTypeMapper.java | 12 ++ .../znpt/service/InsuranceCompanyService.java | 23 +++ .../znpt/service/InsuranceInfoService.java | 23 +++ .../znpt/service/InsuranceTypeService.java | 23 +++ .../impl/InsuranceCompanyServiceImpl.java | 96 ++++++++++++ .../impl/InsuranceInfoServiceImpl.java | 143 ++++++++++++++++++ .../impl/InsuranceTypeServiceImpl.java | 93 ++++++++++++ .../controller/CertificationController.java | 6 +- .../znpt/web/controller/CommonController.java | 44 +++--- .../znpt/web/controller/DefectController.java | 6 +- .../znpt/web/controller/DeptController.java | 8 +- .../znpt/web/controller/ImageController.java | 6 +- .../InsuranceCompanyController.java | 68 +++++++++ .../controller/InsuranceInfoController.java | 66 ++++++++ .../controller/InsuranceTypeController.java | 67 ++++++++ .../znpt/web/controller/MenuController.java | 8 +- .../znpt/web/controller/PartController.java | 8 +- .../znpt/web/controller/PostController.java | 6 +- .../web/controller/ProjectController.java | 8 +- .../znpt/web/controller/RoleController.java | 8 +- .../web/controller/TurbineController.java | 6 +- .../znpt/web/controller/UserController.java | 4 +- .../web/controller/WeatherTypeController.java | 8 +- 39 files changed, 1003 insertions(+), 67 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyListReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/InsuranceStatusEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/InsuranceCompanyMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/InsuranceInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/InsuranceTypeMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/InsuranceCompanyService.java create mode 100644 core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/InsuranceTypeService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/InsuranceCompanyServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/InsuranceTypeServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/InsuranceCompanyController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/InsuranceInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/InsuranceTypeController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index c12a266..c7dd84d 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -39,4 +39,10 @@ public class Message implements Serializable { public static final String CERTIFICATION_TYPE_ILLEGAL = "证书类型不合法"; public static final String CERTIFICATION_CODE_EXIST = "证书编码已存在"; public static final String CERTIFICATION_ID_NOT_EXIST = "证书id不存在"; + public static final String INSURANCE_TYPE_NAME_IS_EXIST = "保险类型名称已存在"; + public static final String INSURANCE_TYPE_ID_IS_NOT_EXIST = "保险类型id不存在"; + public static final String INSURANCE_COMPANY_NAME_IS_EXIST = "保险公司名称已存在"; + public static final String INSURANCE_COMPANY_ID_IS_NOT_EXIST = "保险公司id不存在"; + public static final String INSURANCE_INFO_ID_IS_NOT_EXIST = "保险信息id不存在"; + } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index e9c4a73..5035294 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -71,5 +71,22 @@ public interface Converts { List toCertificationResp(List list); + List toInsuranceTypeResp(List list); + + InsuranceTypeResp toInsuranceTypeResp(InsuranceTypeEntity entity); + + InsuranceTypeEntity toInsuranceTypeEntity(InsuranceTypeReq req); + + List toInsuranceCompanyResp(List list); + + InsuranceCompanyResp toInsuranceCompanyResp(InsuranceCompanyEntity entity); + + InsuranceCompanyEntity toInsuranceCompanyEntity(InsuranceCompanyReq req); + + List toInsuranceInfoResp(List list); + + InsuranceInfoResp toInsuranceInfoResp(InsuranceInfoEntity entity); + + InsuranceInfoEntity toInsuranceInfoEntity(InsuranceInfoReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java index eca57df..dc6fa2e 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceCompanyEntity.java @@ -47,6 +47,6 @@ public class InsuranceCompanyEntity extends AuditableEntity implements Serializa private String status; @ApiModelProperty("删除标志(0代表存在 ,1代表删除)") - @TableField("delFlag") + @TableField("del_flag") private String delFlag; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java index 2042e62..a500e03 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java @@ -57,8 +57,8 @@ public class InsuranceInfoEntity extends AuditableEntity implements Serializable private String insuranceTypeId; @ApiModelProperty("保险类型") - @TableField("insurance_type") - private String insuranceType; + @TableField("insurance_type_name") + private String insuranceTypeName; @ApiModelProperty("保险单号") @TableField("insurance_bill_code") @@ -80,8 +80,16 @@ public class InsuranceInfoEntity extends AuditableEntity implements Serializable @TableField("insurance_amount") private BigDecimal insuranceAmount; + @ApiModelProperty("状态") + @TableField("insurance_status") + private String insuranceStatus; + @ApiModelProperty("备注") @TableField("remark") private String remark; + @ApiModelProperty("删除标志(0代表存在 ,1代表删除)") + @TableField("del_flag") + private String delFlag; + } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java index fad7dc7..18a3151 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceTypeEntity.java @@ -30,15 +30,15 @@ public class InsuranceTypeEntity extends AuditableEntity implements Serializable @TableId(value = "insurance_type_id", type = IdType.ASSIGN_UUID) private String insuranceTypeId; - @ApiModelProperty("保险类型") - @TableField("insurance_type") - private String insuranceType; + @ApiModelProperty("保险类型名称") + @TableField("insurance_type_name") + private String insuranceTypeName; @ApiModelProperty("描述") @TableField("description") private String description; @ApiModelProperty("删除标志(0代表存在 ,1代表删除)") - @TableField("delFlag") + @TableField("del_flag") private String delFlag; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyListReq.java new file mode 100644 index 0000000..1f28d37 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyListReq.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:39 + * @description + */ + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@ApiModel("保险公司列表查询条件") +public class InsuranceCompanyListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -3926269785176954672L; + + @ApiModelProperty("保险公司名称") + private String insuranceCompanyName; + + @ApiModelProperty("联系人") + private String contact; + + @ApiModelProperty("联系人电话") + private String contactPhone; + + @ApiModelProperty("状态,0-合作中,1-终止合作") + private String status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java index bdf94f2..e1bb5b6 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyReq.java @@ -1,9 +1,14 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; @@ -18,4 +23,22 @@ import java.io.Serializable; public class InsuranceCompanyReq implements Serializable { @Serial private static final long serialVersionUID = -5949181233497299673L; + + @NotBlank(message = "保险公司不能为空") + @Size(max = 50, message = "保险公司不能超过50个字符") + @ApiModelProperty("保险公司") + private String insuranceCompanyName; + + @NotBlank(message = "联系人不能为空") + @Size(max = 20, message = "联系人不能超过20个字符") + @ApiModelProperty("联系人") + private String contact; + + @NotBlank(message = "联系电话不能为空") + @Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp ="^$|1\\d{10}$", message = "联系电话格式不正确") + @ApiModelProperty("联系电话") + private String contactPhone; + + @ApiModelProperty("状态,0-合作中,1-终止合作") + private String status; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java index 84baf7a..b005892 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceCompanyResp.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @@ -18,4 +19,19 @@ import java.io.Serializable; public class InsuranceCompanyResp implements Serializable { @Serial private static final long serialVersionUID = 7275887907802349727L; + + @ApiModelProperty("保险公司id") + private String insuranceCompanyId; + + @ApiModelProperty("保险公司名称") + private String insuranceCompanyName; + + @ApiModelProperty("联系人") + private String contact; + + @ApiModelProperty("联系人电话") + private String contactPhone; + + @ApiModelProperty("状态,0-合作中,1-终止合作") + private String status; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java index 7981f75..7d444e5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoListReq.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @@ -18,4 +19,20 @@ import java.io.Serializable; public class InsuranceInfoListReq implements Serializable { @Serial private static final long serialVersionUID = -47047804822030641L; + + @ApiModelProperty("员工姓名") + private String name; + + @ApiModelProperty("员工编号") + private String userCode; + + @ApiModelProperty("保险类型id") + private String insuranceTypeId; + + @ApiModelProperty("保险公司id") + private String insuranceCompanyId; + + @ApiModelProperty("状态,枚举:InsuranceStatusEnum") + private String insuranceStatus; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java index 13d3e0c..1af1c03 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java @@ -1,11 +1,18 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; /** * @Author: gaoxiong @@ -18,4 +25,42 @@ import java.io.Serializable; public class InsuranceInfoReq implements Serializable { @Serial private static final long serialVersionUID = 3352397101804468290L; + + @NotBlank(message = "用户id不能为空") + @ApiModelProperty("用户id") + private String userId; + + @NotBlank(message = "保险类型id不能为空") + @ApiModelProperty("保险类型id") + private String insuranceTypeId; + + @NotBlank(message = "保险公司id不能为空") + @ApiModelProperty("保险公司id") + private String insuranceCompanyId; + + @NotBlank(message = "保单号不能为空") + @ApiModelProperty("保单号") + private String insuranceBillCode; + + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "生效日期不能为空") + @ApiModelProperty("生效日期") + private LocalDate effectiveDate; + + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "失效日期不能为空") + @ApiModelProperty("失效日期") + private LocalDate expireDate; + + @NotNull(message = "保险金额不能为空") + @ApiModelProperty("保险金额,单位元,精确到分") + private BigDecimal insuranceAmount; + + @NotNull(message = "保险保费不能为空") + @ApiModelProperty("保险保费,单位元,精确到分") + private BigDecimal insurancePremium; + + @Size(max = 200, message = "备注不能超过200个字符") + @ApiModelProperty("备注") + private String remark; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java index 28ac32a..85d194d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java @@ -1,11 +1,18 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; /** * @Author: gaoxiong @@ -18,4 +25,48 @@ import java.io.Serializable; public class InsuranceInfoResp implements Serializable { @Serial private static final long serialVersionUID = 4703855943894592615L; + + @ApiModelProperty("保险信息id") + private String insuranceInfoId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("用户姓名") + private String name; + + @ApiModelProperty("用户编码") + private String userCode; + + @ApiModelProperty("保险类型id") + private String insuranceTypeId; + + @ApiModelProperty("保险类型名称") + private String insuranceTypeName; + + @ApiModelProperty("保险公司id") + private String insuranceCompanyId; + + @ApiModelProperty("保险公司名称") + private String insuranceCompanyName; + + @ApiModelProperty("保单号") + private String insuranceBillCode; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("生效日期") + private LocalDate effectiveDate; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("失效日期") + private LocalDate expireDate; + + @ApiModelProperty("保险金额") + private BigDecimal insuranceAmount; + + @ApiModelProperty("保险保费") + private BigDecimal insurancePremium; + + @ApiModelProperty("备注") + private String remarks; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java index 3e45be8..3fe3ee4 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeReq.java @@ -1,9 +1,12 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; @@ -18,4 +21,13 @@ import java.io.Serializable; public class InsuranceTypeReq implements Serializable { @Serial private static final long serialVersionUID = -47047804822030641L; + + @NotBlank(message = "保险类型名称不能为空") + @Size(max = 50, message = "保险类型名称不能超过50个字符") + @ApiModelProperty("保险类型名称") + private String insuranceTypeName; + + @Size(max = 200, message = "描述信息不能超过200个字符") + @ApiModelProperty("描述信息") + private String description; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java index 02ec172..af40c1d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceTypeResp.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @@ -18,4 +19,13 @@ import java.io.Serializable; public class InsuranceTypeResp implements Serializable { @Serial private static final long serialVersionUID = -2745493272695038596L; + + @ApiModelProperty("保险类型id") + private String insuranceTypeId; + + @ApiModelProperty("保险类型名称") + private String insuranceTypeName; + + @ApiModelProperty("描述信息") + private String description; } diff --git a/core/src/main/java/com/dite/znpt/enums/InsuranceStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/InsuranceStatusEnum.java new file mode 100644 index 0000000..092aa9d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/InsuranceStatusEnum.java @@ -0,0 +1,51 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 10:49 + * @description + */ +@Getter +public enum InsuranceStatusEnum { + + EFFECTIVE("EFFECTIVE","有效"), + EXPIRED("EXPIRED","过期"); + + private final String code; + private final String desc; + + InsuranceStatusEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static InsuranceStatusEnum getByCode(String code){ + for (InsuranceStatusEnum e : InsuranceStatusEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + InsuranceStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(InsuranceStatusEnum.values().length); + for (InsuranceStatusEnum e : InsuranceStatusEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/InsuranceCompanyMapper.java b/core/src/main/java/com/dite/znpt/mapper/InsuranceCompanyMapper.java new file mode 100644 index 0000000..90a7c65 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/InsuranceCompanyMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.InsuranceCompanyEntity; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:30 + * @description + */ +public interface InsuranceCompanyMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/InsuranceInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/InsuranceInfoMapper.java new file mode 100644 index 0000000..3736865 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/InsuranceInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.InsuranceInfoEntity; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:29 + * @description + */ +public interface InsuranceInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/InsuranceTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/InsuranceTypeMapper.java new file mode 100644 index 0000000..ff05c98 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/InsuranceTypeMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.InsuranceTypeEntity; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:29 + * @description + */ +public interface InsuranceTypeMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/InsuranceCompanyService.java b/core/src/main/java/com/dite/znpt/service/InsuranceCompanyService.java new file mode 100644 index 0000000..8608e28 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/InsuranceCompanyService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.InsuranceCompanyEntity; +import com.dite.znpt.domain.vo.InsuranceCompanyListReq; +import com.dite.znpt.domain.vo.InsuranceCompanyReq; +import com.dite.znpt.domain.vo.InsuranceCompanyResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:28 + * @description + */ +public interface InsuranceCompanyService extends IService { + List page(InsuranceCompanyListReq req); + List list(InsuranceCompanyListReq req); + InsuranceCompanyResp detail(String insuranceCompanyId); + void save(InsuranceCompanyReq req); + void update(String insuranceCompanyId, InsuranceCompanyReq req); + void deleteById(String insuranceCompanyId); +} diff --git a/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java b/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java new file mode 100644 index 0000000..6e6d8a3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.InsuranceInfoEntity; +import com.dite.znpt.domain.vo.InsuranceInfoListReq; +import com.dite.znpt.domain.vo.InsuranceInfoReq; +import com.dite.znpt.domain.vo.InsuranceInfoResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:28 + * @description + */ +public interface InsuranceInfoService extends IService { + List page(InsuranceInfoListReq req); + List list(InsuranceInfoListReq req); + InsuranceInfoResp detail(String insuranceInfoId); + void save(InsuranceInfoReq req); + void update(String insuranceInfoId, InsuranceInfoReq req); + void deleteById(String insuranceInfoId); +} diff --git a/core/src/main/java/com/dite/znpt/service/InsuranceTypeService.java b/core/src/main/java/com/dite/znpt/service/InsuranceTypeService.java new file mode 100644 index 0000000..25c2bb1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/InsuranceTypeService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.InsuranceTypeEntity; +import com.dite.znpt.domain.vo.InsuranceTypeReq; +import com.dite.znpt.domain.vo.InsuranceTypeResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:28 + * @description + */ +public interface InsuranceTypeService extends IService { + + List page(String insuranceTypeName); + List list(String insuranceTypeName); + InsuranceTypeResp detail(String insuranceTypeId); + void save(InsuranceTypeReq req); + void update(String insuranceTypeId, InsuranceTypeReq req); + void deleteById(String insuranceTypeId); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/InsuranceCompanyServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InsuranceCompanyServiceImpl.java new file mode 100644 index 0000000..b263f39 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/InsuranceCompanyServiceImpl.java @@ -0,0 +1,96 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.InsuranceCompanyEntity; +import com.dite.znpt.domain.vo.InsuranceCompanyListReq; +import com.dite.znpt.domain.vo.InsuranceCompanyReq; +import com.dite.znpt.domain.vo.InsuranceCompanyResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.InsuranceCompanyMapper; +import com.dite.znpt.service.InsuranceCompanyService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:34 + * @description + */ +@Service +public class InsuranceCompanyServiceImpl extends ServiceImpl implements InsuranceCompanyService { + @Override + public List page(InsuranceCompanyListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(InsuranceCompanyListReq req) { + return Converts.INSTANCE.toInsuranceCompanyResp(this.list( + Wrappers.lambdaQuery(InsuranceCompanyEntity.class) + .eq(InsuranceCompanyEntity::getDelFlag, Constants.DEL_FLAG_0) + .like(StrUtil.isNotBlank(req.getInsuranceCompanyName()), InsuranceCompanyEntity::getInsuranceCompanyName, req.getInsuranceCompanyName()) + .like(StrUtil.isNotBlank(req.getContact()), InsuranceCompanyEntity::getContact, req.getContact()) + .like(StrUtil.isNotBlank(req.getContactPhone()), InsuranceCompanyEntity::getContactPhone, req.getContactPhone()) + .eq(StrUtil.isNotBlank(req.getStatus()), InsuranceCompanyEntity::getStatus, req.getStatus()) + )); + } + + @Override + public InsuranceCompanyResp detail(String insuranceCompanyId) { + InsuranceCompanyEntity entity = this.getById(insuranceCompanyId); + if(null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_COMPANY_ID_IS_NOT_EXIST); + } + return Converts.INSTANCE.toInsuranceCompanyResp(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(InsuranceCompanyReq req) { + this.getOneOpt( + Wrappers.lambdaQuery(InsuranceCompanyEntity.class) + .eq(InsuranceCompanyEntity::getDelFlag, Constants.DEL_FLAG_0) + .eq(InsuranceCompanyEntity::getInsuranceCompanyName, req.getInsuranceCompanyName()) + ).ifPresent(insuranceCompany -> {throw new ServiceException(Message.INSURANCE_COMPANY_NAME_IS_EXIST);}); + this.save(Converts.INSTANCE.toInsuranceCompanyEntity(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String insuranceCompanyId, InsuranceCompanyReq req) { + InsuranceCompanyEntity insuranceCompany = this.getById(insuranceCompanyId); + if(null == insuranceCompany || !insuranceCompany.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_COMPANY_ID_IS_NOT_EXIST); + } + if(!req.getInsuranceCompanyName().equals(insuranceCompany.getInsuranceCompanyName())){ + this.getOneOpt( + Wrappers.lambdaQuery(InsuranceCompanyEntity.class) + .eq(InsuranceCompanyEntity::getDelFlag, Constants.DEL_FLAG_0) + .eq(InsuranceCompanyEntity::getInsuranceCompanyName, req.getInsuranceCompanyName()) + ).ifPresent(company -> {throw new ServiceException(Message.INSURANCE_COMPANY_NAME_IS_EXIST);}); + } + InsuranceCompanyEntity entity = Converts.INSTANCE.toInsuranceCompanyEntity(req); + entity.setInsuranceCompanyId(insuranceCompanyId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String insuranceCompanyId) { + InsuranceCompanyEntity entity = this.getById(insuranceCompanyId); + if(null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_COMPANY_ID_IS_NOT_EXIST); + } + entity.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(entity); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java new file mode 100644 index 0000000..b6e689b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java @@ -0,0 +1,143 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.InsuranceCompanyEntity; +import com.dite.znpt.domain.entity.InsuranceInfoEntity; +import com.dite.znpt.domain.entity.InsuranceTypeEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.InsuranceInfoListReq; +import com.dite.znpt.domain.vo.InsuranceInfoReq; +import com.dite.znpt.domain.vo.InsuranceInfoResp; +import com.dite.znpt.enums.InsuranceStatusEnum; +import com.dite.znpt.enums.UserStatusEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.InsuranceInfoMapper; +import com.dite.znpt.service.InsuranceCompanyService; +import com.dite.znpt.service.InsuranceInfoService; +import com.dite.znpt.service.InsuranceTypeService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:32 + * @description + */ +@Service +public class InsuranceInfoServiceImpl extends ServiceImpl implements InsuranceInfoService { + + @Resource + private InsuranceCompanyService insuranceCompanyService; + + @Resource + private InsuranceTypeService insuranceTypeService; + + @Resource + private UserService userService; + + @Override + public List page(InsuranceInfoListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(InsuranceInfoListReq req) { + return Converts.INSTANCE.toInsuranceInfoResp( + this.list(Wrappers.lambdaQuery(InsuranceInfoEntity.class) + .like(StrUtil.isNotBlank(req.getName()), InsuranceInfoEntity::getName, req.getName()) + .like(StrUtil.isNotBlank(req.getUserCode()), InsuranceInfoEntity::getUserCode, req.getUserCode()) + .eq(StrUtil.isNotBlank(req.getInsuranceTypeId()), InsuranceInfoEntity::getInsuranceTypeId, req.getInsuranceCompanyId()) + .eq(StrUtil.isNotBlank(req.getInsuranceCompanyId()), InsuranceInfoEntity::getInsuranceCompanyId, req.getInsuranceCompanyId()) + .eq(StrUtil.isNotBlank(req.getInsuranceStatus()), InsuranceInfoEntity::getInsuranceStatus, req.getInsuranceStatus()) + )); + } + + @Override + public InsuranceInfoResp detail(String insuranceInfoId) { + InsuranceInfoEntity insuranceInfoEntity = this.getById(insuranceInfoId); + if(null == insuranceInfoEntity || !Constants.DEL_FLAG_0.equals(insuranceInfoEntity.getDelFlag())){ + throw new ServiceException(Message.INSURANCE_INFO_ID_IS_NOT_EXIST); + } + return Converts.INSTANCE.toInsuranceInfoResp(insuranceInfoEntity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(InsuranceInfoReq req) { + this.save(validation(Converts.INSTANCE.toInsuranceInfoEntity(req))); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String insuranceInfoId, InsuranceInfoReq req) { + InsuranceInfoEntity insuranceInfoEntity = this.getById(insuranceInfoId); + if(null == insuranceInfoEntity || !Constants.DEL_FLAG_0.equals(insuranceInfoEntity.getDelFlag())){ + throw new ServiceException(Message.INSURANCE_INFO_ID_IS_NOT_EXIST); + } + InsuranceInfoEntity entity = Converts.INSTANCE.toInsuranceInfoEntity(req); + entity.setInsuranceInfoId(insuranceInfoId); + this.updateById(validation(entity)); + } + + + private InsuranceInfoEntity validation(InsuranceInfoEntity entity) { + UserEntity user = userService.getById(entity.getUserId()); + if(null == user || !Constants.STATUS_0.equals(user.getStatus()) + || !Constants.DEL_FLAG_0.equals(user.getDelFlag()) + || !UserStatusEnum.EMPLOYED.getCode().equals(user.getUserStatus())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + entity.setName(user.getName()); + entity.setUserCode(user.getUserCode()); + InsuranceCompanyEntity company = insuranceCompanyService.getById(entity.getInsuranceCompanyId()); + if(null == company ||!Constants.DEL_FLAG_0.equals(company.getDelFlag())){ + throw new ServiceException(Message.INSURANCE_COMPANY_ID_IS_NOT_EXIST); + } + entity.setInsuranceCompanyName(company.getInsuranceCompanyName()); + InsuranceTypeEntity type = insuranceTypeService.getById(entity.getInsuranceTypeId()); + if(null == type || !Constants.DEL_FLAG_0.equals(type.getDelFlag())){ + throw new ServiceException(Message.INSURANCE_TYPE_ID_IS_NOT_EXIST); + } + entity.setInsuranceTypeName(type.getInsuranceTypeName()); + entity.setInsuranceStatus(entity.getExpireDate().isBefore(LocalDate.now()) ? InsuranceStatusEnum.EXPIRED.getCode() : InsuranceStatusEnum.EFFECTIVE.getCode()); + return entity; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String insuranceInfoId) { + InsuranceInfoEntity insuranceInfoEntity = this.getById(insuranceInfoId); + if(null == insuranceInfoEntity || !Constants.DEL_FLAG_0.equals(insuranceInfoEntity.getDelFlag())){ + throw new ServiceException(Message.INSURANCE_INFO_ID_IS_NOT_EXIST); + } + insuranceInfoEntity.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(insuranceInfoEntity); + } + + @Transactional(rollbackFor = Exception.class) + @Scheduled(cron = "0 15 0 * * ?") + public void updateInsuranceStatus(){ + List list = this.list( + Wrappers.lambdaQuery(InsuranceInfoEntity.class) + .eq(InsuranceInfoEntity::getInsuranceStatus, InsuranceStatusEnum.EFFECTIVE.getCode()) + .lt(InsuranceInfoEntity::getExpireDate, LocalDate.now()) + ); + list.forEach(entity -> { + entity.setInsuranceStatus(InsuranceStatusEnum.EXPIRED.getCode()); + }); + this.updateBatchById(list); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/InsuranceTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InsuranceTypeServiceImpl.java new file mode 100644 index 0000000..a1362b9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/InsuranceTypeServiceImpl.java @@ -0,0 +1,93 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.InsuranceTypeEntity; +import com.dite.znpt.domain.vo.InsuranceTypeReq; +import com.dite.znpt.domain.vo.InsuranceTypeResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.InsuranceTypeMapper; +import com.dite.znpt.service.InsuranceTypeService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:32 + * @description + */ +@Service +public class InsuranceTypeServiceImpl extends ServiceImpl implements InsuranceTypeService { + + @Override + public List page(String insuranceTypeName) { + PageUtil.startPage(); + return this.list(insuranceTypeName); + } + + @Override + public List list(String insuranceTypeName) { + return Converts.INSTANCE.toInsuranceTypeResp( + this.list(Wrappers.lambdaQuery(InsuranceTypeEntity.class) + .eq(InsuranceTypeEntity::getDelFlag, Constants.DEL_FLAG_0) + .like(StrUtil.isNotBlank(insuranceTypeName), InsuranceTypeEntity::getInsuranceTypeName, insuranceTypeName)) + ); + } + + @Override + public InsuranceTypeResp detail(String insuranceTypeId) { + InsuranceTypeEntity entity = this.getById(insuranceTypeId); + if(null == entity || !entity.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_TYPE_ID_IS_NOT_EXIST); + } + return Converts.INSTANCE.toInsuranceTypeResp(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(InsuranceTypeReq req) { + this.getOneOpt( + Wrappers.lambdaQuery(InsuranceTypeEntity.class) + .eq(InsuranceTypeEntity::getDelFlag, Constants.DEL_FLAG_0) + .eq(InsuranceTypeEntity::getInsuranceTypeName, req.getInsuranceTypeName()) + ).ifPresent( insuranceTypeEntity -> {throw new ServiceException(Message.INSURANCE_TYPE_NAME_IS_EXIST);}); + this.save(Converts.INSTANCE.toInsuranceTypeEntity(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String insuranceTypeId, InsuranceTypeReq req) { + InsuranceTypeEntity insurance = this.getById(insuranceTypeId); + if(null == insurance || !insurance.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_TYPE_ID_IS_NOT_EXIST); + } + if(!insurance.getInsuranceTypeName().equals(req.getInsuranceTypeName())){ + this.getOneOpt( + Wrappers.lambdaQuery(InsuranceTypeEntity.class) + .eq(InsuranceTypeEntity::getDelFlag, Constants.DEL_FLAG_0) + .eq(InsuranceTypeEntity::getInsuranceTypeName, req.getInsuranceTypeName()) + ).ifPresent( insuranceTypeEntity -> {throw new ServiceException(Message.INSURANCE_TYPE_NAME_IS_EXIST);}); + } + InsuranceTypeEntity entity = Converts.INSTANCE.toInsuranceTypeEntity(req); + entity.setInsuranceTypeId(insuranceTypeId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String insuranceTypeId) { + InsuranceTypeEntity insurance = this.getById(insuranceTypeId); + if(null == insurance || !insurance.getDelFlag().equals(Constants.DEL_FLAG_0)){ + throw new ServiceException(Message.INSURANCE_TYPE_ID_IS_NOT_EXIST); + } + insurance.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(insurance); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java index a64b534..9c32c91 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java @@ -47,21 +47,21 @@ public class CertificationController { @PostMapping @ApiOperation(value = "新增人员资质", httpMethod = "POST") - public Result add(@Validated @RequestBody CertificationReq req){ + public Result add(@Validated @RequestBody CertificationReq req){ certificationService.save(req); return Result.ok(); } @PutMapping("/{certificationId}") @ApiOperation(value = "修改人员资质信息", httpMethod = "PUT") - public Result update(@PathVariable String certificationId, @Validated @RequestBody CertificationReq req){ + public Result update(@PathVariable String certificationId, @Validated @RequestBody CertificationReq req){ certificationService.update(certificationId, req); return Result.ok(); } @DeleteMapping("/{certificationId}") @ApiOperation(value = "删除人员资质信息", httpMethod = "DELETE") - public Result remove(@PathVariable String certificationId){ + public Result remove(@PathVariable String certificationId){ certificationService.deleteById(certificationId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index bdefa42..626cdf2 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -29,85 +29,85 @@ public class CommonController { @ApiOperation(value = "查询缺陷级别", httpMethod = "GET") @GetMapping("/list/defect-level") - public Result listDefectLevel(){ + public Result listDefectLevel(){ return Result.ok(DefectLevelEnum.listAll()); } @ApiOperation(value = "查询缺陷来源", httpMethod = "GET") @GetMapping("/list/defect-source") - public Result listDefectSource(){ + public Result listDefectSource(){ return Result.ok(DefectSourceEnum.listAll()); } @ApiOperation(value = "查询缺陷类型", httpMethod = "GET") @GetMapping("/list/defect-type") - public Result listDefectType(){ + public Result listDefectType(){ return Result.ok(DefectTypeEnum.listAll()); } @ApiOperation(value = "查询图像类型", httpMethod = "GET") @GetMapping("/list/image-type") - public Result listImageType(){ + public Result listImageType(){ return Result.ok(ImageTypeEnum.listAll()); } @ApiOperation(value = "查询项目状态", httpMethod = "GET") @GetMapping("/list/project-status") - public Result listProjectStatus(){ + public Result listProjectStatus(){ return Result.ok(ProjectStatusEnum.listAll()); } @ApiOperation(value = "查询项目工作岗位", httpMethod = "GET") @GetMapping("/list/project-work-job/{projectWorkType}") - public Result listProjectWorkJob(@PathVariable String projectWorkType){ + public Result listProjectWorkJob(@PathVariable String projectWorkType){ return Result.ok(ProjectWorkJobEnum.listByWorkType(projectWorkType)); } @ApiOperation(value = "查询项目工作类型", httpMethod = "GET") @GetMapping("/list/project-work-type") - public Result listProjectWorkType(){ + public Result listProjectWorkType(){ return Result.ok(ProjectWorkTypeEnum.listAll()); } @ApiOperation(value = "查询维修状态", httpMethod = "GET") @GetMapping("/list/repair-status") - public Result listRepairStatus(){ + public Result listRepairStatus(){ return Result.ok(RepairStatusEnum.listAll()); } @ApiOperation(value = "查询拍摄方式", httpMethod = "GET") @GetMapping("/list/shooting-method") - public Result listShootingMethod(){ + public Result listShootingMethod(){ return Result.ok(ShootingMethodEnum.listAll()); } @ApiOperation(value = "查询天气", httpMethod = "GET") @GetMapping("/list/weather") - public Result listWeather(){ + public Result listWeather(){ return Result.ok(WeatherEnum.listAll()); } @ApiOperation(value = "查询通用图片来源", httpMethod = "GET") @GetMapping("/list/common-image-source") - public Result listCommonImageSource(){ + public Result listCommonImageSource(){ return Result.ok(ImageSourceEnum.list(Boolean.FALSE)); } @ApiOperation(value = "查询学历", httpMethod = "GET") @GetMapping("/list/education") - public Result listEducation(){ + public Result listEducation(){ return Result.ok(EducationEnum.listAll()); } @ApiOperation(value = "查询性别", httpMethod = "GET") @GetMapping("/list/gender") - public Result listGender(){ + public Result listGender(){ return Result.ok(GenderEnum.listAll()); } @ApiOperation(value = "上传图片", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") - public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, MultipartFile file) throws IOException { + public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, MultipartFile file) throws IOException { if(null == file){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } @@ -116,34 +116,40 @@ public class CommonController { @ApiOperation(value = "批量上传图片", httpMethod = "POST") @PostMapping("/batch-upload-image/{imageSource}") - public Result batchUploadImage(@PathVariable String imageSource, ImageWorkReq workReq, + public Result batchUploadImage(@PathVariable String imageSource, ImageWorkReq workReq, @RequestParam("file") MultipartFile[] files) throws IOException { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } @ApiOperation(value = "查询菜单类型", httpMethod = "GET") @GetMapping("/list/menu-type") - public Result listMenuType(){ + public Result listMenuType(){ return Result.ok(MenuTypeEnum.listAll()); } @ApiOperation(value = "查询终端类型", httpMethod = "GET") @GetMapping("/list/terminal-type") - public Result listTerminalType(){ + public Result listTerminalType(){ return Result.ok(TerminalTypeEnum.listAll()); } @ApiOperation(value = "查询在职状态", httpMethod = "GET") @GetMapping("/list/user_status") - public Result listUserStatus(){ + public Result listUserStatus(){ return Result.ok(UserStatusEnum.listAll()); } @ApiOperation(value = "查询员工性质", httpMethod = "GET") @GetMapping("/list/user_type") - public Result listUserType(){ + public Result listUserType(){ return Result.ok(UserTypeEnum.listAll()); } + @ApiOperation(value = "查询保险状态", httpMethod = "GET") + @GetMapping("/list/insurance_status") + public Result listInsuranceStatus(){ + return Result.ok(InsuranceStatusEnum.listAll()); + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 8dfc7de..b614855 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -51,21 +51,21 @@ public class DefectController { @ApiOperation(value = "新增缺陷记录", httpMethod = "POST") @PostMapping("/{imageId}") - public Result save(@PathVariable String imageId, @RequestBody DefectReq req) { + public Result save(@PathVariable String imageId, @RequestBody DefectReq req) { defectService.save(imageId, req); return Result.ok(); } @ApiOperation(value = "修改缺陷记录", httpMethod = "PUT") @PutMapping("/{defectId}") - public Result edit(@PathVariable String defectId, @RequestBody DefectReq req) { + public Result edit(@PathVariable String defectId, @RequestBody DefectReq req) { defectService.update(defectId, req); return Result.ok(); } @ApiOperation(value = "删除缺陷记录", httpMethod = "DELETE") @DeleteMapping("/{defectId}") - public Result remove(@PathVariable String defectId) { + public Result remove(@PathVariable String defectId) { defectService.deleteById(defectId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java index 64bad82..811570a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java @@ -29,7 +29,7 @@ public class DeptController { @ApiOperation(value = "查询部门树", httpMethod = "GET") @GetMapping("/tree") - public Result tree (@RequestParam(name = "deptName", required = false) String deptName) { + public Result tree (@RequestParam(name = "deptName", required = false) String deptName) { return Result.ok(deptService.tree(deptName)); } @@ -41,21 +41,21 @@ public class DeptController { @ApiOperation(value = "新增部门信息", httpMethod = "POST") @PostMapping - public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { deptService.save(req); return Result.ok(); } @ApiOperation(value = "修改部门信息", httpMethod = "PUT") @PutMapping("/{deptId}") - public Result edit(@PathVariable String deptId, @Validated(ValidationGroup.Update.class) @RequestBody DeptReq req) { + public Result edit(@PathVariable String deptId, @Validated(ValidationGroup.Update.class) @RequestBody DeptReq req) { deptService.update(deptId, req); return Result.ok(); } @ApiOperation(value = "删除部门信息", httpMethod = "DELETE") @DeleteMapping("/{deptId}") - public Result remove(@PathVariable String deptId) { + public Result remove(@PathVariable String deptId) { deptService.deleteById(deptId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 07a21f6..e81565f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -66,14 +66,14 @@ public class ImageController { @ApiOperation(value = "设置信息", httpMethod = "POST") @PostMapping("/setting-info/{partId}") - public Result save(@PathVariable String partId, @RequestBody ImageCollectReq req) { + public Result save(@PathVariable String partId, @RequestBody ImageCollectReq req) { imageCollectService.save(partId, req); return Result.ok(); } @ApiOperation(value = "删除图像", httpMethod = "DELETE") @DeleteMapping("/{imageId}") - public Result remove(@PathVariable String imageId){ + public Result remove(@PathVariable String imageId){ imageService.delete(imageId); return Result.ok(); } @@ -86,7 +86,7 @@ public class ImageController { @ApiOperation(value = "关联APP上传图片到机组", httpMethod = "POST") @PostMapping("/linkAppImagesToPart") - public Result linkAppImagesToPart(@RequestBody AppImageToPartReq partReq) { + public Result linkAppImagesToPart(@RequestBody AppImageToPartReq partReq) { imageService.linkAppImagesToPart(partReq); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/InsuranceCompanyController.java b/web/src/main/java/com/dite/znpt/web/controller/InsuranceCompanyController.java new file mode 100644 index 0000000..7f6e4d5 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/InsuranceCompanyController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.InsuranceCompanyListReq; +import com.dite.znpt.domain.vo.InsuranceCompanyReq; +import com.dite.znpt.domain.vo.InsuranceCompanyResp; +import com.dite.znpt.service.InsuranceCompanyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:10 + * @description + */ +@Api(tags = "保险公司信息") +@RestController +@RequestMapping("/insurance-company") +public class InsuranceCompanyController { + + @Resource + private InsuranceCompanyService insuranceCompanyService; + + @ApiOperation(value = "分页查询保险公司信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(InsuranceCompanyListReq req) { + return PageResult.ok(insuranceCompanyService.page(req)); + } + + @ApiOperation(value = "查询保险公司信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(InsuranceCompanyListReq req) { + return Result.ok(insuranceCompanyService.list(req)); + } + + @ApiOperation(value = "查询保险公司信息详情", httpMethod = "GET") + @GetMapping("/detail/{insuranceCompanyId}") + public Result detail(@PathVariable String insuranceCompanyId) { + return Result.ok(insuranceCompanyService.detail(insuranceCompanyId)); + } + + @ApiOperation(value = "新增保险公司信息", httpMethod = "POST") + @PostMapping + public Result add(@Valid @RequestBody InsuranceCompanyReq req) { + insuranceCompanyService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改保险公司信息", httpMethod = "POST") + @PutMapping("/{insuranceCompanyId}") + public Result edit(@PathVariable String insuranceCompanyId, @Valid @RequestBody InsuranceCompanyReq req) { + insuranceCompanyService.update(insuranceCompanyId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除保险公司信息", httpMethod = "DELETE") + @DeleteMapping("/{insuranceCompanyId}") + public Result remove(@PathVariable String insuranceCompanyId) { + insuranceCompanyService.deleteById(insuranceCompanyId); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/InsuranceInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/InsuranceInfoController.java new file mode 100644 index 0000000..2c53a8b --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/InsuranceInfoController.java @@ -0,0 +1,66 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.service.InsuranceInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:09 + * @description + */ +@Api(tags = "保险信息") +@RestController +@RequestMapping("/insurance-info") +public class InsuranceInfoController { + + @Resource + private InsuranceInfoService insuranceInfoService; + + @ApiOperation(value = "分页查询保险信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(InsuranceInfoListReq req) { + return PageResult.ok(insuranceInfoService.page(req)); + } + + @ApiOperation(value = "查询保险信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(InsuranceInfoListReq req) { + return Result.ok(insuranceInfoService.list(req)); + } + + @ApiOperation(value = "查询保险信息详情", httpMethod = "GET") + @GetMapping("/detail/{insuranceInfoId}") + public Result detail(@PathVariable String insuranceInfoId) { + return Result.ok(insuranceInfoService.detail(insuranceInfoId)); + } + + @ApiOperation(value = "新增保险信息", httpMethod = "POST") + @PostMapping + public Result add(@Valid @RequestBody InsuranceInfoReq req) { + insuranceInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改保险信息", httpMethod = "POST") + @PutMapping("/{insuranceInfoId}") + public Result edit(@PathVariable String insuranceInfoId, @Valid @RequestBody InsuranceInfoReq req) { + insuranceInfoService.update(insuranceInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除保险信息", httpMethod = "DELETE") + @DeleteMapping("/{insuranceInfoId}") + public Result remove(@PathVariable String insuranceInfoId) { + insuranceInfoService.deleteById(insuranceInfoId); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/InsuranceTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/InsuranceTypeController.java new file mode 100644 index 0000000..b42189c --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/InsuranceTypeController.java @@ -0,0 +1,67 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.InsuranceTypeReq; +import com.dite.znpt.domain.vo.InsuranceTypeResp; +import com.dite.znpt.service.InsuranceTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/26/周四 9:10 + * @description + */ +@Api(tags = "保险类型类型") +@RestController +@RequestMapping("/insurance-type") +public class InsuranceTypeController { + + @Resource + private InsuranceTypeService insuranceTypeService; + + @ApiOperation(value = "分页查询保险类型列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(required = false) String insuranceTypeName) { + return PageResult.ok(insuranceTypeService.page(insuranceTypeName)); + } + + @ApiOperation(value = "查询保险类型列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestParam(required = false) String insuranceTypeName) { + return Result.ok(insuranceTypeService.list(insuranceTypeName)); + } + + @ApiOperation(value = "查询保险类型详情", httpMethod = "GET") + @GetMapping("/detail/{insuranceTypeId}") + public Result detail(@PathVariable String insuranceTypeId) { + return Result.ok(insuranceTypeService.detail(insuranceTypeId)); + } + + @ApiOperation(value = "新增保险类型", httpMethod = "POST") + @PostMapping + public Result add(@Valid @RequestBody InsuranceTypeReq req) { + insuranceTypeService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改保险类型", httpMethod = "POST") + @PutMapping("/{insuranceTypeId}") + public Result edit(@PathVariable String insuranceTypeId, @Valid @RequestBody InsuranceTypeReq req) { + insuranceTypeService.update(insuranceTypeId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除保险类型", httpMethod = "DELETE") + @DeleteMapping("/{insuranceTypeId}") + public Result remove(@PathVariable String insuranceTypeId) { + insuranceTypeService.deleteById(insuranceTypeId); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/MenuController.java b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java index 2f651f7..21d9dba 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/MenuController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/MenuController.java @@ -25,7 +25,7 @@ public class MenuController { @ApiOperation(value = "查询菜单树", httpMethod = "GET") @GetMapping("/tree") - public Result tree (@RequestParam(name = "menuName", required = false) String menuName, @RequestParam(defaultValue = "PC") String terminalType) { + public Result tree (@RequestParam(name = "menuName", required = false) String menuName, @RequestParam(defaultValue = "PC") String terminalType) { return Result.ok(menuService.tree(menuName, terminalType)); } @@ -37,21 +37,21 @@ public class MenuController { @ApiOperation(value = "新增菜单", httpMethod = "POST") @PostMapping - public Result add(@RequestBody MenuReq req) { + public Result add(@RequestBody MenuReq req) { menuService.save(req); return Result.ok(); } @ApiOperation(value = "修改菜单", httpMethod = "PUT") @PutMapping("/{menuId}") - public Result update(@PathVariable String menuId, @RequestBody MenuReq req) { + public Result update(@PathVariable String menuId, @RequestBody MenuReq req) { menuService.update(menuId, req); return Result.ok(); } @ApiOperation(value = "删除菜单", httpMethod = "DELETE") @DeleteMapping("/{menuId}") - public Result delete(@PathVariable String menuId) { + public Result delete(@PathVariable String menuId) { menuService.deleteById(menuId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/PartController.java b/web/src/main/java/com/dite/znpt/web/controller/PartController.java index d1ff22a..dc83174 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PartController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PartController.java @@ -54,21 +54,21 @@ public class PartController { @ApiOperation(value = "新增部件信息", httpMethod = "POST") @PostMapping - public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PartReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PartReq req) { partService.save(req); return Result.ok(); } @ApiOperation(value = "修改部件信息", httpMethod = "PUT") @PutMapping("/{partId}") - public Result edit(@Validated(ValidationGroup.Update.class) @PathVariable String partId, @RequestBody PartReq req) { + public Result edit(@Validated(ValidationGroup.Update.class) @PathVariable String partId, @RequestBody PartReq req) { partService.update(partId, req); return Result.ok(); } @ApiOperation(value = "删除部件信息", httpMethod = "DELETE") @DeleteMapping("/{partId}") - public Result remove(@PathVariable String partId) { + public Result remove(@PathVariable String partId) { partService.deleteById(partId); return Result.ok(); } @@ -82,7 +82,7 @@ public class PartController { @ApiOperation(value = "导入部件-需求待明确", httpMethod = "POST") @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); if (errorMessageList != null && !errorMessageList.isEmpty()) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/PostController.java b/web/src/main/java/com/dite/znpt/web/controller/PostController.java index c1e8ac1..840addf 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PostController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PostController.java @@ -46,21 +46,21 @@ public class PostController { @ApiOperation(value = "新增岗位信息", httpMethod = "POST") @PostMapping - public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PostReq req){ + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody PostReq req){ postService.save(req); return Result.ok(); } @ApiOperation(value = "修改岗位信息", httpMethod = "PUT") @PutMapping("/{postId}") - public Result edit(@PathVariable String postId, @Validated(ValidationGroup.Update.class) @RequestBody PostReq req){ + public Result edit(@PathVariable String postId, @Validated(ValidationGroup.Update.class) @RequestBody PostReq req){ postService.update(postId, req); return Result.ok(); } @ApiOperation(value = "删除岗位信息", httpMethod = "DELETE") @DeleteMapping("/{postId}") - public Result remove(@PathVariable String postId){ + public Result remove(@PathVariable String postId){ postService.deleteById(postId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java index 5c7e11c..b9068cc 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java @@ -54,21 +54,21 @@ public class ProjectController { @ApiOperation(value = "新增项目信息", httpMethod = "POST") @PostMapping - public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectReq req) { + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectReq req) { projectService.save(req); return Result.ok(); } @ApiOperation(value = "修改项目信息", httpMethod = "PUT") @PutMapping("/{projectId}") - public Result edit(@PathVariable String projectId, @Validated(ValidationGroup.Update.class) @RequestBody ProjectReq req) { + public Result edit(@PathVariable String projectId, @Validated(ValidationGroup.Update.class) @RequestBody ProjectReq req) { projectService.update(projectId, req); return Result.ok(); } @ApiOperation(value = "删除项目信息", httpMethod = "DELETE") @DeleteMapping("/{projectId}") - public Result remove(@PathVariable String projectId) { + public Result remove(@PathVariable String projectId) { projectService.deleteById(projectId); return Result.ok(); } @@ -82,7 +82,7 @@ public class ProjectController { @ApiOperation(value = "导入项目信息-需求待明确", httpMethod = "POST") @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); if (errorMessageList != null && !errorMessageList.isEmpty()) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/RoleController.java b/web/src/main/java/com/dite/znpt/web/controller/RoleController.java index 866a0f3..3be61d0 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RoleController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RoleController.java @@ -54,28 +54,28 @@ public class RoleController { @ApiOperation(value = "新增角色信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody RoleReq req){ + public Result add(@RequestBody RoleReq req){ roleService.save(req); return Result.ok(); } @ApiOperation(value = "修改角色信息", httpMethod = "PUT") @PutMapping("/{roleId}") - public Result edit(@PathVariable String roleId, @RequestBody RoleReq req){ + public Result edit(@PathVariable String roleId, @RequestBody RoleReq req){ roleService.update(roleId, req); return Result.ok(); } @ApiOperation(value = "删除角色信息", httpMethod = "DELETE") @DeleteMapping("/{roleId}") - public Result delete(@PathVariable String roleId){ + public Result delete(@PathVariable String roleId){ roleService.deleteById(roleId); return Result.ok(); } @ApiOperation(value = "绑定菜单", httpMethod = "PUT") @PutMapping("/bind-menu") - public Result bindMenu(@Validated @RequestBody RoleMenuReq req){ + public Result bindMenu(@Validated @RequestBody RoleMenuReq req){ roleMenuService.bindRoleMenu(req); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java index 9113e0c..13f267f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TurbineController.java @@ -70,14 +70,14 @@ public class TurbineController { @ApiOperation(value = "修改机组", httpMethod = "PUT") @PutMapping("/{turbineId}") - public Result edit(@PathVariable String turbineId, @Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) { + public Result edit(@PathVariable String turbineId, @Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) { turbineService.update(turbineId, req); return Result.ok(); } @ApiOperation(value = "删除机组", httpMethod = "DELETE") @DeleteMapping("/{turbineId}") - public Result remove(@PathVariable String turbineId) { + public Result remove(@PathVariable String turbineId) { turbineService.deleteById(turbineId); return Result.ok(); } @@ -91,7 +91,7 @@ public class TurbineController { @ApiOperation(value = "导入机组-需求待明确", httpMethod = "POST") @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); if (errorMessageList != null && !errorMessageList.isEmpty()) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/UserController.java b/web/src/main/java/com/dite/znpt/web/controller/UserController.java index 1ba33e6..b23c209 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/UserController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/UserController.java @@ -62,14 +62,14 @@ public class UserController { @ApiOperation(value = "绑定角色", httpMethod = "PUT") @PutMapping("/bind-role") - public Result bindRole(@Validated @RequestBody UserRoleReq req){ + public Result bindRole(@Validated @RequestBody UserRoleReq req){ userRoleService.bindUserRole(req); return Result.ok(); } @ApiOperation(value = "删除用户信息", httpMethod = "DELETE") @DeleteMapping("/{userId}") - public Result remove(@PathVariable String userId) { + public Result remove(@PathVariable String userId) { userService.deleteById(userId); return Result.ok(); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java index 2d13873..c36e6f0 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/WeatherTypeController.java @@ -44,21 +44,21 @@ public class WeatherTypeController { @ApiOperation(value = "新增天气类型", httpMethod = "POST") @PostMapping - public Result add(@RequestBody WeatherTypeEntity weatherType) { + public Result add(@RequestBody WeatherTypeEntity weatherType) { weatherTypeService.saveData(weatherType); return Result.ok(); } @ApiOperation(value = "修改天气类型", httpMethod = "PUT") @PutMapping - public Result edit(@RequestBody WeatherTypeEntity weatherType) { + public Result edit(@RequestBody WeatherTypeEntity weatherType) { weatherTypeService.updateData(weatherType); return Result.ok(); } @ApiOperation(value = "删除天气类型", httpMethod = "DELETE") @DeleteMapping("/{weatherCode}") - public Result remove(@PathVariable String weatherCode) { + public Result remove(@PathVariable String weatherCode) { weatherTypeService.deleteById(weatherCode); return Result.ok(); } @@ -72,7 +72,7 @@ public class WeatherTypeController { @ApiOperation(value = "导入天气类型", httpMethod = "POST") @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { // JSR 303 校验通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); if (errorMessageList != null && !errorMessageList.isEmpty()) { From 87af4928eed7aa6f43caab6ef0a3d8f49b9ec5ca Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 27 Jun 2025 15:16:07 +0800 Subject: [PATCH 072/143] =?UTF-8?q?1.=E5=8E=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=202.=E9=A1=B9=E7=9B=AE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=BB=84=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91=203.=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BB=BB=E5=8A=A1=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 29 +- .../java/com/dite/znpt/constant/Message.java | 5 + .../java/com/dite/znpt/domain/Result.java | 6 +- .../znpt/domain/entity/AttachInfoEntity.java | 46 +++ .../znpt/domain/entity/FileInfoEntity.java | 46 --- .../znpt/domain/entity/ProjectEntity.java | 17 ++ .../znpt/domain/entity/ProjectTaskEntity.java | 85 ++++++ .../domain/entity/ProjectTaskGroupEntity.java | 37 +++ .../dite/znpt/domain/vo/AttachInfoReq.java | 36 +++ .../dite/znpt/domain/vo/FileInfoListReq.java | 36 --- .../com/dite/znpt/domain/vo/FileInfoResp.java | 18 -- .../dite/znpt/domain/vo/ProjectListReq.java | 10 +- .../dite/znpt/domain/vo/ProjectListResp.java | 8 +- .../com/dite/znpt/domain/vo/ProjectReq.java | 32 +-- .../com/dite/znpt/domain/vo/ProjectResp.java | 5 +- .../domain/vo/ProjectTaskGroupListReq.java | 33 +++ .../znpt/domain/vo/ProjectTaskGroupReq.java | 38 +++ .../znpt/domain/vo/ProjectTaskGroupResp.java | 25 ++ .../znpt/domain/vo/ProjectTaskImportReq.java | 71 +++++ .../znpt/domain/vo/ProjectTaskListReq.java | 69 +++++ .../dite/znpt/domain/vo/ProjectTaskReq.java | 84 ++++++ .../dite/znpt/domain/vo/ProjectTaskResp.java | 27 ++ .../znpt/domain/vo/ProjectTaskStartReq.java | 37 +++ .../com/dite/znpt/enums/FilePathEnum.java | 1 + .../dite/znpt/enums/ProjectTaskStateEnum.java | 48 ++++ .../com/dite/znpt/mapper/FileInfoMapper.java | 12 +- .../znpt/mapper/ProjectTaskGroupMapper.java | 19 ++ .../dite/znpt/mapper/ProjectTaskMapper.java | 21 ++ .../dite/znpt/service/AttachInfoService.java | 50 ++++ .../dite/znpt/service/FileInfoService.java | 64 ----- .../znpt/service/ProjectTaskGroupService.java | 55 ++++ .../dite/znpt/service/ProjectTaskService.java | 93 ++++++ .../service/impl/AttachInfoServiceImpl.java | 105 +++++++ .../service/impl/FileInfoServiceImpl.java | 99 ------- .../impl/ProjectTaskGroupServiceImpl.java | 95 +++++++ .../service/impl/ProjectTaskServiceImpl.java | 265 ++++++++++++++++++ .../main/resources/mapper/FileInfoMapper.xml | 32 --- .../main/resources/mapper/ProjectMapper.xml | 11 +- .../mapper/ProjectTaskGroupMapper.xml | 24 ++ .../resources/mapper/ProjectTaskMapper.xml | 77 +++++ pom.xml | 2 +- .../web/controller/AttachInfoController.java | 37 +++ .../web/controller/FileInfoController.java | 84 ------ .../web/controller/ProjectTaskController.java | 101 +++++++ .../ProjectTaskGroupController.java | 63 +++++ 45 files changed, 1702 insertions(+), 456 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/AttachInfoService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/FileInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectTaskService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java delete mode 100644 core/src/main/resources/mapper/FileInfoMapper.xml create mode 100644 core/src/main/resources/mapper/ProjectTaskGroupMapper.xml create mode 100644 core/src/main/resources/mapper/ProjectTaskMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectTaskGroupController.java diff --git a/core/pom.xml b/core/pom.xml index a5536ed..b90f9ba 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -78,19 +78,6 @@ 3.0.3 - - - com.baomidou - mybatis-plus-generator - 3.5.11 - - - - org.apache.velocity - velocity-engine-core - 2.3 - - com.alibaba @@ -103,12 +90,6 @@ spring-jdbc - - - org.freemarker - freemarker - - org.springframework spring-tx @@ -137,7 +118,7 @@ org.redisson redisson - 3.16.0 + 3.22.0 @@ -149,7 +130,7 @@ com.drewnoakes metadata-extractor - 2.15.0 + 2.18.0 @@ -168,12 +149,6 @@ 1.3.0-91 compile - - javax.sip - jain-sip-ri - 1.3.0-91 - compile - diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index c12a266..9ac0cda 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -39,4 +39,9 @@ public class Message implements Serializable { public static final String CERTIFICATION_TYPE_ILLEGAL = "证书类型不合法"; public static final String CERTIFICATION_CODE_EXIST = "证书编码已存在"; public static final String CERTIFICATION_ID_NOT_EXIST = "证书id不存在"; + public static final String TASK_ID_GROUP_ID_ALL_EMPTY = "任务id和任务组id不可同时为空"; + public static final String TASK_STATUS_NOT_PENDING = "任务状态不是未开始"; + public static final String TASK_STATUS_NOT_IN_PROGRESS = "任务状态不是进行中"; + public static final String TASK_IN_CYCLE = "父级任务存在循环依赖:"; + public static final String TASK_GROUP_ID_NOT_EXIST = "任务组id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/domain/Result.java b/core/src/main/java/com/dite/znpt/domain/Result.java index f893e22..9228b34 100644 --- a/core/src/main/java/com/dite/znpt/domain/Result.java +++ b/core/src/main/java/com/dite/znpt/domain/Result.java @@ -70,7 +70,11 @@ public class Result implements Serializable { } public static Result error(String code, String msg) { - return new Result(HttpStatus.INTERNAL_SERVER_ERROR, null, Integer.parseInt(code), msg); + return error(code, msg, null); + } + + public static Result error(String code, String msg, T data) { + return new Result(HttpStatus.INTERNAL_SERVER_ERROR, data, Integer.parseInt(code), msg); } } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java new file mode 100644 index 0000000..38abca2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.entity; + +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +/** + * @author huise23 + * @date 2025/06/27 10:10 + * @Description: 附件信息表实体类 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +@TableName("attach_info") +@ApiModel(value="AttachInfoEntity对象", description="附件信息表") +public class AttachInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -70522903124405433L; + + @ApiModelProperty("附件id") + @TableId(value = "attach_id", type = IdType.ASSIGN_ID) + private String attachId; + + @ApiModelProperty("业务id") + @TableField("business_id") + private String businessId; + + @ApiModelProperty("附件路径") + @TableField("attach_path") + private String attachPath; + + @ApiModelProperty("业务类型,字典attach_business_type") + @TableField("business_type") + private String businessType; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java deleted file mode 100644 index fb1aa27..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/FileInfoEntity.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dite.znpt.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 文件信息表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("file_info") -@ApiModel(value="FileInfoEntity对象", description="文件信息表") -public class FileInfoEntity extends AuditableEntity implements Serializable { - - private static final long serialVersionUID = -14287111699285655L; - - @ExcelProperty("文件id") - @ApiModelProperty("文件id") - @TableId(value = "file_id", type = IdType.ASSIGN_UUID) - private Long fileId; - - @ExcelProperty("业务id") - @ApiModelProperty("业务id") - @TableField("business_id") - private String businessId; - - @ExcelProperty("minio相对路径") - @ApiModelProperty("minio相对路径") - @TableField("minio_path") - private String minioPath; - - @ExcelProperty("业务类型,字典file_business_type") - @ApiModelProperty("业务类型,字典file_business_type") - @TableField("business_type") - private String businessType; -} - diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index b92e0bf..df8ec34 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -1,9 +1,12 @@ package com.dite.znpt.domain.entity; import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import com.dite.znpt.domain.AuditableEntity; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -105,23 +108,28 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty("技术方案图片,多个用逗号隔开") @JsonIgnore @TableField("technical_image") + @Deprecated private String technicalImage; @ApiModelProperty("技术方案内容") @TableField("technical_content") + @Deprecated private String technicalContent; @ApiModelProperty("安全措施图片,多个用逗号隔开") @JsonIgnore @TableField("safety_image") + @Deprecated private String safetyImage; @ApiModelProperty("安全措施内容") @TableField("safety_content") + @Deprecated private String safetyContent; @ApiModelProperty("交底内容") @TableField("disclose_content") + @Deprecated private String discloseContent; @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") @@ -130,14 +138,23 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty("项目工作类型 可能有多项,逗号分隔") @TableField("work_type") + @Deprecated private String workType; @ApiModelProperty("项目工作岗位 可能有多项,json对象保存") @TableField("job") + @Deprecated private String job; @ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔") @TableField("safety_risk_point") + @Deprecated private String safetyRiskPoint; + + @ApiModelProperty(value = "开始时间") + private LocalDate startDate; + + @ApiModelProperty(value = "结束时间") + private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java new file mode 100644 index 0000000..3c3560d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java @@ -0,0 +1,85 @@ +package com.dite.znpt.domain.entity; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/06/25 21:48 + * @Description: 项目任务信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_task") +@ApiModel(value="ProjectTaskEntity对象", description="项目任务信息表") +public class ProjectTaskEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 445818156838153502L; + + @ApiModelProperty("任务id") + @TableId(value = "task_id", type = IdType.ASSIGN_ID) + private String taskId; + + @ApiModelProperty("上级任务id") + @TableField("parent_task_id") + private String parentTaskId; + + @ApiModelProperty("任务组id") + @TableField("task_group_id") + private String taskGroupId; + + @ApiModelProperty("项目任务名称") + @TableField("task_name") + private String taskName; + + @ApiModelProperty("项目任务编号") + @TableField("task_code") + private String taskCode; + + @ApiModelProperty("任务负责人id") + @TableField("main_user_id") + private String mainUserId; + + @ApiModelProperty("任务参与人id,逗号分隔") + @TableField("user_ids") + private String userIds; + + @ApiModelProperty("计划开始时间") + @TableField("plan_start_date") + private LocalDate planStartDate; + + @ApiModelProperty("计划结束时间") + @TableField("plan_end_date") + private LocalDate planEndDate; + + @ApiModelProperty("实际开始时间") + @TableField("actual_start_date") + private LocalDate actualStartDate; + + @ApiModelProperty("实际结束时间") + @TableField("actual_end_date") + private LocalDate actualEndDate; + + @ApiModelProperty("任务状态,0未开始,1进行中,2已结束") + @TableField("status") + private Integer status; + + @ApiModelProperty("是否逾期,默认未逾期") + @TableField("overdue_status") + private Integer overdueStatus; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java new file mode 100644 index 0000000..15f38a0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.entity; + +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/06/24 17:06 + * @Description: 项目任务组信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_task_group") +@ApiModel(value="ProjectTaskGroupEntity对象", description="项目任务组信息表") +public class ProjectTaskGroupEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -86904406809616523L; + + @ApiModelProperty("id") + @TableId(value = "group_id", type = IdType.ASSIGN_ID) + private String groupId; + + @ApiModelProperty("项目任务组名") + @TableField("group_name") + private String groupName; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java new file mode 100644 index 0000000..026d7e0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/06/25 21:59 + * @Description: 附件信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="AttachInfo请求对象", description="附件信息表") +public class AttachInfoReq implements Serializable { + + @Serial + private static final long serialVersionUID = -59837569061686176L; + + @ApiModelProperty("附件id") + private Long attachId; + + @ApiModelProperty("业务id") + private String businessId; + + @ApiModelProperty("请求路径") + private String attachPath; + + @ApiModelProperty("业务类型,字典attach_business_type") + private String businessType; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java deleted file mode 100644 index eef330e..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoListReq.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dite.znpt.domain.vo; - -import java.io.Serializable; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 文件信息请求实体 - */ -@Data -@ApiModel("文件信息列表请求实体") -public class FileInfoListReq implements Serializable { - - private static final long serialVersionUID = 574018420246881535L; - - @ApiModelProperty("查询关键字") - private String keyword; - - @ApiModelProperty("文件信息Id") - private Long fileId; - - @ApiModelProperty("业务id") - private String businessId; - - @ApiModelProperty("minio相对路径") - private String minioPath; - - @ApiModelProperty("业务类型,字典file_business_type") - private String businessType; - -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java deleted file mode 100644 index b01b426..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/FileInfoResp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.FileInfoEntity; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 文件信息响应实体 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("文件信息响应实体") -public class FileInfoResp extends FileInfoEntity { -} - diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java index 46ad94b..42f55e5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -35,13 +35,11 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("项目状态,枚举:ProjectStatusEnum") private String status; - @JsonFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty("创建日期-起") - private String createDateBegin; + @ApiModelProperty("项目开始日期") + private LocalDate startDate; - @JsonFormat(pattern = "yyyy-MM-dd") - @ApiModelProperty("创建日期-讫") - private String createDateEnd; + @ApiModelProperty("项目结束日期") + private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java index d311d2d..d2db815 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java @@ -11,6 +11,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -81,8 +82,9 @@ public class ProjectListResp implements Serializable { @ApiModelProperty("施工人员") private String constructorName; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("创建时间") - private LocalDateTime createTime; + @ApiModelProperty(value = "开始时间") + private LocalDate startDate; + @ApiModelProperty(value = "结束时间") + private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java index 161c6c5..b36e673 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.alibaba.excel.annotation.ExcelProperty; import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,6 +10,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; /** * @Author: gaoxiong @@ -22,6 +24,10 @@ public class ProjectReq implements Serializable { @Serial private static final long serialVersionUID = 740685592879189406L; + @NotBlank(groups = {ValidationGroup.Update.class}, message = "项目id不能为空") + @ApiModelProperty("项目id") + private String projectId; + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目名称不能为空") @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "项目名称长度不能超过50字符") @ApiModelProperty("项目名称") @@ -88,30 +94,12 @@ public class ProjectReq implements Serializable { @ApiModelProperty("施工组长id") private String constructionTeamLeaderId; - @ApiModelProperty(value = "技术方案图片", notes = "多项英文逗号隔开") - private String technicalImage; - - @ApiModelProperty("技术方案内容") - private String technicalContent; - - @ApiModelProperty(value = "安全措施图片", notes = "多项英文逗号隔开") - private String safetyImage; - - @ApiModelProperty("安全措施内容") - private String safetyContent; - - @ApiModelProperty("交底内容") - private String discloseContent; - @ApiModelProperty("状态:0待施工,1施工中,2已完工,3已审核,4已验收") private int status; - @ApiModelProperty(value = "项目工作类型", notes = "多项英文逗号隔开") - private String workType; + @ApiModelProperty(value = "开始时间") + private LocalDate startDate; - @ApiModelProperty(value = "项目工作岗位", notes = "多项英文逗号隔开,json对象保存") - private String job; - - @ApiModelProperty(value = "项目安全风险点", notes = "多项英文逗号隔开") - private String safetyRiskPoint; + @ApiModelProperty(value = "结束时间") + private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java index 4d438cf..826a0f5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java @@ -13,6 +13,7 @@ import com.dite.znpt.domain.entity.ProjectEntity; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; /** * @author huise23 @@ -26,10 +27,6 @@ public class ProjectResp extends ProjectReq implements Serializable { @Serial private static final long serialVersionUID = -1883901559600186726L; - @ExcelProperty("项目id") - @ApiModelProperty("项目id") - private String projectId; - @ApiModelProperty("施工人员") private String constructorName; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java new file mode 100644 index 0000000..26d9076 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/06/24 17:06 + * @Description: 项目任务组信息请求实体 + */ +@Data +@ApiModel("项目任务组信息列表请求实体") +public class ProjectTaskGroupListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -99072074587210624L; + + @ApiModelProperty("项目任务组信息Id") + private String groupId; + + @ApiModelProperty("项目任务组名") + private String groupName; + + @ApiModelProperty("任务名称/负责人") + private String keyword; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java new file mode 100644 index 0000000..6d91415 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java @@ -0,0 +1,38 @@ +package com.dite.znpt.domain.vo; + +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * @author huise23 + * @date 2025/06/25 17:18 + * @Description: 项目任务组信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_task_group") +@ApiModel(value="ProjectTaskGroup请求对象", description="项目任务组信息表") +public class ProjectTaskGroupReq implements Serializable { + + @Serial + private static final long serialVersionUID = -57817993612481804L; + + @ApiModelProperty("id") + private String groupId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务组名不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务组名长度不能超过100字符") + @ApiModelProperty("项目任务组名") + private String groupName; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java new file mode 100644 index 0000000..14027da --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java @@ -0,0 +1,25 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDateTime; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ProjectTaskGroupEntity; + +/** + * @author huise23 + * @date 2025/06/24 16:44 + * @Description: 项目任务组信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目任务组信息响应实体") +public class ProjectTaskGroupResp extends ProjectTaskGroupEntity { + + @ApiModelProperty("任务列表") + private List taskList; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java new file mode 100644 index 0000000..c2b6103 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java @@ -0,0 +1,71 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import com.dite.znpt.util.ValidationGroup; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +/** + * @author huise23 + * @date 2025/06/27 14:21 + * @Description: 项目任务信息表导入请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectTask导入请求对象", description="项目任务信息表") +public class ProjectTaskImportReq implements Serializable { + + @Serial + private static final long serialVersionUID = -86440098932860558L; + + + @ExcelProperty(value = "上级任务名称") + private String parentTaskName; + + @ExcelProperty(value = "任务组名称(不能为空,长度32以内)") + private String taskGroupName; + + @ExcelProperty(value = "项目任务名称(不能为空,长度100以内)") + private String taskName; + + @ExcelProperty(value = "项目任务编号(不能为空,长度100以内)") + private String taskCode; + + @ExcelProperty(value = "任务负责人名称(不能为空,长度100以内)") + private String mainUserName; + + @ExcelProperty(value = "任务参与人名称,逗号分隔") + private String userName; + + @ExcelProperty(value = "计划开始时间(不能为空)") + private LocalDate planStartDate; + + @ExcelProperty(value = "计划结束时间(不能为空)") + private LocalDate planEndDate; + + @ExcelProperty(value = "实际开始时间") + private LocalDate actualStartDate; + + @ExcelProperty(value = "实际结束时间") + private LocalDate actualEndDate; + + @ExcelProperty(value = "任务状态,0未开始,1进行中,2已结束") + private Integer status; + + @ExcelProperty(value = "是否逾期,默认未逾期") + private Integer overdueStatus; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java new file mode 100644 index 0000000..ecca3b6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java @@ -0,0 +1,69 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serial; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/06/25 17:31 + * @Description: 项目任务信息请求实体 + */ +@Data +@ApiModel("项目任务信息列表请求实体") +public class ProjectTaskListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 971346092554199471L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目任务信息Id") + private String taskId; + + @ApiModelProperty("任务组id") + private String taskGroupId; + + @ApiModelProperty("项目任务名称") + private String taskName; + + @ApiModelProperty("项目任务编号") + private String taskCode; + + @ApiModelProperty("任务负责人id") + private String mainUserId; + + @ApiModelProperty("任务参与人id,逗号分隔") + private String userIds; + + @ApiModelProperty("计划开始时间") + private LocalDate planStartDate; + + @ApiModelProperty("计划结束时间") + private LocalDate planEndDate; + + @ApiModelProperty("实际开始时间") + private LocalDate actualStartDate; + + @ApiModelProperty("实际结束时间") + private LocalDate actualEndDate; + + @ApiModelProperty("任务状态,0未开始,1进行中,2已结束") + private Integer status; + + @ApiModelProperty("是否逾期,默认未逾期") + private Integer overdueStatus; + + @ApiModelProperty("任务名称/负责人名称") + private String taskNameOrMainUser; + + @ApiModelProperty(value = "导出?", hidden = true) + private Boolean isExport; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java new file mode 100644 index 0000000..14d6b97 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java @@ -0,0 +1,84 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; +/** + * @author huise23 + * @date 2025/06/25 21:48 + * @Description: 项目任务信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectTask请求对象", description="项目任务信息表") +public class ProjectTaskReq implements Serializable { + + @Serial + private static final long serialVersionUID = 899180318567127648L; + + @ApiModelProperty("任务id") + private String taskId; + + @ApiModelProperty("上级任务id") + private String parentTaskId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务组id不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 32, message = "任务组id长度不能超过32字符") + @ApiModelProperty("任务组id") + private String taskGroupId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务名称不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务名称长度不能超过100字符") + @ApiModelProperty("项目任务名称") + private String taskName; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务编号不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务编号长度不能超过100字符") + @ApiModelProperty("项目任务编号") + private String taskCode; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务负责人id不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "任务负责人id长度不能超过100字符") + @ApiModelProperty("任务负责人id") + private String mainUserId; + + @ApiModelProperty("任务参与人id,逗号分隔") + private String userIds; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划开始时间不能为空") + @ApiModelProperty("计划开始时间") + private LocalDate planStartDate; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划结束时间不能为空") + @ApiModelProperty("计划结束时间") + private LocalDate planEndDate; + + @ApiModelProperty("实际开始时间") + private LocalDate actualStartDate; + + @ApiModelProperty("实际结束时间") + private LocalDate actualEndDate; + + @ApiModelProperty("任务状态,0未开始,1进行中,2已结束") + private Integer status; + + @ApiModelProperty("是否逾期,默认未逾期") + private Integer overdueStatus; + + @ApiModelProperty("附件列表") + private List attachFileIds; + + @ApiModelProperty("备注") + private String remark; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java new file mode 100644 index 0000000..605b3c6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java @@ -0,0 +1,27 @@ +package com.dite.znpt.domain.vo; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +import com.dite.znpt.domain.entity.AttachInfoEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ProjectTaskEntity; + +/** + * @author huise23 + * @date 2025/06/25 21:48 + * @Description: 项目任务信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目任务信息响应实体") +public class ProjectTaskResp extends ProjectTaskEntity { + + @ApiModelProperty("附件列表") + private List attachList; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java new file mode 100644 index 0000000..8642ffb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskStartReq.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/06/25 17:31 + * @Description: 项目任务信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectTask开始/结束任务请求对象", description="项目任务信息表") +public class ProjectTaskStartReq implements Serializable { + + @Serial + private static final long serialVersionUID = 862660085007390976L; + + @ApiModelProperty("任务id") + private String taskId; + + @ApiModelProperty("任务组id") + private String taskGroupId; +} + diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 6b7e3f7..894351e 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -14,6 +14,7 @@ public enum FilePathEnum { IMAGE_TEMP("/static/image/temp/", "image-temp"), VIDEO("/static/video/", "video"), AUDIO("/static/audio/", "audio"), + ATTACH("/static/attach/", "attach"), ; @Getter diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java new file mode 100644 index 0000000..5ccebb9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectTaskStateEnum.java @@ -0,0 +1,48 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/29 21:32 + * @Description: + */ +@Getter +@AllArgsConstructor +public enum ProjectTaskStateEnum { + PENDING(0, "未开始"), + IN_PROGRESS(1, "进行中"), + COMPLETED(2, "已完工"); + + private final int code; + private final String desc; + + public static ProjectTaskStateEnum getByCode(int code){ + for (ProjectTaskStateEnum e : ProjectTaskStateEnum.values() ) { + if(e.code == code){ + return e; + } + } + return null; + } + + public static String getDescByCode(int code){ + ProjectTaskStateEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectTaskStateEnum.values().length); + for (ProjectTaskStateEnum e : ProjectTaskStateEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(String.valueOf(e.code), e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java index a286ad5..11947b7 100644 --- a/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/FileInfoMapper.java @@ -1,19 +1,13 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.FileInfoEntity; -import com.dite.znpt.domain.vo.FileInfoListReq; -import com.dite.znpt.domain.vo.FileInfoResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; +import com.dite.znpt.domain.entity.AttachInfoEntity; /** * @author huise23 * @date 2025/04/11 23:17 - * @Description: 文件信息表数据库访问层 + * @Description: 附件信息表数据库访问层 */ -public interface FileInfoMapper extends BaseMapper { - List queryBySelective(FileInfoListReq fileInfoReq); +public interface FileInfoMapper extends BaseMapper { } diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java new file mode 100644 index 0000000..21b78e0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskGroupMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectTaskGroupEntity; +import com.dite.znpt.domain.vo.ProjectTaskGroupListReq; +import com.dite.znpt.domain.vo.ProjectTaskGroupResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/24 16:44 + * @Description: 项目任务组信息表数据库访问层 + */ +public interface ProjectTaskGroupMapper extends BaseMapper { + List queryBySelective(ProjectTaskGroupListReq projectTaskGroupReq); +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java new file mode 100644 index 0000000..afb1d09 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectTaskMapper.java @@ -0,0 +1,21 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.vo.ProjectTaskListReq; +import com.dite.znpt.domain.vo.ProjectTaskResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/24 16:44 + * @Description: 项目任务信息表数据库访问层 + */ +public interface ProjectTaskMapper extends BaseMapper { + List queryBySelective(ProjectTaskListReq projectTaskReq); + + List listAllParents(String taskId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java new file mode 100644 index 0000000..c24dd80 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -0,0 +1,50 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 附件信息表服务接口 + */ +public interface AttachInfoService extends IService { + + /** + * 功能描述:查询附件信息列表 + * + * @return {@link List }<{@link AttachInfoEntity }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List listByBusinessIds(List businessIds, String businessType); + + /** + * 功能描述:新增附件信息 + * + * @param businessType 业务类型 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + List saveData(String businessType, MultipartFile[] files); + + /** + * 功能描述:删除附件信息 + * + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteByBusinessIds(List businessIds, String businessType); + + /** + * 功能描述:更新附件关联的业务id + * + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void updateBusinessIdByAttachIds(String businessId, List attachIds); +} + diff --git a/core/src/main/java/com/dite/znpt/service/FileInfoService.java b/core/src/main/java/com/dite/znpt/service/FileInfoService.java deleted file mode 100644 index 469bc27..0000000 --- a/core/src/main/java/com/dite/znpt/service/FileInfoService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.FileInfoEntity; -import com.dite.znpt.domain.vo.FileInfoListReq; -import com.dite.znpt.domain.vo.FileInfoResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 文件信息表服务接口 - */ -public interface FileInfoService extends IService { - - /** - * 功能描述:查询文件信息列表 - * - * @param fileInfoReq 文件信息 - * @return {@link List }<{@link FileInfoEntity }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - List selectList(FileInfoListReq fileInfoReq); - - /** - * 功能描述:查询单条文件信息 - * - * @param fileId 文件信息Id - * @return {@link FileInfoResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - FileInfoResp selectById(Long fileId); - - /** - * 功能描述:新增文件信息 - * - * @param fileInfo 文件信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void saveData(FileInfoEntity fileInfo); - - /** - * 功能描述:更新文件信息 - * - * @param fileInfo 文件信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void updateData(FileInfoEntity fileInfo); - - /** - * 功能描述:删除文件信息 - * - * @param fileId 文件信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void deleteById(Long fileId); -} - diff --git a/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java b/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java new file mode 100644 index 0000000..dd7bd2d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectTaskGroupService.java @@ -0,0 +1,55 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectTaskGroupEntity; +import com.dite.znpt.domain.vo.ProjectTaskGroupListReq; +import com.dite.znpt.domain.vo.ProjectTaskGroupResp; +import com.dite.znpt.domain.vo.ProjectTaskGroupReq; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/25 17:21 + * @Description: 项目任务组信息表服务接口 + */ +public interface ProjectTaskGroupService extends IService { + + /** + * 功能描述:查询项目任务组信息列表 + * + * @param projectTaskGroupReq 项目任务组信息 + * @return {@link List }<{@link ProjectTaskGroupResp }> + * @author huise23 + * @date 2025/06/25 17:21 + **/ + List selectList(ProjectTaskGroupListReq projectTaskGroupReq); + + /** + * 功能描述:新增项目任务组信息 + * + * @param projectTaskGroupReq 项目任务组信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void saveData(ProjectTaskGroupReq projectTaskGroupReq); + + /** + * 功能描述:更新项目任务组信息 + * + * @param projectTaskGroupReq 项目任务组信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void updateData(ProjectTaskGroupReq projectTaskGroupReq); + + /** + * 功能描述:删除项目任务组信息 + * + * @param groupId 项目任务组信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void deleteById(String groupId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java b/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java new file mode 100644 index 0000000..a142201 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectTaskService.java @@ -0,0 +1,93 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.vo.ProjectTaskListReq; +import com.dite.znpt.domain.vo.ProjectTaskResp; +import com.dite.znpt.domain.vo.ProjectTaskReq; +import com.dite.znpt.domain.vo.ProjectTaskStartReq; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/25 17:21 + * @Description: 项目任务信息表服务接口 + */ +public interface ProjectTaskService extends IService { + + /** + * 功能描述:查询项目任务信息列表 + * + * @param projectTaskReq 项目任务信息 + * @return {@link List }<{@link ProjectTaskResp }> + * @author huise23 + * @date 2025/06/25 17:21 + **/ + List selectList(ProjectTaskListReq projectTaskReq); + + /** + * 功能描述:查询单条项目任务信息 + * + * @param taskId 项目任务信息Id + * @return {@link ProjectTaskResp } + * @author huise23 + * @date 2025/06/25 17:21 + **/ + ProjectTaskResp selectById(String taskId); + + /** + * 功能描述:新增项目任务信息 + * + * @param projectTaskReq 项目任务信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void saveData(ProjectTaskReq projectTaskReq); + + /** + * 功能描述:更新项目任务信息 + * + * @param projectTaskReq 项目任务信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void updateData(ProjectTaskReq projectTaskReq); + + /** + * 功能描述:删除项目任务信息 + * + * @param taskId 项目任务信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void deleteById(String taskId); + + /** + * 功能描述:删除项目任务信息 + * + * @param groupId 项目任务组信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + void deleteByGroupId(String groupId); + + /** + * 功能描述:开始任务/任务组开始任务 + * + * @param taskStartReq 任务启动请求类 + * @author cuizhibin + * @date 2025/06/25 21:16 + **/ + void startTask(ProjectTaskStartReq taskStartReq); + + /** + * 功能描述:结束任务/任务组结束任务 + * + * @param taskStartReq 任务启动请求类 + * @author cuizhibin + * @date 2025/06/25 21:16 + **/ + void endTask(ProjectTaskStartReq taskStartReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java new file mode 100644 index 0000000..9b1db77 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -0,0 +1,105 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.enums.FilePathEnum; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.mapper.FileInfoMapper; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 附件信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class AttachInfoServiceImpl extends ServiceImpl implements AttachInfoService { + + /** + * 功能描述:查询附件信息列表 + * + * @param businessIds 业务ids + * @param businessType 业务类型 + * @return {@link List }<{@link AttachInfoEntity }> + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public List listByBusinessIds(List businessIds, String businessType) { + return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds) + .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType) + .list(); + } + + /** + * 功能描述:保存数据 + * + * @param businessType 业务类型 + * @return {@link AttachInfoEntity } + * @author cuizhibin + * @date 2025/06/26 08:53 + **/ + @Override + public List saveData(String businessType, MultipartFile[] files) { + String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); + if (!FileUtil.exist(temPathPrefix)) { + FileUtil.mkdir(temPathPrefix); + } + List list = new ArrayList<>(); + for (MultipartFile file : files) { + if (!file.isEmpty()) { + try { + String path = temPathPrefix + file.getOriginalFilename(); + FileUtil.writeBytes(file.getBytes(),path); + list.add(AttachInfoEntity.builder().businessType(businessType).attachPath(path).build()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + baseMapper.insert(list); + return list.stream().map(AttachInfoEntity::getAttachId).collect(Collectors.toList()); + } + + /** + * 功能描述:删除附件信息 + * + * @param businessIds 业务id + * @param businessType 业务类型 + * @author huise23 + * @date 2025/04/11 23:17 + **/ + @Override + public void deleteByBusinessIds(List businessIds, String businessType) { + lambdaUpdate().in(AttachInfoEntity::getBusinessId, businessIds) + .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType).remove(); + } + + /** + * 功能描述:更新附件关联的业务id + * + * @param businessId + * @param attachIds + * @author huise23 + * @date 2025/04/11 23:17 + */ + @Override + public void updateBusinessIdByAttachIds(String businessId, List attachIds) { + if (CollUtil.isEmpty(attachIds)) { + return; + } + lambdaUpdate().in(AttachInfoEntity::getAttachId, attachIds).set(AttachInfoEntity::getBusinessId, businessId).update(); + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java deleted file mode 100644 index 975b43f..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/FileInfoServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.FileInfoEntity; -import com.dite.znpt.domain.vo.FileInfoListReq; -import com.dite.znpt.domain.vo.FileInfoResp; -import com.dite.znpt.service.FileInfoService; -import com.dite.znpt.mapper.FileInfoMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 文件信息表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class FileInfoServiceImpl extends ServiceImpl implements FileInfoService { - - /** - * 功能描述:查询文件信息列表 - * - * @param fileInfoReq 文件信息信息 - * @return {@link List }<{@link FileInfoResp }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public List selectList(FileInfoListReq fileInfoReq) { - PageUtil.startPage(); - List fileInfoList= this.baseMapper.queryBySelective(fileInfoReq); - fileInfoList.forEach(resp -> { - - }); - return fileInfoList; - } - - /** - * 功能描述:查询单条文件信息 - * - * @param fileId 文件信息Id - * @return {@link FileInfoResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public FileInfoResp selectById(Long fileId) { - FileInfoListReq fileInfoReq = new FileInfoListReq(); - fileInfoReq.setFileId(fileId); - - List list = selectList(fileInfoReq); - return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new FileInfoResp(); - } - - /** - * 功能描述:新增文件信息 - * - * @param fileInfo 文件信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void saveData(FileInfoEntity fileInfo) { -// todo 校验 - save(fileInfo); - } - - /** - * 功能描述:更新文件信息 - * - * @param fileInfo 文件信息 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void updateData(FileInfoEntity fileInfo) { -// todo 校验 - updateById(fileInfo); - } - - /** - * 功能描述:删除文件信息 - * - * @param fileId 文件信息Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void deleteById(Long fileId) { -// todo 校验 - removeById(fileId); - } - -} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java new file mode 100644 index 0000000..516a9e3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskGroupServiceImpl.java @@ -0,0 +1,95 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ProjectTaskGroupEntity; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.service.ProjectTaskGroupService; +import com.dite.znpt.mapper.ProjectTaskGroupMapper; +import com.dite.znpt.service.ProjectTaskService; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author huise23 + * @date 2025/06/25 17:21 + * @Description: 项目任务组信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectTaskGroupServiceImpl extends ServiceImpl implements ProjectTaskGroupService { + + private final ProjectTaskService projectTaskService; + + /** + * 功能描述:查询项目任务组信息列表 + * + * @param projectTaskGroupReq 项目任务组信息信息 + * @return {@link List }<{@link ProjectTaskGroupResp }> + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public List selectList(ProjectTaskGroupListReq projectTaskGroupReq) { + PageUtil.startPage(); + List projectTaskGroupList= this.baseMapper.queryBySelective(projectTaskGroupReq); + ProjectTaskListReq listReq = new ProjectTaskListReq(); + listReq.setTaskNameOrMainUser(projectTaskGroupReq.getKeyword()); + Map> taskMap = projectTaskService.selectList(listReq).stream().collect(Collectors.groupingBy(ProjectTaskResp::getTaskGroupId)); + projectTaskGroupList.forEach(resp -> { + resp.setTaskList(taskMap.get(resp.getGroupId())); + }); + return projectTaskGroupList; + } + + /** + * 功能描述:新增项目任务组信息 + * + * @param projectTaskGroupReq 项目任务组信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public void saveData(ProjectTaskGroupReq projectTaskGroupReq) { +// todo 校验 + ProjectTaskGroupEntity entity = BeanUtil.copyProperties(projectTaskGroupReq, ProjectTaskGroupEntity.class); + save(entity); + } + + /** + * 功能描述:更新项目任务组信息 + * + * @param projectTaskGroupReq 项目任务组信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public void updateData(ProjectTaskGroupReq projectTaskGroupReq) { +// todo 校验 + ProjectTaskGroupEntity entity = BeanUtil.copyProperties(projectTaskGroupReq, ProjectTaskGroupEntity.class); + updateById(entity); + } + + /** + * 功能描述:删除项目任务组信息 + * + * @param groupId 项目任务组信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(String groupId) { +// todo 校验 + removeById(groupId); + projectTaskService.deleteByGroupId(groupId); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java new file mode 100644 index 0000000..b5c31a9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -0,0 +1,265 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.text.StrBuilder; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.vo.ProjectTaskListReq; +import com.dite.znpt.domain.vo.ProjectTaskResp; +import com.dite.znpt.domain.vo.ProjectTaskReq; +import com.dite.znpt.domain.vo.ProjectTaskStartReq; +import com.dite.znpt.enums.ProjectTaskStateEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.ProjectTaskGroupMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.ProjectTaskService; +import com.dite.znpt.mapper.ProjectTaskMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author huise23 + * @date 2025/06/25 17:21 + * @Description: 项目任务信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectTaskServiceImpl extends ServiceImpl implements ProjectTaskService { + + private final AttachInfoService attachInfoService; + private final ProjectTaskGroupMapper projectTaskGroupMapper; + + /** + * 功能描述:查询项目任务信息列表 + * + * @param projectTaskReq 项目任务信息信息 + * @return {@link List }<{@link ProjectTaskResp }> + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public List selectList(ProjectTaskListReq projectTaskReq) { + PageUtil.startPage(); + List projectTaskList = this.baseMapper.queryBySelective(projectTaskReq); + Map> attachMap; + if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) { + attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), null) + .stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId)); + } else { + attachMap = new HashMap<>(); + } + projectTaskList.forEach(resp -> { + resp.setAttachList(attachMap.get(resp.getTaskId())); + }); + return projectTaskList; + } + + /** + * 功能描述:查询单条项目任务信息 + * + * @param taskId 项目任务信息Id + * @return {@link ProjectTaskResp } + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public ProjectTaskResp selectById(String taskId) { + ProjectTaskListReq projectTaskReq = new ProjectTaskListReq(); + projectTaskReq.setTaskId(taskId); + + List list = selectList(projectTaskReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectTaskResp(); + } + + /** + * 功能描述:新增项目任务信息 + * + * @param projectTaskReq 项目任务信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveData(ProjectTaskReq projectTaskReq) { + ProjectTaskEntity entity = BeanUtil.copyProperties(projectTaskReq, ProjectTaskEntity.class); + checkTask(projectTaskReq); + save(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getTaskId(), projectTaskReq.getAttachFileIds()); + } + + /** + * 功能描述:更新项目任务信息 + * + * @param projectTaskReq 项目任务信息 + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateData(ProjectTaskReq projectTaskReq) { + ProjectTaskEntity entity = BeanUtil.copyProperties(projectTaskReq, ProjectTaskEntity.class); + checkTask(projectTaskReq); + updateById(entity); + attachInfoService.updateBusinessIdByAttachIds(projectTaskReq.getTaskId(), projectTaskReq.getAttachFileIds()); + } + + /** + * 功能描述:检查任务 + * + * @param taskReq 任务请求类 + * @author cuizhibin + * @date 2025/06/27 10:53 + **/ + private void checkTask(ProjectTaskReq taskReq) { + if (Objects.isNull(projectTaskGroupMapper.selectById(taskReq.getTaskGroupId()))) { + throw new ServiceException(Message.TASK_GROUP_ID_NOT_EXIST); + } + if (StrUtil.isEmpty(taskReq.getParentTaskId())) { + return; + } + Map taskMap = baseMapper.listAllParents(taskReq.getParentTaskId()).stream().collect(Collectors.toMap(ProjectTaskEntity::getTaskId, Function.identity())); +// 判断是否有循环父级 + if (StrUtil.isNotEmpty(taskReq.getTaskId())) { + if (taskMap.containsKey(taskReq.getTaskId())) { + String parentTaskId = taskReq.getParentTaskId(); + List strList = ListUtil.toList(taskReq.getTaskName()); + do { + ProjectTaskEntity task = taskMap.get(parentTaskId); + parentTaskId = task.getParentTaskId(); + if (StrUtil.isEmpty(parentTaskId)) { + break; + } + strList.add(task.getTaskName()); + } while (StrUtil.isNotEmpty(parentTaskId)); + throw new ServiceException(Message.TASK_IN_CYCLE + CollUtil.join(strList, "--")); + } + } +// 更新父级任务的计划起始/结束时间 + String parentTaskId = taskReq.getParentTaskId(); + LocalDate planStartDate = taskReq.getPlanStartDate(); + LocalDate planEndDate = taskReq.getPlanEndDate(); + Set updateTaskSet = new HashSet<>(); + do { + ProjectTaskEntity task = taskMap.get(parentTaskId); + parentTaskId = task.getParentTaskId(); + if (task.getPlanStartDate().isAfter(planStartDate)) { + task.setPlanStartDate(planStartDate); + updateTaskSet.add(task); + } else { + planStartDate = task.getPlanStartDate(); + } + if (task.getPlanEndDate().isBefore(planEndDate)) { + task.setPlanEndDate(planEndDate); + updateTaskSet.add(task); + } else { + planEndDate = task.getPlanEndDate(); + } + } while (StrUtil.isNotEmpty(parentTaskId)); + baseMapper.updateById(updateTaskSet); + } + + /** + * 功能描述:删除项目任务信息 + * + * @param taskId 项目任务信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public void deleteById(String taskId) { + removeById(taskId); + } + + /** + * 功能描述:删除项目任务信息 + * + * @param groupId 项目任务组信息Id + * @author huise23 + * @date 2025/06/25 17:21 + **/ + @Override + public void deleteByGroupId(String groupId) { + lambdaUpdate().eq(ProjectTaskEntity::getTaskGroupId, groupId).remove(); + } + + /** + * 功能描述:开始任务/任务组开始任务 + * + * @param taskStartReq 任务启动请求类 + * @author cuizhibin + * @date 2025/06/25 21:16 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void startTask(ProjectTaskStartReq taskStartReq) { + if (StrUtil.isBlank(taskStartReq.getTaskId()) && StrUtil.isBlank(taskStartReq.getTaskGroupId())) { + throw new ServiceException(Message.TASK_ID_GROUP_ID_ALL_EMPTY); + } + List list; + if (StrUtil.isNotBlank(taskStartReq.getTaskGroupId())) { + list = lambdaQuery().eq(ProjectTaskEntity::getTaskGroupId, taskStartReq.getTaskGroupId()) + .eq(ProjectTaskEntity::getStatus, ProjectTaskStateEnum.PENDING.getCode()) + .list(); + if (CollUtil.isEmpty(list)) { + return; + } + } else { + list = List.of(getById(taskStartReq.getTaskId())); + if (!list.get(0).getStatus().equals(ProjectTaskStateEnum.PENDING.getCode())) { + throw new ServiceException(Message.TASK_STATUS_NOT_PENDING); + } + } + list.forEach(entity -> { + entity.setStatus(ProjectTaskStateEnum.IN_PROGRESS.getCode()); + entity.setActualStartDate(LocalDate.now()); + }); + baseMapper.updateById(list); + } + + /** + * 功能描述:结束任务/任务组结束任务 + * + * @param taskStartReq 任务启动请求类 + * @author cuizhibin + * @date 2025/06/25 21:16 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void endTask(ProjectTaskStartReq taskStartReq) { + if (StrUtil.isBlank(taskStartReq.getTaskId()) && StrUtil.isBlank(taskStartReq.getTaskGroupId())) { + throw new ServiceException(Message.TASK_ID_GROUP_ID_ALL_EMPTY); + } + List list; + if (StrUtil.isNotBlank(taskStartReq.getTaskGroupId())) { + list = lambdaQuery().eq(ProjectTaskEntity::getTaskGroupId, taskStartReq.getTaskGroupId()) + .eq(ProjectTaskEntity::getStatus, ProjectTaskStateEnum.IN_PROGRESS.getCode()) + .list(); + if (CollUtil.isEmpty(list)) { + return; + } + } else { + list = List.of(getById(taskStartReq.getTaskId())); + if (!list.get(0).getStatus().equals(ProjectTaskStateEnum.IN_PROGRESS.getCode())) { + throw new ServiceException(Message.TASK_STATUS_NOT_IN_PROGRESS); + } + } + list.forEach(entity -> { + entity.setStatus(ProjectTaskStateEnum.COMPLETED.getCode()); + entity.setActualStartDate(LocalDate.now()); + }); + baseMapper.updateById(list); + } +} diff --git a/core/src/main/resources/mapper/FileInfoMapper.xml b/core/src/main/resources/mapper/FileInfoMapper.xml deleted file mode 100644 index 64585d3..0000000 --- a/core/src/main/resources/mapper/FileInfoMapper.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - a.file_id, a.business_id, a.minio_path, a.business_type - - - - - diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 20c1dbb..181fd5a 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -5,7 +5,7 @@ SELECT prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids, - GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.create_time + GROUP_CONCAT(DISTINCT con.name) AS constructor_name, prj.start_date, prj.end_date FROM project prj LEFT JOIN user pm ON pm.user_id = prj.project_manager_id LEFT JOIN user con ON FIND_IN_SET(con.user_id,prj.constructor_ids) > 0 AND con.del_flag = '0' @@ -25,13 +25,16 @@ AND prj.status = #{status} - - AND prj.create_time BETWEEN #{createDateBegin} AND #{createDateEnd} + + and prj.start_date >= #{startDate} + + + and prj.end_date <= #{endDate} GROUP BY prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit, prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name, prj.constructor_ids, - prj.create_time + prj.start_date, prj.end_date diff --git a/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml new file mode 100644 index 0000000..e47a1b9 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml @@ -0,0 +1,24 @@ + + + + + + a.group_id, a.group_name, a.update_by, a.create_time, + a.create_by, a.update_time + + + + + diff --git a/core/src/main/resources/mapper/ProjectTaskMapper.xml b/core/src/main/resources/mapper/ProjectTaskMapper.xml new file mode 100644 index 0000000..a53848b --- /dev/null +++ b/core/src/main/resources/mapper/ProjectTaskMapper.xml @@ -0,0 +1,77 @@ + + + + + + a.task_id, a.task_group_id, a.task_name, a.task_code, + a.main_user_id, a.user_ids, a.plan_start_date, a.plan_end_date, + a.actual_start_date, a.actual_end_date, a.status, a.overdue_status, + a.update_by, a.create_time, a.create_by, a.update_time + + + + + + + diff --git a/pom.xml b/pom.xml index 0f34b69..fc41a56 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ cn.hutool hutool-all - 5.8.22 + 5.8.24 diff --git a/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java new file mode 100644 index 0000000..bf01aa2 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java @@ -0,0 +1,37 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.domain.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + */ +@Api(tags = "附件信息") +@RestController +@RequestMapping("/attach-info") +public class AttachInfoController { + @Resource + private AttachInfoService attachInfoService; + + @ApiOperation(value = "新增附件信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestParam("businessType") String businessType, @RequestParam("file") MultipartFile file) { + return Result.ok(attachInfoService.saveData(businessType, new MultipartFile[]{file}).get(0)); + } + + @ApiOperation(value = "批量新增附件信息", httpMethod = "POST") + @PostMapping("/batch") + public Result> add(@RequestParam("businessType") String businessType, @RequestParam("files") MultipartFile[] files) { + return Result.ok(attachInfoService.saveData(businessType, files)); + } + +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java deleted file mode 100644 index 68666a5..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/FileInfoController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.constant.Constants; -import com.dite.znpt.domain.vo.FileInfoListReq; -import com.dite.znpt.domain.vo.FileInfoResp; -import com.dite.znpt.domain.entity.FileInfoEntity; -import com.dite.znpt.service.FileInfoService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "文件信息") -@RestController -@RequestMapping("/file-info") -public class FileInfoController { - @Resource - private FileInfoService fileInfoService; - - @ApiOperation(value = "获取文件信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(FileInfoListReq fileInfoReq) { - return PageResult.ok(fileInfoService.selectList(fileInfoReq)); - } - - @ApiOperation(value = "根据文件信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{fileId}") - public Result getInfo(@PathVariable Long fileId) { - return Result.ok(fileInfoService.selectById(fileId)); - } - - @ApiOperation(value = "新增文件信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody FileInfoEntity fileInfo) { - fileInfoService.saveData(fileInfo); - return Result.ok(); - } - - @ApiOperation(value = "修改文件信息", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody FileInfoEntity fileInfo) { - fileInfoService.updateData(fileInfo); - return Result.ok(); - } - - @ApiOperation(value = "删除文件信息", httpMethod = "DELETE") - @DeleteMapping("/{fileId}") - public Result remove(@PathVariable Long fileId) { - fileInfoService.deleteById(fileId); - return Result.ok(); - } - - @ApiOperation(value = "导出文件信息", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "文件信息") - public List export(FileInfoListReq fileInfoReq) { - return fileInfoService.selectList(fileInfoReq); - } - - @ApiOperation(value = "导入文件信息", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java new file mode 100644 index 0000000..cbf1788 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java @@ -0,0 +1,101 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.constant.Constants; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.service.ProjectTaskService; +import com.dite.znpt.util.ValidationGroup; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/25 17:18 + */ +@Api(tags = "项目任务信息") +@RestController +@RequestMapping("/project-task") +public class ProjectTaskController { + @Resource + private ProjectTaskService projectTaskService; + + @ApiOperation(value = "获取项目任务信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectTaskListReq projectTaskReq) { + return PageResult.ok(projectTaskService.selectList(projectTaskReq)); + } + + @ApiOperation(value = "根据项目任务信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{taskId}") + public Result getInfo(@PathVariable String taskId) { + return Result.ok(projectTaskService.selectById(taskId)); + } + + @ApiOperation(value = "新增项目任务信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectTaskReq projectTaskReq) { + projectTaskService.saveData(projectTaskReq); + return Result.ok(); + } + + @ApiOperation(value = "修改项目任务信息", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ProjectTaskReq projectTaskReq) { + projectTaskService.updateData(projectTaskReq); + return Result.ok(); + } + + @ApiOperation(value = "删除项目任务信息", httpMethod = "DELETE") + @DeleteMapping("/{taskId}") + public Result remove(@PathVariable String taskId) { + projectTaskService.deleteById(taskId); + return Result.ok(); + } + + @ApiOperation(value = "导出项目任务信息", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "项目任务信息") + public List export(ProjectTaskListReq projectTaskReq) { + projectTaskReq.setIsExport(true); + return projectTaskService.selectList(projectTaskReq); + } + + @ApiOperation(value = "导入项目任务信息", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败", errorMessageList); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } + + @ApiOperation(value = "开始任务/任务组开始任务", httpMethod = "PUT") + @PutMapping("/startTask") + public Result startTask(@RequestBody ProjectTaskStartReq taskStartReq) { + projectTaskService.startTask(taskStartReq); + return Result.ok(); + } + + @ApiOperation(value = "结束任务/任务组结束任务", httpMethod = "PUT") + @PutMapping("/endTask") + public Result endTask(@RequestBody ProjectTaskStartReq taskStartReq) { + projectTaskService.endTask(taskStartReq); + return Result.ok(); + } + +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskGroupController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskGroupController.java new file mode 100644 index 0000000..3ba0c1b --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskGroupController.java @@ -0,0 +1,63 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.constant.Constants; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.ProjectTaskGroupEntity; +import com.dite.znpt.domain.vo.ProjectTaskGroupListReq; +import com.dite.znpt.domain.vo.ProjectTaskGroupReq; +import com.dite.znpt.domain.vo.ProjectTaskGroupResp; +import com.dite.znpt.service.ProjectTaskGroupService; +import com.dite.znpt.util.ValidationGroup; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/25 17:18 + */ +@Api(tags = "项目任务组信息") +@RestController +@RequestMapping("/project-task-group") +public class ProjectTaskGroupController { + @Resource + private ProjectTaskGroupService projectTaskGroupService; + + @ApiOperation(value = "获取项目任务组信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectTaskGroupListReq projectTaskGroupReq) { + return PageResult.ok(projectTaskGroupService.selectList(projectTaskGroupReq)); + } + + @ApiOperation(value = "新增项目任务组信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectTaskGroupReq projectTaskGroupReq) { + projectTaskGroupService.saveData(projectTaskGroupReq); + return Result.ok(); + } + + @ApiOperation(value = "修改项目任务组信息", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ProjectTaskGroupReq projectTaskGroupReq) { + projectTaskGroupService.updateData(projectTaskGroupReq); + return Result.ok(); + } + + @ApiOperation(value = "删除项目任务组信息", httpMethod = "DELETE") + @DeleteMapping("/{groupId}") + public Result remove(@PathVariable String groupId) { + projectTaskGroupService.deleteById(groupId); + return Result.ok(); + } +} + From f63e40a79a37463871c5459a6cb32e7ab125127e Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 27 Jun 2025 15:26:45 +0800 Subject: [PATCH 073/143] =?UTF-8?q?1.=E9=99=84=E4=BB=B6=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 9b1db77..6fd21ab 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -63,7 +63,7 @@ public class AttachInfoServiceImpl extends ServiceImpl Date: Fri, 27 Jun 2025 16:04:06 +0800 Subject: [PATCH 074/143] =?UTF-8?q?1.=E9=99=84=E4=BB=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/enums/AttachBusinessTypeEnum.java | 49 +++++++++++++++++++ .../dite/znpt/service/AttachInfoService.java | 13 ++++- .../service/impl/AttachInfoServiceImpl.java | 27 +++++++--- .../service/impl/ProjectTaskServiceImpl.java | 12 +++-- .../web/controller/AttachInfoController.java | 8 +-- .../znpt/web/controller/CommonController.java | 6 +++ 6 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java new file mode 100644 index 0000000..9f58fff --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -0,0 +1,49 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/4/24 21:25 + * @Description: + */ +@Getter +public enum AttachBusinessTypeEnum { + PROJECT_TASK("PROJECT_TASK", "项目任务"), + ; + private final String code; + private final String desc; + + AttachBusinessTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static AttachBusinessTypeEnum getByCode(String code){ + for (AttachBusinessTypeEnum e : AttachBusinessTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + AttachBusinessTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(AttachBusinessTypeEnum.values().length); + for (AttachBusinessTypeEnum e : AttachBusinessTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index c24dd80..539e47b 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -2,6 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.enums.AttachBusinessTypeEnum; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -37,7 +38,15 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - void deleteByBusinessIds(List businessIds, String businessType); + void deleteByBusinessId(String businessId, AttachBusinessTypeEnum typeEnum); + + /** + * 功能描述:删除附件信息 + * + * @author huise23 + * @date 2025/04/11 23:17 + **/ + void deleteByBusinessIds(List businessIds, AttachBusinessTypeEnum typeEnum); /** * 功能描述:更新附件关联的业务id @@ -45,6 +54,6 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - void updateBusinessIdByAttachIds(String businessId, List attachIds); + void updateBusinessIdByAttachIds(String businessId, List attachIds, AttachBusinessTypeEnum typeEnum); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 6fd21ab..50df536 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -1,17 +1,21 @@ package com.dite.znpt.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.mapper.FileInfoMapper; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; @@ -53,7 +57,7 @@ public class AttachInfoServiceImpl extends ServiceImpl saveData(String businessType, MultipartFile[] files) { - String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(businessType).concat(FileUtil.FILE_SEPARATOR).concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); if (!FileUtil.exist(temPathPrefix)) { FileUtil.mkdir(temPathPrefix); } @@ -76,15 +80,19 @@ public class AttachInfoServiceImpl extends ServiceImpl businessIds, String businessType) { + public void deleteByBusinessId(String businessId, AttachBusinessTypeEnum typeEnum) { + deleteByBusinessIds(ListUtil.toList(businessId), typeEnum); + } + + public void deleteByBusinessIds(List businessIds, AttachBusinessTypeEnum typeEnum) { lambdaUpdate().in(AttachInfoEntity::getBusinessId, businessIds) - .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType).remove(); + .eq(AttachInfoEntity::getBusinessType, typeEnum.getCode()).remove(); } /** @@ -96,10 +104,15 @@ public class AttachInfoServiceImpl extends ServiceImpl attachIds) { + @Transactional(rollbackFor = Exception.class) + public void updateBusinessIdByAttachIds(String businessId, List attachIds, AttachBusinessTypeEnum typeEnum) { + baseMapper.delete(Wrappers.lambdaUpdate().eq(AttachInfoEntity::getBusinessId, businessId) + .eq(AttachInfoEntity::getBusinessType, typeEnum.getCode())); if (CollUtil.isEmpty(attachIds)) { return; } - lambdaUpdate().in(AttachInfoEntity::getAttachId, attachIds).set(AttachInfoEntity::getBusinessId, businessId).update(); + lambdaUpdate().in(AttachInfoEntity::getAttachId, attachIds) + .eq(AttachInfoEntity::getBusinessType, typeEnum.getCode()) + .set(AttachInfoEntity::getBusinessId, businessId).update(); } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index b5c31a9..d734aee 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -13,6 +13,7 @@ import com.dite.znpt.domain.vo.ProjectTaskListReq; import com.dite.znpt.domain.vo.ProjectTaskResp; import com.dite.znpt.domain.vo.ProjectTaskReq; import com.dite.znpt.domain.vo.ProjectTaskStartReq; +import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectTaskGroupMapper; @@ -97,7 +98,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl list = lambdaQuery().eq(ProjectTaskEntity::getTaskGroupId, groupId).list().stream().map(ProjectTaskEntity::getTaskId).toList(); + attachInfoService.deleteByBusinessIds(list, AttachBusinessTypeEnum.PROJECT_TASK); + baseMapper.deleteByIds(list); } /** diff --git a/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java index bf01aa2..14c59f3 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/AttachInfoController.java @@ -22,14 +22,14 @@ public class AttachInfoController { private AttachInfoService attachInfoService; @ApiOperation(value = "新增附件信息", httpMethod = "POST") - @PostMapping - public Result add(@RequestParam("businessType") String businessType, @RequestParam("file") MultipartFile file) { + @PostMapping("/{businessType}") + public Result add(@PathVariable("businessType") String businessType, @RequestParam("file") MultipartFile file) { return Result.ok(attachInfoService.saveData(businessType, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "批量新增附件信息", httpMethod = "POST") - @PostMapping("/batch") - public Result> add(@RequestParam("businessType") String businessType, @RequestParam("files") MultipartFile[] files) { + @PostMapping("/batch/{businessType}") + public Result> add(@PathVariable("businessType") String businessType, @RequestParam("files") MultipartFile[] files) { return Result.ok(attachInfoService.saveData(businessType, files)); } diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 626cdf2..94f0d86 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -151,5 +151,11 @@ public class CommonController { return Result.ok(InsuranceStatusEnum.listAll()); } + @ApiOperation(value = "查询附件业务类型", httpMethod = "GET") + @GetMapping("/list/attach_business_type") + public Result listAttachBusinessType(){ + return Result.ok(AttachBusinessTypeEnum.listAll()); + } + } From b28515f8d723fac8642824efdfbfd779f629b654 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 27 Jun 2025 16:20:46 +0800 Subject: [PATCH 075/143] =?UTF-8?q?1.=E9=99=84=E4=BB=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B1=BB=E5=9E=8B=E5=92=8C=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/AttachInfoEntity.java | 12 ++++++++++-- .../com/dite/znpt/domain/vo/AttachInfoReq.java | 14 ++++---------- .../com/dite/znpt/service/AttachInfoService.java | 3 ++- .../znpt/service/impl/AttachInfoServiceImpl.java | 11 +++++++++-- .../znpt/web/controller/AttachInfoController.java | 9 +++++---- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java index 38abca2..a8b9450 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -12,7 +12,7 @@ import lombok.*; /** * @author huise23 - * @date 2025/06/27 10:10 + * @date 2025/06/27 16:18 * @Description: 附件信息表实体类 */ @Data @@ -25,7 +25,7 @@ import lombok.*; public class AttachInfoEntity extends AuditableEntity implements Serializable { @Serial - private static final long serialVersionUID = -70522903124405433L; + private static final long serialVersionUID = -74430400890258372L; @ApiModelProperty("附件id") @TableId(value = "attach_id", type = IdType.ASSIGN_ID) @@ -42,5 +42,13 @@ public class AttachInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("业务类型,字典attach_business_type") @TableField("business_type") private String businessType; + + @ApiModelProperty("文件类型") + @TableField("file_type") + private String fileType; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java index 026d7e0..3e6a88f 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -21,16 +21,10 @@ public class AttachInfoReq implements Serializable { @Serial private static final long serialVersionUID = -59837569061686176L; - @ApiModelProperty("附件id") - private Long attachId; + @ApiModelProperty("文件类型") + private String fileType; - @ApiModelProperty("业务id") - private String businessId; - - @ApiModelProperty("请求路径") - private String attachPath; - - @ApiModelProperty("业务类型,字典attach_business_type") - private String businessType; + @ApiModelProperty("备注") + private String remark; } diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index 539e47b..e749570 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -2,6 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.vo.AttachInfoReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import org.springframework.web.multipart.MultipartFile; @@ -30,7 +31,7 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List saveData(String businessType, MultipartFile[] files); + List saveData(String businessType, AttachInfoReq infoReq, MultipartFile[] files); /** * 功能描述:删除附件信息 diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 50df536..e0b96f6 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.vo.AttachInfoReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.service.AttachInfoService; @@ -56,7 +57,7 @@ public class AttachInfoServiceImpl extends ServiceImpl saveData(String businessType, MultipartFile[] files) { + public List saveData(String businessType, AttachInfoReq infoReq, MultipartFile[] files) { String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(businessType).concat(FileUtil.FILE_SEPARATOR).concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); if (!FileUtil.exist(temPathPrefix)) { FileUtil.mkdir(temPathPrefix); @@ -67,7 +68,13 @@ public class AttachInfoServiceImpl extends ServiceImpl add(@PathVariable("businessType") String businessType, @RequestParam("file") MultipartFile file) { - return Result.ok(attachInfoService.saveData(businessType, new MultipartFile[]{file}).get(0)); + public Result add(@PathVariable("businessType") String businessType, AttachInfoReq infoReq, @RequestParam("file") MultipartFile file) { + return Result.ok(attachInfoService.saveData(businessType, infoReq, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "批量新增附件信息", httpMethod = "POST") @PostMapping("/batch/{businessType}") - public Result> add(@PathVariable("businessType") String businessType, @RequestParam("files") MultipartFile[] files) { - return Result.ok(attachInfoService.saveData(businessType, files)); + public Result> add(@PathVariable("businessType") String businessType, AttachInfoReq infoReq, @RequestParam("files") MultipartFile[] files) { + return Result.ok(attachInfoService.saveData(businessType, infoReq, files)); } } From a01f765e8dbb7a43387cf81641c394d215cec954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Fri, 27 Jun 2025 19:05:06 +0800 Subject: [PATCH 076/143] =?UTF-8?q?=E4=BF=9D=E9=99=A9=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=EF=BC=8C=E4=B8=8B=E8=BD=BD=EF=BC=8C=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E5=88=97=E8=A1=A8=E5=B7=B2=E5=AE=8C=E6=88=90=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E9=99=A9=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 4 +- .../java/com/dite/znpt/converts/Converts.java | 3 + .../znpt/domain/entity/AttachInfoEntity.java | 4 + .../domain/entity/InsuranceInfoEntity.java | 4 + .../dite/znpt/domain/vo/AttachInfoReq.java | 3 + .../dite/znpt/domain/vo/AttachInfoResp.java | 45 +++++++++ .../znpt/domain/vo/InsuranceAttachResp.java | 57 +++++++++++ .../dite/znpt/domain/vo/InsuranceInfoReq.java | 4 + .../znpt/domain/vo/InsuranceInfoResp.java | 9 +- .../znpt/enums/AttachBusinessTypeEnum.java | 1 + .../com/dite/znpt/enums/FilePathEnum.java | 2 +- .../dite/znpt/service/AttachInfoService.java | 6 ++ .../znpt/service/InsuranceInfoService.java | 4 + .../service/impl/AttachInfoServiceImpl.java | 58 ++++++++++- .../service/impl/ImageCollectServiceImpl.java | 2 - .../impl/InsuranceInfoServiceImpl.java | 95 +++++++++++++++---- .../znpt/web/controller/AudioController.java | 8 -- .../znpt/web/controller/ImageController.java | 1 - .../controller/InsuranceInfoController.java | 43 ++++++++- 19 files changed, 315 insertions(+), 38 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InsuranceAttachResp.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 1a4a4dc..83e643d 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -13,13 +13,14 @@ public class Message implements Serializable { private static final long serialVersionUID = 4010434089386946123L; public static final String IMAGE_IS_EMPTY = "图像信息为空"; + public static final String ATTACH_INFO_IS_NOT_EXIST = "附件信息id不存在"; + public static final String ATTACH_FILE_IS_NOT_EXIST = "不存在{}的附件文件"; public static final String IMAGE_PATH_IS_NOT_EXIST = "图像地址不存在"; public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; - public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在或者不合法"; public static final String USER_ID_NOT_EXIST = "用户id不存在"; public static final String USER_ID_NOT_EXIST_OR_ILLEGAL = "用户id不存在或者不合法"; public static final String ACCOUNT_EXIST = "用户账号已经存在,请重新输入"; @@ -44,6 +45,7 @@ public class Message implements Serializable { public static final String INSURANCE_COMPANY_NAME_IS_EXIST = "保险公司名称已存在"; public static final String INSURANCE_COMPANY_ID_IS_NOT_EXIST = "保险公司id不存在"; public static final String INSURANCE_INFO_ID_IS_NOT_EXIST = "保险信息id不存在"; + public static final String INSURANCE_FILE_IS_NOT_EXIST = "保险文不存在"; public static final String TASK_ID_GROUP_ID_ALL_EMPTY = "任务id和任务组id不可同时为空"; public static final String TASK_STATUS_NOT_PENDING = "任务状态不是未开始"; public static final String TASK_STATUS_NOT_IN_PROGRESS = "任务状态不是进行中"; diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 5035294..9a3b0da 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -84,9 +84,12 @@ public interface Converts { InsuranceCompanyEntity toInsuranceCompanyEntity(InsuranceCompanyReq req); List toInsuranceInfoResp(List list); + List toInsuranceAttachResp(List list); InsuranceInfoResp toInsuranceInfoResp(InsuranceInfoEntity entity); InsuranceInfoEntity toInsuranceInfoEntity(InsuranceInfoReq req); + + AttachInfoResp toAttacheInfoResp(AttachInfoEntity entity); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java index a8b9450..5e1fb8c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -50,5 +50,9 @@ public class AttachInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("备注") @TableField("remark") private String remark; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableField("del_flag") + private String delFlag; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java index a500e03..4242ef0 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InsuranceInfoEntity.java @@ -64,6 +64,10 @@ public class InsuranceInfoEntity extends AuditableEntity implements Serializable @TableField("insurance_bill_code") private String insuranceBillCode; + @ApiModelProperty("附件id") + @TableField("attach_info_id") + private String attachInfoId; + @ApiModelProperty("生效日期") @TableField("effective_date") private LocalDate effectiveDate; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java index 3e6a88f..11d8200 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -21,6 +21,9 @@ public class AttachInfoReq implements Serializable { @Serial private static final long serialVersionUID = -59837569061686176L; + @ApiModelProperty("自定义路径") + private String userDefinedPath; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java new file mode 100644 index 0000000..027fea6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/06/25 21:59 + * @Description: 附件信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="AttachInfo响应对象", description="附件信息表") +public class AttachInfoResp implements Serializable { + + @Serial + private static final long serialVersionUID = -59837569061686176L; + + @ApiModelProperty("附件id") + private String attachId; + + @ApiModelProperty("业务id") + private String businessId; + + @ApiModelProperty("附件路径") + private String attachPath; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("备注") + private String remark; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty + private LocalDateTime createTime; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceAttachResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceAttachResp.java new file mode 100644 index 0000000..1a54623 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceAttachResp.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/6/24 23:46 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("保险附件响应实体") +public class InsuranceAttachResp implements Serializable { + + @Serial + private static final long serialVersionUID = -4902944535128070359L; + + @ApiModelProperty("保险信息id") + private String insuranceInfoId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("用户姓名") + private String name; + + @ApiModelProperty("用户编码") + private String userCode; + + @ApiModelProperty("附件id") + private String attachInfoId; + + @ApiModelProperty("附件路径") + private String attachPath; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("备注") + private String remark; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty + private LocalDateTime createTime; + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java index 1af1c03..cc73dd1 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoReq.java @@ -42,6 +42,10 @@ public class InsuranceInfoReq implements Serializable { @ApiModelProperty("保单号") private String insuranceBillCode; + @NotBlank(message = "保单号不能为空") + @ApiModelProperty("附件id,调用/attach-info{businessType}方法获取,businessType传值insurance_file,userDefinedPath传值规则:userid + '/' + insuranceBillCode") + private String attachInfoId; + @JsonFormat(pattern = "yyyy-MM-dd") @NotNull(message = "生效日期不能为空") @ApiModelProperty("生效日期") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java index 85d194d..86161b4 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InsuranceInfoResp.java @@ -6,9 +6,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; @@ -53,6 +50,12 @@ public class InsuranceInfoResp implements Serializable { @ApiModelProperty("保单号") private String insuranceBillCode; + @ApiModelProperty("附件id") + private String attachInfoId; + + @ApiModelProperty("附件信息") + private AttachInfoResp attachInfoResp; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("生效日期") private LocalDate effectiveDate; diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 9f58fff..c5c0909 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -14,6 +14,7 @@ import java.util.List; @Getter public enum AttachBusinessTypeEnum { PROJECT_TASK("PROJECT_TASK", "项目任务"), + INSURANCE_FILE("insurance", "保险文件"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 894351e..596613a 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -15,7 +15,7 @@ public enum FilePathEnum { VIDEO("/static/video/", "video"), AUDIO("/static/audio/", "audio"), ATTACH("/static/attach/", "attach"), - ; + INSURANCE("/static/insurance/", "insurance"); @Getter private final String urlPath; diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index e749570..f11a8df 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -6,6 +6,8 @@ import com.dite.znpt.domain.vo.AttachInfoReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.rmi.ServerException; import java.util.List; /** @@ -33,6 +35,8 @@ public interface AttachInfoService extends IService { **/ List saveData(String businessType, AttachInfoReq infoReq, MultipartFile[] files); + + void download(String attachId, HttpServletResponse response) throws Exception; /** * 功能描述:删除附件信息 * @@ -41,6 +45,8 @@ public interface AttachInfoService extends IService { **/ void deleteByBusinessId(String businessId, AttachBusinessTypeEnum typeEnum); + void deleteByAttachInfoId(String attachIdInfoId); + /** * 功能描述:删除附件信息 * diff --git a/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java b/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java index 6e6d8a3..2328917 100644 --- a/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/InsuranceInfoService.java @@ -2,9 +2,11 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.InsuranceInfoEntity; +import com.dite.znpt.domain.vo.InsuranceAttachResp; import com.dite.znpt.domain.vo.InsuranceInfoListReq; import com.dite.znpt.domain.vo.InsuranceInfoReq; import com.dite.znpt.domain.vo.InsuranceInfoResp; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -16,6 +18,8 @@ import java.util.List; public interface InsuranceInfoService extends IService { List page(InsuranceInfoListReq req); List list(InsuranceInfoListReq req); + List pageAttach(InsuranceInfoListReq req); + List listAttach(InsuranceInfoListReq req); InsuranceInfoResp detail(String insuranceInfoId); void save(InsuranceInfoReq req); void update(String insuranceInfoId, InsuranceInfoReq req); diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index e0b96f6..2762f34 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -7,18 +7,29 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.InsuranceInfoEntity; import com.dite.znpt.domain.vo.AttachInfoReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.mapper.FileInfoMapper; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.rmi.ServerException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -58,7 +69,11 @@ public class AttachInfoServiceImpl extends ServiceImpl saveData(String businessType, AttachInfoReq infoReq, MultipartFile[] files) { - String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(businessType).concat(FileUtil.FILE_SEPARATOR).concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(businessType).concat(FileUtil.FILE_SEPARATOR); + if(StrUtil.isNotBlank(infoReq.getUserDefinedPath())){ + temPathPrefix = temPathPrefix.concat(infoReq.getUserDefinedPath()).concat(FileUtil.FILE_SEPARATOR); + } + temPathPrefix = temPathPrefix.concat(DateUtil.today()).concat(FileUtil.FILE_SEPARATOR); if (!FileUtil.exist(temPathPrefix)) { FileUtil.mkdir(temPathPrefix); } @@ -84,6 +99,38 @@ public class AttachInfoServiceImpl extends ServiceImpl businessIds, AttachBusinessTypeEnum typeEnum) { lambdaUpdate().in(AttachInfoEntity::getBusinessId, businessIds) - .eq(AttachInfoEntity::getBusinessType, typeEnum.getCode()).remove(); + .eq(AttachInfoEntity::getBusinessType, typeEnum.getCode()) + .set(AttachInfoEntity::getDelFlag, Constants.DEL_FLAG_1).update(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 3271a0f..dd87b06 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; @@ -17,7 +16,6 @@ import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java index b6e689b..0185f77 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/InsuranceInfoServiceImpl.java @@ -1,34 +1,38 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.InsuranceCompanyEntity; -import com.dite.znpt.domain.entity.InsuranceInfoEntity; -import com.dite.znpt.domain.entity.InsuranceTypeEntity; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.vo.InsuranceInfoListReq; -import com.dite.znpt.domain.vo.InsuranceInfoReq; -import com.dite.znpt.domain.vo.InsuranceInfoResp; +import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.AttachBusinessTypeEnum; +import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.enums.InsuranceStatusEnum; import com.dite.znpt.enums.UserStatusEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.InsuranceInfoMapper; -import com.dite.znpt.service.InsuranceCompanyService; -import com.dite.znpt.service.InsuranceInfoService; -import com.dite.znpt.service.InsuranceTypeService; -import com.dite.znpt.service.UserService; +import com.dite.znpt.service.*; import com.dite.znpt.util.PageUtil; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; -import java.util.List; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author Bear.G @@ -47,6 +51,9 @@ public class InsuranceInfoServiceImpl extends ServiceImpl page(InsuranceInfoListReq req) { PageUtil.startPage(); @@ -55,7 +62,7 @@ public class InsuranceInfoServiceImpl extends ServiceImpl list(InsuranceInfoListReq req) { - return Converts.INSTANCE.toInsuranceInfoResp( + List result = Converts.INSTANCE.toInsuranceInfoResp( this.list(Wrappers.lambdaQuery(InsuranceInfoEntity.class) .like(StrUtil.isNotBlank(req.getName()), InsuranceInfoEntity::getName, req.getName()) .like(StrUtil.isNotBlank(req.getUserCode()), InsuranceInfoEntity::getUserCode, req.getUserCode()) @@ -63,6 +70,42 @@ public class InsuranceInfoServiceImpl extends ServiceImpl pageAttach(InsuranceInfoListReq req) { + PageUtil.startPage(); + return this.listAttach(req); + } + + @Override + public List listAttach(InsuranceInfoListReq req) { + List result = Converts.INSTANCE.toInsuranceAttachResp( + this.list(Wrappers.lambdaQuery(InsuranceInfoEntity.class) + .like(StrUtil.isNotBlank(req.getName()), InsuranceInfoEntity::getName, req.getName()) + .like(StrUtil.isNotBlank(req.getUserCode()), InsuranceInfoEntity::getUserCode, req.getUserCode()) + .eq(StrUtil.isNotBlank(req.getInsuranceTypeId()), InsuranceInfoEntity::getInsuranceTypeId, req.getInsuranceCompanyId()) + .eq(StrUtil.isNotBlank(req.getInsuranceCompanyId()), InsuranceInfoEntity::getInsuranceCompanyId, req.getInsuranceCompanyId()) + .eq(StrUtil.isNotBlank(req.getInsuranceStatus()), InsuranceInfoEntity::getInsuranceStatus, req.getInsuranceStatus()) + ) + ); + + List attachInfoIds = result.stream().map(InsuranceAttachResp::getAttachInfoId).filter(StrUtil::isNotBlank).toList(); + if(CollUtil.isNotEmpty(attachInfoIds)){ + Map attachIdMap = attacheInfoService.list( + Wrappers.lambdaQuery(AttachInfoEntity.class).in(AttachInfoEntity::getAttachId, attachInfoIds).eq(AttachInfoEntity::getDelFlag, Constants.DEL_FLAG_0) + ).stream().collect(Collectors.toMap(AttachInfoEntity::getAttachId, Function.identity())); + result.forEach(resp -> { + if(StrUtil.isNotBlank(resp.getAttachInfoId()) && attachIdMap.containsKey(resp.getAttachInfoId())){ + resp.setAttachPath(attachIdMap.get(resp.getAttachInfoId()).getAttachPath()); + resp.setCreateTime(attachIdMap.get(resp.getAttachInfoId()).getCreateTime()); + resp.setFileType(attachIdMap.get(resp.getAttachInfoId()).getFileType()); + resp.setRemark(attachIdMap.get(resp.getAttachInfoId()).getRemark()); + } + }); + } + return result; } @Override @@ -71,13 +114,23 @@ public class InsuranceInfoServiceImpl extends ServiceImpl page(InsuranceInfoListReq req) { @@ -37,6 +50,18 @@ public class InsuranceInfoController { return Result.ok(insuranceInfoService.list(req)); } + @ApiOperation(value = "分页查询保险附件列表", httpMethod = "GET") + @GetMapping("/page-attach") + public PageResult pageAttach(InsuranceInfoListReq req) { + return PageResult.ok(insuranceInfoService.pageAttach(req)); + } + + @ApiOperation(value = "查询保险附件列表", httpMethod = "GET") + @GetMapping("/list-attach") + public Result> listAttach(InsuranceInfoListReq req) { + return Result.ok(insuranceInfoService.listAttach(req)); + } + @ApiOperation(value = "查询保险信息详情", httpMethod = "GET") @GetMapping("/detail/{insuranceInfoId}") public Result detail(@PathVariable String insuranceInfoId) { @@ -63,4 +88,20 @@ public class InsuranceInfoController { insuranceInfoService.deleteById(insuranceInfoId); return Result.ok(); } + + /** + * @param response + * @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存 + */ + @GetMapping("/download-file/{insuranceInfoId}") + public void downloadFile(@PathVariable String insuranceInfoId, HttpServletResponse response) throws Exception { + InsuranceInfoEntity insuranceInfo = insuranceInfoService.getById(insuranceInfoId); + if(null == insuranceInfo){ + throw new ServerException(Message.INSURANCE_INFO_ID_IS_NOT_EXIST); + } + if(StrUtil.isBlank(insuranceInfo.getAttachInfoId())){ + throw new ServerException(Message.INSURANCE_FILE_IS_NOT_EXIST); + } + attachInfoService.download(insuranceInfo.getAttachInfoId(), response); + } } From a0c5fdcb5fcfd1d334a8ad39dd2f6a05134764eb Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 30 Jun 2025 11:46:13 +0800 Subject: [PATCH 077/143] =?UTF-8?q?1.=E5=AD=97=E5=85=B8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/DictEntity.java | 61 +++++++++++ .../com/dite/znpt/domain/vo/DictListReq.java | 41 +++++++ .../java/com/dite/znpt/domain/vo/DictReq.java | 48 ++++++++ .../com/dite/znpt/domain/vo/DictResp.java | 18 +++ .../dite/znpt/mapper/CombinedDictMapper.java | 19 ---- .../java/com/dite/znpt/mapper/DictMapper.java | 18 +++ .../znpt/service/CombinedDictService.java | 64 ----------- .../com/dite/znpt/service/DictService.java | 65 +++++++++++ .../service/impl/CombinedDictServiceImpl.java | 99 ----------------- .../znpt/service/impl/DictServiceImpl.java | 103 ++++++++++++++++++ ...{CombinedDictMapper.xml => DictMapper.xml} | 76 +++++++------ .../controller/CombinedDictController.java | 84 -------------- .../znpt/web/controller/DictController.java | 62 +++++++++++ 13 files changed, 453 insertions(+), 305 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/DictEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DictListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DictReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DictResp.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/DictMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/service/CombinedDictService.java create mode 100644 core/src/main/java/com/dite/znpt/service/DictService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/DictServiceImpl.java rename core/src/main/resources/mapper/{CombinedDictMapper.xml => DictMapper.xml} (76%) delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/DictController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DictEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DictEntity.java new file mode 100644 index 0000000..cf0c96a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/DictEntity.java @@ -0,0 +1,61 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("dict") +@ApiModel(value="DictEntity对象", description="字典表") +public class DictEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -52191875430786367L; + + @ExcelProperty("字典id") + @ApiModelProperty("字典id") + @TableId(value = "dict_id", type = IdType.ASSIGN_ID) + private String dictId; + + @ExcelProperty("字典类型") + @ApiModelProperty("字典类型") + @TableField("dict_type") + private String dictType; + + @ExcelProperty("字典名称") + @ApiModelProperty("字典名称") + @TableField("dict_name") + private String dictName; + + @ExcelProperty("父级id") + @ApiModelProperty("父级id") + @TableField("parent_id") + private Long parentId; + + @ExcelProperty("字典排序") + @ApiModelProperty("字典排序") + @TableField("sort_order") + private Integer sortOrder; + + @ExcelProperty("是否字典终值") + @ApiModelProperty("是否字典终值") + @TableField("final_state") + private Integer finalState; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DictListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DictListReq.java new file mode 100644 index 0000000..e239e4b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DictListReq.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典请求实体 + */ +@Data +@ApiModel("字典列表请求实体") +public class DictListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 243104747131701229L; + + @ApiModelProperty("字典Id") + private String dictId; + + @ApiModelProperty("字典类型") + private String dictType; + + @ApiModelProperty("字典名称") + private String dictName; + + @ApiModelProperty("父级id") + private Long parentId; + + @ApiModelProperty("字典排序") + private Integer sortOrder; + + @ApiModelProperty("是否字典终值") + private Integer finalState; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DictReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DictReq.java new file mode 100644 index 0000000..829716b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DictReq.java @@ -0,0 +1,48 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="Dict请求对象", description="字典表") +public class DictReq implements Serializable { + + @Serial + private static final long serialVersionUID = 104440023555693334L; + + @ApiModelProperty("字典id") + private String dictId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "字典类型不能为空") + @Size(max = 20, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "字典类型长度不能超过20") + @ApiModelProperty("字典类型") + private String dictType; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "字典名称不能为空") + @Size(max = 50, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "字典名称长度不能超过50") + @ApiModelProperty("字典名称") + private String dictName; + + @ApiModelProperty("父级id") + private Long parentId; + + @ApiModelProperty("字典排序") + private Integer sortOrder; + + @ApiModelProperty("是否字典终值") + private Integer finalState; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DictResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DictResp.java new file mode 100644 index 0000000..5d50e81 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DictResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.DictEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("字典响应实体") +public class DictResp extends DictEntity { +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java b/core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java deleted file mode 100644 index 050189a..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/CombinedDictMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.CombinedDictEntity; -import com.dite.znpt.domain.vo.CombinedDictListReq; -import com.dite.znpt.domain.vo.CombinedDictResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 字典表数据库访问层 - */ -public interface CombinedDictMapper extends BaseMapper { - List queryBySelective(CombinedDictListReq combinedDictReq); -} - diff --git a/core/src/main/java/com/dite/znpt/mapper/DictMapper.java b/core/src/main/java/com/dite/znpt/mapper/DictMapper.java new file mode 100644 index 0000000..c5bff79 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/DictMapper.java @@ -0,0 +1,18 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.DictEntity; +import com.dite.znpt.domain.vo.DictListReq; +import com.dite.znpt.domain.vo.DictResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典表数据库访问层 + */ +public interface DictMapper extends BaseMapper { + List queryBySelective(DictListReq dictReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/CombinedDictService.java b/core/src/main/java/com/dite/znpt/service/CombinedDictService.java deleted file mode 100644 index 41fbcf0..0000000 --- a/core/src/main/java/com/dite/znpt/service/CombinedDictService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.CombinedDictEntity; -import com.dite.znpt.domain.vo.CombinedDictListReq; -import com.dite.znpt.domain.vo.CombinedDictResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 字典表服务接口 - */ -public interface CombinedDictService extends IService { - - /** - * 功能描述:查询字典列表 - * - * @param combinedDictReq 字典 - * @return {@link List }<{@link CombinedDictEntity }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - List selectList(CombinedDictListReq combinedDictReq); - - /** - * 功能描述:查询单条字典 - * - * @param dictId 字典Id - * @return {@link CombinedDictResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - CombinedDictResp selectById(String dictId); - - /** - * 功能描述:新增字典 - * - * @param combinedDict 字典 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void saveData(CombinedDictEntity combinedDict); - - /** - * 功能描述:更新字典 - * - * @param combinedDict 字典 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void updateData(CombinedDictEntity combinedDict); - - /** - * 功能描述:删除字典 - * - * @param dictId 字典Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - void deleteById(String dictId); -} - diff --git a/core/src/main/java/com/dite/znpt/service/DictService.java b/core/src/main/java/com/dite/znpt/service/DictService.java new file mode 100644 index 0000000..85b2c28 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/DictService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.DictEntity; +import com.dite.znpt.domain.vo.DictListReq; +import com.dite.znpt.domain.vo.DictReq; +import com.dite.znpt.domain.vo.DictResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典表服务接口 + */ +public interface DictService extends IService { + + /** + * 功能描述:查询字典列表 + * + * @param dictReq 字典 + * @return {@link List }<{@link DictResp }> + * @author huise23 + * @date 2025/06/30 11:38 + **/ + List selectList(DictListReq dictReq); + + /** + * 功能描述:查询单条字典 + * + * @param dictId 字典Id + * @return {@link DictResp } + * @author huise23 + * @date 2025/06/30 11:38 + **/ + DictResp selectById(String dictId); + + /** + * 功能描述:新增字典 + * + * @param dictReq 字典 + * @author huise23 + * @date 2025/06/30 11:38 + **/ + void saveData(DictReq dictReq); + + /** + * 功能描述:更新字典 + * + * @param dictReq 字典 + * @author huise23 + * @date 2025/06/30 11:38 + **/ + void updateData(DictReq dictReq); + + /** + * 功能描述:删除字典 + * + * @param dictId 字典Id + * @author huise23 + * @date 2025/06/30 11:38 + **/ + void deleteById(String dictId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java deleted file mode 100644 index e1cbe7d..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/CombinedDictServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.CombinedDictEntity; -import com.dite.znpt.domain.vo.CombinedDictListReq; -import com.dite.znpt.domain.vo.CombinedDictResp; -import com.dite.znpt.service.CombinedDictService; -import com.dite.znpt.mapper.CombinedDictMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - * @Description: 字典表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class CombinedDictServiceImpl extends ServiceImpl implements CombinedDictService { - - /** - * 功能描述:查询字典列表 - * - * @param combinedDictReq 字典信息 - * @return {@link List }<{@link CombinedDictResp }> - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public List selectList(CombinedDictListReq combinedDictReq) { - PageUtil.startPage(); - List combinedDictList= this.baseMapper.queryBySelective(combinedDictReq); - combinedDictList.forEach(resp -> { - - }); - return combinedDictList; - } - - /** - * 功能描述:查询单条字典 - * - * @param dictId 字典Id - * @return {@link CombinedDictResp } - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public CombinedDictResp selectById(String dictId) { - CombinedDictListReq combinedDictReq = new CombinedDictListReq(); - combinedDictReq.setDictId(dictId); - - List list = selectList(combinedDictReq); - return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new CombinedDictResp(); - } - - /** - * 功能描述:新增字典 - * - * @param combinedDict 字典 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void saveData(CombinedDictEntity combinedDict) { -// todo 校验 - save(combinedDict); - } - - /** - * 功能描述:更新字典 - * - * @param combinedDict 字典 - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void updateData(CombinedDictEntity combinedDict) { -// todo 校验 - updateById(combinedDict); - } - - /** - * 功能描述:删除字典 - * - * @param dictId 字典Id - * @author huise23 - * @date 2025/04/11 23:17 - **/ - @Override - public void deleteById(String dictId) { -// todo 校验 - removeById(dictId); - } - -} diff --git a/core/src/main/java/com/dite/znpt/service/impl/DictServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DictServiceImpl.java new file mode 100644 index 0000000..b15ff3b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/DictServiceImpl.java @@ -0,0 +1,103 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.DictEntity; +import com.dite.znpt.domain.vo.DictListReq; +import com.dite.znpt.domain.vo.DictReq; +import com.dite.znpt.domain.vo.DictResp; +import com.dite.znpt.mapper.DictMapper; +import com.dite.znpt.service.DictService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/06/30 11:38 + * @Description: 字典表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class DictServiceImpl extends ServiceImpl implements DictService { + + /** + * 功能描述:查询字典列表 + * + * @param dictReq 字典信息 + * @return {@link List }<{@link DictResp }> + * @author huise23 + * @date 2025/06/30 11:38 + **/ + @Override + public List selectList(DictListReq dictReq) { + PageUtil.startPage(); + List dictList= this.baseMapper.queryBySelective(dictReq); + dictList.forEach(resp -> { + + }); + return dictList; + } + + /** + * 功能描述:查询单条字典 + * + * @param dictId 字典Id + * @return {@link DictResp } + * @author huise23 + * @date 2025/06/30 11:38 + **/ + @Override + public DictResp selectById(String dictId) { + DictListReq dictReq = new DictListReq(); + dictReq.setDictId(dictId); + + List list = selectList(dictReq); + return list.isEmpty() ? CollUtil.getFirst(list) : new DictResp(); + } + + /** + * 功能描述:新增字典 + * + * @param dictReq 字典 + * @author huise23 + * @date 2025/06/30 11:38 + **/ + @Override + public void saveData(DictReq dictReq) { +// todo 校验 + DictEntity entity = BeanUtil.copyProperties(dictReq, DictEntity.class); + save(entity); + } + + /** + * 功能描述:更新字典 + * + * @param dictReq 字典 + * @author huise23 + * @date 2025/06/30 11:38 + **/ + @Override + public void updateData(DictReq dictReq) { +// todo 校验 + DictEntity entity = BeanUtil.copyProperties(dictReq, DictEntity.class); + updateById(entity); + } + + /** + * 功能描述:删除字典 + * + * @param dictId 字典Id + * @author huise23 + * @date 2025/06/30 11:38 + **/ + @Override + public void deleteById(String dictId) { +// todo 校验 + removeById(dictId); + } + +} diff --git a/core/src/main/resources/mapper/CombinedDictMapper.xml b/core/src/main/resources/mapper/DictMapper.xml similarity index 76% rename from core/src/main/resources/mapper/CombinedDictMapper.xml rename to core/src/main/resources/mapper/DictMapper.xml index 81f5ab9..27a87b9 100644 --- a/core/src/main/resources/mapper/CombinedDictMapper.xml +++ b/core/src/main/resources/mapper/DictMapper.xml @@ -1,39 +1,37 @@ - - - - - - a.dict_id, a.dict_type, a.dict_name, a.parent_id, - a.sort_order, a.final_state - - - - - + + + + + + a.dict_id, a.dict_type, a.dict_name, a.parent_id, + a.sort_order, a.final_state, a.create_time, a.create_by, + a.update_time, a.update_by + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java b/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java deleted file mode 100644 index cccf827..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/CombinedDictController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.dite.znpt.web.controller; - - -import com.dite.znpt.constant.Constants; -import com.dite.znpt.domain.vo.CombinedDictListReq; -import com.dite.znpt.domain.vo.CombinedDictResp; -import com.dite.znpt.domain.entity.CombinedDictEntity; -import com.dite.znpt.service.CombinedDictService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author huise23 - * @date 2025/04/11 23:17 - */ -@Api(tags = "字典") -@RestController -@RequestMapping("/combined-dict") -public class CombinedDictController { - @Resource - private CombinedDictService combinedDictService; - - @ApiOperation(value = "获取字典列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(CombinedDictListReq combinedDictReq) { - return PageResult.ok(combinedDictService.selectList(combinedDictReq)); - } - - @ApiOperation(value = "根据字典Id获取详细信息", httpMethod = "GET") - @GetMapping("/{dictId}") - public Result getInfo(@PathVariable String dictId) { - return Result.ok(combinedDictService.selectById(dictId)); - } - - @ApiOperation(value = "新增字典", httpMethod = "POST") - @PostMapping - public Result add(@RequestBody CombinedDictEntity combinedDict) { - combinedDictService.saveData(combinedDict); - return Result.ok(); - } - - @ApiOperation(value = "修改字典", httpMethod = "PUT") - @PutMapping - public Result edit(@RequestBody CombinedDictEntity combinedDict) { - combinedDictService.updateData(combinedDict); - return Result.ok(); - } - - @ApiOperation(value = "删除字典", httpMethod = "DELETE") - @DeleteMapping("/{dictId}") - public Result remove(@PathVariable String dictId) { - combinedDictService.deleteById(dictId); - return Result.ok(); - } - - @ApiOperation(value = "导出字典", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "字典") - public List export(CombinedDictListReq combinedDictReq) { - return combinedDictService.selectList(combinedDictReq); - } - - @ApiOperation(value = "导入字典", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } -} - diff --git a/web/src/main/java/com/dite/znpt/web/controller/DictController.java b/web/src/main/java/com/dite/znpt/web/controller/DictController.java new file mode 100644 index 0000000..31e7a39 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/DictController.java @@ -0,0 +1,62 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.DictListReq; +import com.dite.znpt.domain.vo.DictReq; +import com.dite.znpt.domain.vo.DictResp; +import com.dite.znpt.service.DictService; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author huise23 + * @date 2025/06/30 11:39 + */ +@Api(tags = "字典") +@RestController +@RequestMapping("/dict") +public class DictController { + @Resource + private DictService dictService; + + @ApiOperation(value = "获取字典列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(DictListReq dictReq) { + return PageResult.ok(dictService.selectList(dictReq)); + } + + @ApiOperation(value = "根据字典Id获取详细信息", httpMethod = "GET") + @GetMapping("/{dictId}") + public Result getInfo(@PathVariable String dictId) { + return Result.ok(dictService.selectById(dictId)); + } + + @ApiOperation(value = "新增字典", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DictReq dictReq) { + dictService.saveData(dictReq); + return Result.ok(); + } + + @ApiOperation(value = "修改字典", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody DictReq dictReq) { + dictService.updateData(dictReq); + return Result.ok(); + } + + @ApiOperation(value = "删除字典", httpMethod = "DELETE") + @DeleteMapping("/{dictId}") + public Result remove(@PathVariable String dictId) { + dictService.deleteById(dictId); + return Result.ok(); + } +} + From e73257514b053c8aa40c0958889b2d6fc3ffc689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 30 Jun 2025 17:52:30 +0800 Subject: [PATCH 078/143] =?UTF-8?q?=E8=80=83=E5=8B=A4=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E7=8F=AD=E6=AC=A1=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/constant/Constants.java | 11 ++ .../java/com/dite/znpt/constant/Message.java | 9 + .../java/com/dite/znpt/converts/Converts.java | 6 + .../dite/znpt/domain/entity/MenuEntity.java | 13 +- .../znpt/domain/entity/WorkShiftEntity.java | 85 ++++++++++ .../java/com/dite/znpt/domain/vo/MenuReq.java | 13 +- .../com/dite/znpt/domain/vo/MenuResp.java | 7 +- .../com/dite/znpt/domain/vo/UserInfo.java | 7 +- .../znpt/domain/vo/WorkShiftListResp.java | 54 ++++++ .../com/dite/znpt/domain/vo/WorkShiftReq.java | 59 +++++++ .../dite/znpt/domain/vo/WorkShiftResp.java | 67 ++++++++ .../com/dite/znpt/mapper/WorkShiftMapper.java | 12 ++ .../dite/znpt/service/WorkShiftService.java | 33 ++++ .../znpt/service/impl/MenuServiceImpl.java | 4 + .../service/impl/WorkShitServiceImpl.java | 157 ++++++++++++++++++ .../main/resources/mapper/WorkShiftMapper.xml | 5 + .../web/controller/WorkShiftController.java | 77 +++++++++ 17 files changed, 609 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/WorkShiftEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/WorkShiftListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/WorkShiftReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/WorkShiftResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/WorkShiftMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/WorkShiftService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/WorkShitServiceImpl.java create mode 100644 core/src/main/resources/mapper/WorkShiftMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/WorkShiftController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Constants.java b/core/src/main/java/com/dite/znpt/constant/Constants.java index bb6b6d4..8b5f824 100644 --- a/core/src/main/java/com/dite/znpt/constant/Constants.java +++ b/core/src/main/java/com/dite/znpt/constant/Constants.java @@ -86,4 +86,15 @@ public class Constants { * 1:代表隐藏 */ public static final String VISIBLE_1 = "1"; + + + /** + * 0:代表发布 + */ + public static final String STATUS_PUBLISH = "0"; + + /** + * 1:代表未发布 + */ + public static final String STATUS_UNPUBLISH = "1"; } diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 83e643d..0e67ef7 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -51,4 +51,13 @@ public class Message implements Serializable { public static final String TASK_STATUS_NOT_IN_PROGRESS = "任务状态不是进行中"; public static final String TASK_IN_CYCLE = "父级任务存在循环依赖:"; public static final String TASK_GROUP_ID_NOT_EXIST = "任务组id不存在"; + public static final String WORK_TIME_START_CAN_NOT_BEFORE_WORK_TIME_END = "下班时间不能早于上班时间"; + public static final String REST_TIME_START_CAN_NOT_BEFORE_REST_TIME_END = "休息结束时间不能早于休息开始时间"; + public static final String REST_TIME_START_MUST_BETWEEN_WORK_TIME = "休息开始时间必须是在上班时间范围内"; + public static final String REST_TIME_END_MUST_BETWEEN_WORK_TIME = "休息结束时间必须是在上班时间范围内"; + public static final String EARLY_TIME_LIMIT_CAN_NOT_BEFORE_EARLY_TIME_OFFSET = "早退临界时间不能小于早退豁免时间"; + public static final String LATE_TIME_LIMIT_CAN_NOT_BEFORE_LATE_TIME_OFFSET = "迟到临界时间不能小于迟到豁免时间"; + public static final String WORK_SHIFT_NAME_EXIST = "班次名称已经存在"; + public static final String WORK_SHIFT_NOT_EXIST = "班次不存在"; + public static final String WORK_SHIFT_IS_NOT_UNPUBLISH = "班次的状态不是未发布"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 9a3b0da..61ea9be 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -91,5 +91,11 @@ public interface Converts { InsuranceInfoEntity toInsuranceInfoEntity(InsuranceInfoReq req); AttachInfoResp toAttacheInfoResp(AttachInfoEntity entity); + + List toWorkShiftListResp(List list); + + WorkShiftResp toWorkShiftResp(WorkShiftEntity entity); + + WorkShiftEntity toWorkShiftEntity(WorkShiftReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java index 7161d33..f7b213c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/MenuEntity.java @@ -48,10 +48,15 @@ public class MenuEntity extends AuditableEntity implements Serializable { @TableField("order_num") private Integer orderNum; - @ExcelProperty("请求地址") - @ApiModelProperty("请求地址") - @TableField("url") - private String url; + @ExcelProperty("组件地址") + @ApiModelProperty("组件地址") + @TableField("component") + private String component; + + @ExcelProperty("路由地址") + @ApiModelProperty("路由地址") + @TableField("path") + private String path; @ExcelProperty("菜单类型(M目录 C菜单 F按钮)") @ApiModelProperty("菜单类型(M目录 C菜单 F按钮)") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/WorkShiftEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/WorkShiftEntity.java new file mode 100644 index 0000000..2874c54 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/WorkShiftEntity.java @@ -0,0 +1,85 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalTime; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:08 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("work_shift") +@ApiModel(value="WorkShitEntity对象", description="班次信息") +public class WorkShiftEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 1912356282767651959L; + + @ApiModelProperty("班次id") + @TableId(value = "work_shift_id", type = IdType.ASSIGN_UUID) + private String workShiftId; + + @ApiModelProperty("班次名称") + @TableField("work_shift_name") + private String workShiftName; + + @ApiModelProperty("上班时间") + @TableField("work_time_start") + private LocalTime workTimeStart; + + @ApiModelProperty("迟到豁免时间,单位分钟") + @TableField("late_time_offset") + private Integer lateTimeOffset; + + @ApiModelProperty("迟到时间临界值,单位分钟") + @TableField("late_time_limit") + private Integer lateTimeLimit; + + @ApiModelProperty("下班时间") + @TableField("work_time_end") + private LocalTime workTimeEnd; + + @ApiModelProperty("早退豁免时间,单位分钟") + @TableField("early_time_offset") + private Integer earlyTimeOffset; + + @ApiModelProperty("早退时间临界值,单位分钟") + @TableField("early_time_limit") + private Integer earlyTimeLimit; + + @ApiModelProperty("休息时间开始") + @TableField("rest_time_start") + private LocalTime restTimeStart; + + @ApiModelProperty("休息时间结束") + @TableField("rest_time_end") + private LocalTime restTimeEnd; + + @ApiModelProperty("工作时间长") + @TableField("work_time") + private Integer workTime; + + @ApiModelProperty("状态,0-已发布,1-未发布") + @TableField("status") + private String status; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableField("del_flag") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java index b283c5b..f875972 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java @@ -1,5 +1,7 @@ package com.dite.znpt.domain.vo; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -32,9 +34,14 @@ public class MenuReq implements Serializable { @ApiModelProperty("显示顺序") private Integer orderNum; - @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "请求地址不能超过100个字符") - @ApiModelProperty("请求地址") - private String url; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "路由地址不能超过200个字符") + @ApiModelProperty("路由地址") + private String path; + + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "组件地址不能超过200个字符") + @ExcelProperty("组件地址") + @ApiModelProperty("组件地址") + private String component; @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "菜单类型不能为空") @ApiModelProperty("菜单类型") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java index f533983..7e9ecf3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuResp.java @@ -30,8 +30,11 @@ public class MenuResp implements Serializable { @ApiModelProperty("显示顺序") private String orderNum; - @ApiModelProperty("请求地址") - private String url; + @ApiModelProperty("路由地址") + private String path; + + @ApiModelProperty("组件地址") + private String component; @ApiModelProperty("菜单类型") private String menuType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java index ce5bbfc..4203eed 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserInfo.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** @@ -13,7 +15,10 @@ import java.util.List; */ @Data @ApiModel("用户信息") -public class UserInfo { +public class UserInfo implements Serializable { + + @Serial + private static final long serialVersionUID = 1433874497843073028L; @ApiModelProperty("用户信息") private UserListResp user; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftListResp.java new file mode 100644 index 0000000..c9675e8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftListResp.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:39 + * @description + */ +@Data +@ApiModel("班次信息列表响应实体") +public class WorkShiftListResp implements Serializable { + @Serial + private static final long serialVersionUID = 530703326351692657L; + + @ApiModelProperty("班次id") + private String workShiftId; + + @ApiModelProperty("班次名称") + private String workShiftName; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("上班时间") + private LocalTime workTimeStart; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("下班时间") + private LocalTime workTimeEnd; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态描述") + private String statusLabel; + + @ApiModelProperty("创建人id") + private String createBy; + + @ApiModelProperty("创建人名称") + private String createUserName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("修改时间") + private LocalDateTime updateTime; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftReq.java b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftReq.java new file mode 100644 index 0000000..0a0be7a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftReq.java @@ -0,0 +1,59 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalTime; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:39 + * @description + */ +@Data +@ApiModel("班次信息请求实体") +public class WorkShiftReq implements Serializable { + + @Serial + private static final long serialVersionUID = 3008068678585003135L; + + @NotBlank(message = "班次名称不能为空") + @ApiModelProperty("班次名称") + private String workShiftName; + + @NotNull(message = "上班时间不能为空") + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("上班时间") + private LocalTime workTimeStart; + + @ApiModelProperty("迟到豁免时间,单位分钟") + private Integer lateTimeOffset; + + @ApiModelProperty("迟到时间临界值,单位分钟") + private Integer lateTimeLimit; + + @NotNull(message = "下班时间不能为空") + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("下班时间") + private LocalTime workTimeEnd; + + @ApiModelProperty("早退豁免时间,单位分钟") + private Integer earlyTimeOffset; + + @ApiModelProperty("早退时间临界值,单位分钟") + private Integer earlyTimeLimit; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("休息时间开始") + private LocalTime restTimeStart; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("休息时间结束") + private LocalTime restTimeEnd; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftResp.java b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftResp.java new file mode 100644 index 0000000..62f3bed --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/WorkShiftResp.java @@ -0,0 +1,67 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalTime; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:39 + * @description + */ +@Data +@ApiModel("班次信息响应实体") +public class WorkShiftResp implements Serializable { + @Serial + private static final long serialVersionUID = 7000086760170568103L; + + @ApiModelProperty("班次id") + private String workShiftId; + + @ApiModelProperty("班次名称") + private String workShiftName; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("上班时间") + private LocalTime workTimeStart; + + @ApiModelProperty("迟到豁免时间,单位分钟") + private Integer lateTimeOffset; + + @ApiModelProperty("迟到时间临界值,单位分钟") + private Integer lateTimeLimit; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("下班时间") + private LocalTime workTimeEnd; + + @ApiModelProperty("早退豁免时间,单位分钟") + private Integer earlyTimeOffset; + + @ApiModelProperty("早退时间临界值,单位分钟") + private Integer earlyTimeLimit; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("休息时间开始") + private LocalTime restTimeStart; + + @JsonFormat(pattern = "HH:mm") + @ApiModelProperty("休息时间结束") + private LocalTime restTimeEnd; + + @ApiModelProperty("工作时间长") + private Integer workTime; + + @ApiModelProperty("状态,0-已发布,1-未发布") + private String status; + + @ApiModelProperty("状态,0-已发布,1-未发布") + private String statusLabel; + + +} diff --git a/core/src/main/java/com/dite/znpt/mapper/WorkShiftMapper.java b/core/src/main/java/com/dite/znpt/mapper/WorkShiftMapper.java new file mode 100644 index 0000000..b014e9e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/WorkShiftMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.WorkShiftEntity; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:26 + * @description + */ +public interface WorkShiftMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/WorkShiftService.java b/core/src/main/java/com/dite/znpt/service/WorkShiftService.java new file mode 100644 index 0000000..bbc5d76 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/WorkShiftService.java @@ -0,0 +1,33 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.WorkShiftEntity; +import com.dite.znpt.domain.vo.WorkShiftListResp; +import com.dite.znpt.domain.vo.WorkShiftReq; +import com.dite.znpt.domain.vo.WorkShiftResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:27 + * @description + */ +public interface WorkShiftService extends IService { + + List page(String workShitName); + + List list(String workShitName); + + WorkShiftResp detail(String workShiftId); + + void save(WorkShiftReq req); + + void update(String workShiftId, WorkShiftReq req); + + void publish(String workShiftId); + + void delete(String workShiftId); + + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java index ed656af..7e7c6e5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java @@ -46,9 +46,13 @@ public class MenuServiceImpl extends ServiceImpl impleme tree.setId(treeNode.getMenuId()); tree.setParentId(treeNode.getParentId()); tree.setName(treeNode.getMenuName()); + tree.setWeight(treeNode.getOrderNum()); tree.putExtra("menuType",treeNode.getMenuType()); tree.putExtra("visible",treeNode.getVisible()); tree.putExtra("orderNum",treeNode.getOrderNum()); + tree.putExtra("path",treeNode.getPath()); + tree.putExtra("component",treeNode.getComponent()); + tree.putExtra("perms",treeNode.getPerms()); }); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/WorkShitServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/WorkShitServiceImpl.java new file mode 100644 index 0000000..9cbcf69 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/WorkShitServiceImpl.java @@ -0,0 +1,157 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.WorkShiftEntity; +import com.dite.znpt.domain.vo.WorkShiftListResp; +import com.dite.znpt.domain.vo.WorkShiftReq; +import com.dite.znpt.domain.vo.WorkShiftResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.WorkShiftMapper; +import com.dite.znpt.service.UserService; +import com.dite.znpt.service.WorkShiftService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:28 + * @description + */ +@Service +public class WorkShitServiceImpl extends ServiceImpl implements WorkShiftService { + + @Resource + private UserService userService; + + @Override + public List page(String workShitName) { + PageUtil.startPage(); + return this.list(workShitName); + } + + @Override + public List list(String workShitName) { + List list = this.list(Wrappers.lambdaQuery(WorkShiftEntity.class).eq(WorkShiftEntity::getDelFlag, Constants.DEL_FLAG_0).like(StrUtil.isNotBlank(workShitName), WorkShiftEntity::getWorkShiftName, workShitName)); + List userIds = list.stream().map(WorkShiftEntity::getCreateBy).toList(); + Map userIdMap = !userIds.isEmpty() ? userService.listByIds(userIds).stream().collect(Collectors.toMap(UserEntity::getUserId, Function.identity())): new HashMap<>(); + List result = Converts.INSTANCE.toWorkShiftListResp(list); + result.forEach(workShiftListResp -> { + workShiftListResp.setStatusLabel(Constants.STATUS_UNPUBLISH.equals(workShiftListResp.getStatus()) ? "未发布" : "已发布"); + if(userIdMap.containsKey(workShiftListResp.getCreateBy())){ + workShiftListResp.setCreateUserName(userIdMap.get(workShiftListResp.getCreateBy()).getName()); + } + }); + return result; + } + + @Override + public WorkShiftResp detail(String workShiftId) { + WorkShiftEntity workShift = this.getById(workShiftId); + if(workShift == null || !Constants.DEL_FLAG_0.equals(workShift.getDelFlag())){ + throw new ServiceException(Message.WORK_SHIFT_NOT_EXIST); + } + WorkShiftResp workShiftResp = Converts.INSTANCE.toWorkShiftResp(workShift); + workShiftResp.setStatusLabel(Constants.STATUS_UNPUBLISH.equals(workShiftResp.getStatus()) ? "未发布" : "已发布"); + return workShiftResp; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(WorkShiftReq req) { + List list = this.list(Wrappers.lambdaQuery(WorkShiftEntity.class).eq(WorkShiftEntity::getDelFlag, Constants.DEL_FLAG_0).eq(WorkShiftEntity::getWorkShiftName, req.getWorkShiftName())); + if(!list.isEmpty()){ + throw new ServiceException(Message.WORK_SHIFT_NAME_EXIST); + } + WorkShiftEntity entity = validation(req); + entity.setStatus(Constants.STATUS_UNPUBLISH); + this.save(entity); + } + + private WorkShiftEntity validation(WorkShiftReq req) { + if(req.getWorkTimeEnd().isBefore(req.getWorkTimeStart())){ + throw new ServiceException(Message.WORK_TIME_START_CAN_NOT_BEFORE_WORK_TIME_END); + } + int workTime = req.getWorkTimeEnd().toSecondOfDay() - req.getWorkTimeStart().toSecondOfDay() ; + if(req.getRestTimeEnd() != null && req.getRestTimeStart()!= null){ + if(req.getRestTimeEnd().isBefore(req.getRestTimeStart())){ + throw new ServiceException(Message.REST_TIME_START_CAN_NOT_BEFORE_REST_TIME_END); + } + if(!(req.getRestTimeStart().isAfter(req.getWorkTimeStart()) && req.getRestTimeStart().isBefore(req.getWorkTimeEnd()))){ + throw new ServiceException(Message.REST_TIME_START_MUST_BETWEEN_WORK_TIME); + } + if(!(req.getRestTimeEnd().isAfter(req.getWorkTimeStart()) && req.getRestTimeEnd().isBefore(req.getWorkTimeEnd()))){ + throw new ServiceException(Message.REST_TIME_END_MUST_BETWEEN_WORK_TIME); + } + workTime = workTime - (req.getRestTimeEnd().toSecondOfDay() - req.getRestTimeStart().toSecondOfDay()); + }else { + req.setRestTimeEnd(null); + req.setRestTimeEnd(null); + } + if(req.getEarlyTimeLimit() != null && req.getEarlyTimeOffset()!= null && req.getEarlyTimeLimit() <= req.getEarlyTimeOffset()){ + throw new ServiceException(Message.EARLY_TIME_LIMIT_CAN_NOT_BEFORE_EARLY_TIME_OFFSET); + } + if(req.getLateTimeLimit() != null && req.getLateTimeOffset() != null && req.getLateTimeLimit() <= req.getLateTimeOffset()){ + throw new ServiceException(Message.LATE_TIME_LIMIT_CAN_NOT_BEFORE_LATE_TIME_OFFSET); + } + + WorkShiftEntity entity = Converts.INSTANCE.toWorkShiftEntity(req); + entity.setWorkTime(workTime/60); + return entity; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String workShiftId, WorkShiftReq req) { + WorkShiftEntity workShift = this.getById(workShiftId); + if(workShift == null || !Constants.DEL_FLAG_0.equals(workShift.getDelFlag())){ + throw new ServiceException(Message.WORK_SHIFT_NOT_EXIST); + } + List list = this.list(Wrappers.lambdaQuery(WorkShiftEntity.class).eq(WorkShiftEntity::getDelFlag, Constants.DEL_FLAG_0).eq(WorkShiftEntity::getWorkShiftName, req.getWorkShiftName())); + if(!req.getWorkShiftName().equals(workShift.getWorkShiftName()) && !list.isEmpty()){ + throw new ServiceException(Message.WORK_SHIFT_NAME_EXIST); + } + WorkShiftEntity entity = validation(req); + entity.setWorkShiftId(workShiftId); + this.updateById(entity); + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public void publish(String workShiftId) { + WorkShiftEntity workShift = this.getById(workShiftId); + if(workShift == null || !Constants.DEL_FLAG_0.equals(workShift.getDelFlag())){ + throw new ServiceException(Message.WORK_SHIFT_NOT_EXIST); + } + if(!Constants.STATUS_UNPUBLISH.equals(workShift.getStatus())){ + throw new ServiceException(Message.WORK_SHIFT_IS_NOT_UNPUBLISH); + } + workShift.setStatus(Constants.STATUS_PUBLISH); + this.updateById(workShift); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(String workShiftId) { + WorkShiftEntity workShift = this.getById(workShiftId); + if(workShift == null || !Constants.DEL_FLAG_0.equals(workShift.getDelFlag())){ + throw new ServiceException(Message.WORK_SHIFT_NOT_EXIST); + } + workShift.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(workShift); + } +} diff --git a/core/src/main/resources/mapper/WorkShiftMapper.xml b/core/src/main/resources/mapper/WorkShiftMapper.xml new file mode 100644 index 0000000..4c898ce --- /dev/null +++ b/core/src/main/resources/mapper/WorkShiftMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/WorkShiftController.java b/web/src/main/java/com/dite/znpt/web/controller/WorkShiftController.java new file mode 100644 index 0000000..353d261 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/WorkShiftController.java @@ -0,0 +1,77 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.WorkShiftListResp; +import com.dite.znpt.domain.vo.WorkShiftReq; +import com.dite.znpt.domain.vo.WorkShiftResp; +import com.dite.znpt.service.WorkShiftService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/6/30/周一 10:29 + * @description + */ +@Api(tags = "班次管理") +@RestController +@RequestMapping("/work-shift") +public class WorkShiftController { + + @Resource + private WorkShiftService workShiftService; + + @ApiOperation(value = "分页查询班次信息", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(required = false) String workShitName) { + return PageResult.ok(workShiftService.page(workShitName)); + } + + @ApiOperation(value = "查询班次信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestParam(required = false) String workShiftName) { + return Result.ok(workShiftService.list(workShiftName)); + } + + + @ApiOperation(value = "查询班次详情信息", httpMethod = "GET") + @GetMapping("/detail/{workShiftId}") + public Result detail(@PathVariable String workShiftId) { + return Result.ok(workShiftService.detail(workShiftId)); + } + + @ApiOperation(value = "新增班次信息", httpMethod = "POST") + @PostMapping() + public Result add(@Valid @RequestBody WorkShiftReq req){ + workShiftService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改班次信息", httpMethod = "PUT") + @PutMapping("/{workShiftId}") + public Result edit(@PathVariable String workShiftId, @Valid @RequestBody WorkShiftReq req){ + workShiftService.update(workShiftId, req); + return Result.ok(); + } + + + @ApiOperation(value = "发布班次信息", httpMethod = "PUT") + @PutMapping("/publish/{workShiftId}") + public Result publish(@PathVariable String workShiftId){ + workShiftService.publish(workShiftId); + return Result.ok(); + } + + @ApiOperation(value = "删除班次信息", httpMethod = "DELETE") + @DeleteMapping("/{workShiftId}") + public Result remove(@PathVariable String workShiftId){ + workShiftService.delete(workShiftId); + return Result.ok(); + } +} From 8cba5fe502b2c9879cba65fe75b2747fd3e43d58 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 3 Jul 2025 14:55:07 +0800 Subject: [PATCH 079/143] =?UTF-8?q?1.FilePathEnum=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E8=B7=AF=E5=BE=84=E8=BD=AC=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=202.=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8F=8A=E6=A3=80=E6=B5=8Binit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 13 ++ .../com/dite/znpt/config/WebMvcConfig.java | 5 +- .../com/dite/znpt/config/YoloModelConfig.java | 45 ++++++ .../dite/znpt/config/YoloModelRegistry.java | 112 +++++++++++++ .../com/dite/znpt/domain/bo/Detection.java | 21 +++ .../com/dite/znpt/domain/bo/Letterbox.java | 73 +++++++++ .../com/dite/znpt/domain/bo/ODConfig.java | 55 +++++++ .../znpt/domain/entity/ModelConfigEntity.java | 56 +++++++ .../dite/znpt/domain/entity/PartEntity.java | 15 +- .../znpt/domain/vo/ModelConfigListReq.java | 41 +++++ .../dite/znpt/domain/vo/ModelConfigReq.java | 50 ++++++ .../dite/znpt/domain/vo/ModelConfigResp.java | 18 +++ .../znpt/domain/vo/ProjectTaskImportReq.java | 24 +-- .../znpt/enums/AttachBusinessTypeEnum.java | 1 + .../com/dite/znpt/enums/FilePathEnum.java | 21 ++- .../dite/znpt/mapper/ModelConfigMapper.java | 18 +++ .../java/com/dite/znpt/mapper/PartMapper.java | 4 +- .../dite/znpt/service/AttachInfoService.java | 1 - .../dite/znpt/service/ModelConfigService.java | 65 ++++++++ .../com/dite/znpt/service/PartService.java | 2 +- .../service/impl/AttachInfoServiceImpl.java | 12 +- .../impl/AudioFileInfoServiceImpl.java | 4 +- .../znpt/service/impl/DictServiceImpl.java | 2 +- .../service/impl/ImageCollectServiceImpl.java | 6 +- .../znpt/service/impl/ImageServiceImpl.java | 34 ++-- .../service/impl/ModelConfigServiceImpl.java | 123 +++++++++++++++ .../service/impl/MultiModelYoloService.java | 147 ++++++++++++++++++ .../znpt/service/impl/PartServiceImpl.java | 3 +- .../service/impl/ProjectTaskServiceImpl.java | 13 +- .../impl/VideoFileInfoServiceImpl.java | 16 +- .../java/com/dite/znpt/util/ModelUtil.java | 74 +++++++++ .../resources/mapper/ModelConfigMapper.xml | 34 ++++ .../web/controller/ModelConfigController.java | 83 ++++++++++ 33 files changed, 1105 insertions(+), 86 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/config/YoloModelConfig.java create mode 100644 core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java create mode 100644 core/src/main/java/com/dite/znpt/domain/bo/Detection.java create mode 100644 core/src/main/java/com/dite/znpt/domain/bo/Letterbox.java create mode 100644 core/src/main/java/com/dite/znpt/domain/bo/ODConfig.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ModelConfigEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ModelConfigListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ModelConfigReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ModelConfigResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ModelConfigMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ModelConfigService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ModelConfigServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/MultiModelYoloService.java create mode 100644 core/src/main/java/com/dite/znpt/util/ModelUtil.java create mode 100644 core/src/main/resources/mapper/ModelConfigMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java diff --git a/core/pom.xml b/core/pom.xml index b90f9ba..94afd03 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -149,7 +149,20 @@ 1.3.0-91 compile + + + com.microsoft.onnxruntime + onnxruntime + 1.16.1 + + + + org.openpnp + opencv + 4.7.0-0 + + diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index 7f8d651..c09ff82 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -1,15 +1,12 @@ package com.dite.znpt.config; import cn.hutool.core.collection.ListUtil; -import com.dite.znpt.constant.Constants; import com.dite.znpt.enums.FilePathEnum; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -27,7 +24,7 @@ public class WebMvcConfig implements WebMvcConfigurer { registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); for (FilePathEnum pathEnum : FilePathEnum.values()) { - registry.addResourceHandler(pathEnum.getUrlPath() + "**").addResourceLocations("file:" + pathEnum.getFileAbsolutePath()); + registry.addResourceHandler(pathEnum.getUrlPath() + "**").addResourceLocations("file:" + pathEnum.getFileAbsolutePathPrefix()); } } diff --git a/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java b/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java new file mode 100644 index 0000000..7e92b49 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java @@ -0,0 +1,45 @@ +package com.dite.znpt.config; + +import ai.onnxruntime.OrtEnvironment; +import ai.onnxruntime.OrtException; +import ai.onnxruntime.OrtSession; +import lombok.Getter; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Getter +@Configuration +public class YoloModelConfig { + + private OrtEnvironment env; + private OrtSession session; + private String[] labels; + private List colors; + + @PostConstruct + public void init() throws OrtException { + env = OrtEnvironment.getEnvironment(); + OrtSession.SessionOptions options = new OrtSession.SessionOptions(); + session = env.createSession("d:\\tmp\\best.onnx", options); + + // 解析 labels + String names = session.getMetadata().getCustomMetadata().get("names"); + Pattern pattern = Pattern.compile("'([^']*)'"); + Matcher matcher = pattern.matcher(names); + List labelList = new ArrayList<>(); + colors = new ArrayList<>(); + + Random random = new Random(); + while (matcher.find()) { + labelList.add(matcher.group(1)); + colors.add(new double[]{random.nextDouble()*256, random.nextDouble()*256, random.nextDouble()*256}); + } + labels = labelList.toArray(new String[0]); + } +} diff --git a/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java new file mode 100644 index 0000000..8d3584c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java @@ -0,0 +1,112 @@ +package com.dite.znpt.config; + +import ai.onnxruntime.OrtEnvironment; +import ai.onnxruntime.OrtException; +import ai.onnxruntime.OrtSession; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dite.znpt.domain.entity.ModelConfigEntity; +import com.dite.znpt.enums.FilePathEnum; +import com.dite.znpt.mapper.ModelConfigMapper; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +@Component +@RequiredArgsConstructor +public class YoloModelRegistry { + + private final ModelConfigMapper modelConfigMapper; + + private final Map sessionMap = new ConcurrentHashMap<>(); + private final Map metaMap = new ConcurrentHashMap<>(); + private final Map modelParamMap = new ConcurrentHashMap<>(); + @Getter + private final OrtEnvironment environment = OrtEnvironment.getEnvironment(); + + static { + // 加载opencv动态库 + nu.pattern.OpenCV.loadLocally(); + } + + @PostConstruct + public void loadModelsOnStartup() throws OrtException { + List configs = modelConfigMapper.selectList(Wrappers.emptyWrapper()); + for (ModelConfigEntity config : configs) { + loadModel(config); + } + } + + public void loadModel(ModelConfigEntity config) throws OrtException { + OrtSession.SessionOptions opts = new OrtSession.SessionOptions(); + // 使用gpu,需要本机安装过cuda,并修改pom.xml,不安装也能运行本程序 + // sessionOptions.addCUDA(0); + OrtSession session = environment.createSession(FilePathEnum.ATTACH.getFileAbsolutePath(config.getModelPath()), opts); + String labelStr = session.getMetadata().getCustomMetadata().get("names"); + + // label解析 + List labels = new ArrayList<>(); + List colors = new ArrayList<>(); + Pattern pattern = Pattern.compile("'([^']*)'"); + Matcher matcher = pattern.matcher(labelStr); + Random random = new Random(); + while (matcher.find()) { + labels.add(matcher.group(1)); + colors.add(new double[]{random.nextDouble() * 256, random.nextDouble() * 256, random.nextDouble() * 256}); + } + + sessionMap.put(config.getModelId(), session); + metaMap.put(config.getModelId(), new ModelMetadata(labels.toArray(new String[0]), colors, config)); + modelParamMap.put(config.getModelId(), config); + } + + public OrtSession getSession(String modelId) { + return sessionMap.get(modelId); + } + + public ModelMetadata getMetadata(String modelId) { + return metaMap.get(modelId); + } + + public ModelConfigEntity getModelConfig(String modelId) { + return modelParamMap.get(modelId); + } + + public void unloadModel(String modelId) { + OrtSession session = sessionMap.remove(modelId); + if (session != null) { + try { + session.close(); // 释放 ONNX runtime 资源 + } catch (OrtException e) { + log.warn("模型 {} 卸载时发生错误: {}", modelId, e.getMessage()); + } + } + metaMap.remove(modelId); + } + + public void reloadModel(ModelConfigEntity modelConfig) throws OrtException { + unloadModel(modelConfig.getModelId()); + loadModel(modelConfig); + } + + @Data + @AllArgsConstructor + public static class ModelMetadata { + private String[] labels; + private List colors; + private ModelConfigEntity config; + } +} + diff --git a/core/src/main/java/com/dite/znpt/domain/bo/Detection.java b/core/src/main/java/com/dite/znpt/domain/bo/Detection.java new file mode 100644 index 0000000..68e942c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/bo/Detection.java @@ -0,0 +1,21 @@ +package com.dite.znpt.domain.bo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Detection{ + + @ApiModelProperty("标签") + public String label; + @ApiModelProperty("分类id") + private Integer clsId; + @ApiModelProperty("位置") + private float[] bbox; + @ApiModelProperty("置信度") + private float confidence; +} diff --git a/core/src/main/java/com/dite/znpt/domain/bo/Letterbox.java b/core/src/main/java/com/dite/znpt/domain/bo/Letterbox.java new file mode 100644 index 0000000..b3fa640 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/bo/Letterbox.java @@ -0,0 +1,73 @@ +package com.dite.znpt.domain.bo; + +import lombok.Getter; +import lombok.Setter; +import org.opencv.core.Core; +import org.opencv.core.Mat; +import org.opencv.core.Size; +import org.opencv.imgproc.Imgproc; + +public class Letterbox { + + @Setter + private Size newShape ; + private final double[] color = new double[]{114,114,114}; + private final Boolean auto = false; + private final Boolean scaleUp = true; + @Setter + private Integer stride = 32; + + @Getter + private double ratio; + @Getter + private double dw; + @Getter + private double dh; + + public Letterbox(int w,int h) { + this.newShape = new Size(w, h); + } + + public Letterbox() { + this.newShape = new Size(640, 640); + } + + + public Integer getWidth() { + return (int) this.newShape.width; + } + + public Integer getHeight() { + return (int) this.newShape.height; + } + + public Mat letterbox(Mat im) { // 调整图像大小和填充图像,使满足步长约束,并记录参数 + + int[] shape = {im.rows(), im.cols()}; // 当前形状 [height, width] + // Scale ratio (new / old) + double r = Math.min(this.newShape.height / shape[0], this.newShape.width / shape[1]); + if (!this.scaleUp) { // 仅缩小,不扩大(一且为了mAP) + r = Math.min(r, 1.0); + } + // Compute padding + Size newUnpad = new Size(Math.round(shape[1] * r), Math.round(shape[0] * r)); + double dw = this.newShape.width - newUnpad.width, dh = this.newShape.height - newUnpad.height; // wh 填充 + if (this.auto) { // 最小矩形 + dw = dw % this.stride; + dh = dh % this.stride; + } + dw /= 2; // 填充的时候两边都填充一半,使图像居于中心 + dh /= 2; + if (shape[1] != newUnpad.width || shape[0] != newUnpad.height) { // resize + Imgproc.resize(im, im, newUnpad, 0, 0, Imgproc.INTER_LINEAR); + } + int top = (int) Math.round(dh - 0.1), bottom = (int) Math.round(dh + 0.1); + int left = (int) Math.round(dw - 0.1), right = (int) Math.round(dw + 0.1); + // 将图像填充为正方形 + Core.copyMakeBorder(im, im, top, bottom, left, right, Core.BORDER_CONSTANT, new org.opencv.core.Scalar(this.color)); + this.ratio = r; + this.dh = dh; + this.dw = dw; + return im; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/bo/ODConfig.java b/core/src/main/java/com/dite/znpt/domain/bo/ODConfig.java new file mode 100644 index 0000000..689a7bd --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/bo/ODConfig.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.bo; + +import java.util.*; + +public final class ODConfig { + + + public static final Integer lineThicknessRatio = 333; + public static final Double fontSizeRatio = 1080.0; + + private static final List default_names = new ArrayList<>(Arrays.asList( + "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", + "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", + "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", + "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", + "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", + "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", + "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", + "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", + "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", + "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", + "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", + "teddy bear", "hair drier", "toothbrush")); + + + private static final List names = new ArrayList<>(Arrays.asList( + "no_helmet", "helmet")); + + private final Map colors; + + public ODConfig() { + this.colors = new HashMap<>(); + default_names.forEach(name->{ + Random random = new Random(); + double[] color = {random.nextDouble()*256, random.nextDouble()*256, random.nextDouble()*256}; + colors.put(name, color); + }); + } + + public String getName(int clsId) { + return names.get(clsId); + } + + public double[] getColor(int clsId) { + return colors.get(getName(clsId)); + } + + public double[] getNameColor(String Name){ + return colors.get(Name); + } + + public double[] getOtherColor(int clsId) { + return colors.get(default_names.get(clsId)); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ModelConfigEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ModelConfigEntity.java new file mode 100644 index 0000000..549b9c8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ModelConfigEntity.java @@ -0,0 +1,56 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 模型配置表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("model_config") +@ApiModel(value="ModelConfigEntity对象", description="模型配置表") +public class ModelConfigEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -73052440757340126L; + + @ExcelProperty("模型id") + @ApiModelProperty("模型id") + @TableId(value = "model_id", type = IdType.ASSIGN_ID) + private String modelId; + + @ExcelProperty("模型名称") + @ApiModelProperty("模型名称") + @TableField("model_name") + private String modelName; + + @ExcelProperty("模型路径") + @ApiModelProperty("模型路径") + @TableField("model_path") + private String modelPath; + + @ExcelProperty("模型置信度") + @ApiModelProperty("模型置信度") + @TableField("conf_threshold") + private Float confThreshold; + + @ExcelProperty("非极大抑制") + @ApiModelProperty("非极大抑制") + @TableField("nms_threshold") + private Float nmsThreshold; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java index f602cbf..d29345d 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/PartEntity.java @@ -1,24 +1,27 @@ package com.dite.znpt.domain.entity; -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.domain.AuditableEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; /** * @author huise23 * @date 2025/04/11 23:17 - * @Description: 表实体类 + * @Description: 部件表实体类 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("part") -@ApiModel(value="PartEntity对象", description="表") +@ApiModel(value="PartEntity对象", description="部件表") public class PartEntity extends AuditableEntity implements Serializable { private static final long serialVersionUID = -53853862365306266L; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigListReq.java new file mode 100644 index 0000000..8944150 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigListReq.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 请求实体 + */ +@Data +@ApiModel("列表请求实体") +public class ModelConfigListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -41204426418525667L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("Id") + private String modelId; + + @ApiModelProperty("模型名称") + private String modelName; + + @ApiModelProperty("模型路径") + private String modelPath; + + @ApiModelProperty("模型置信度") + private Float confThreshold; + + @ApiModelProperty("非极大抑制") + private Float nmsThreshold; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigReq.java new file mode 100644 index 0000000..73a3742 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigReq.java @@ -0,0 +1,50 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.*; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 模型配置表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ModelConfig请求对象", description="模型配置表") +public class ModelConfigReq implements Serializable { + + @Serial + private static final long serialVersionUID = 930798215980875267L; + + @ApiModelProperty("模型id") + private String modelId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型名称不能为空") + @Size(max = 50, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型名称长度不能超过50") + @ApiModelProperty("模型名称") + private String modelName; + + @NotEmpty(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型附件不能为空") + @ApiModelProperty("模型附件id") + private String attachId; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型置信度不能为空") + @Min(value = 0, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型置信度只能在0-100之间") + @Max(value = 100, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "模型置信度只能在0-100之间") + @ApiModelProperty("模型置信度") + private Float confThreshold; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "nms不能为空") + @Min(value = 0, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "nms只能在0-1之间") + @Max(value = 1, groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "nms只能在0-1之间") + @ApiModelProperty("nms") + private Float nmsThreshold; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigResp.java new file mode 100644 index 0000000..7b7d588 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ModelConfigResp.java @@ -0,0 +1,18 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.ModelConfigEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("响应实体") +public class ModelConfigResp extends ModelConfigEntity { +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java index c2b6103..bc56499 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java @@ -1,21 +1,13 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.io.Serial; -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.*; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; -import com.dite.znpt.util.ValidationGroup; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; /** * @author huise23 * @date 2025/06/27 14:21 @@ -60,11 +52,11 @@ public class ProjectTaskImportReq implements Serializable { @ExcelProperty(value = "实际结束时间") private LocalDate actualEndDate; - @ExcelProperty(value = "任务状态,0未开始,1进行中,2已结束") - private Integer status; + @ExcelProperty(value = "任务状态(未开始,进行中,已结束)") + private String status; - @ExcelProperty(value = "是否逾期,默认未逾期") - private Integer overdueStatus; + @ExcelProperty(value = "是否逾期(已逾期,未逾期)") + private String overdueStatus; @ExcelProperty(value = "备注") private String remark; diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index c5c0909..502a022 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -15,6 +15,7 @@ import java.util.List; public enum AttachBusinessTypeEnum { PROJECT_TASK("PROJECT_TASK", "项目任务"), INSURANCE_FILE("insurance", "保险文件"), + MODEL_FILE("model", "模型文件"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 596613a..702b30f 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -22,26 +22,37 @@ public enum FilePathEnum { private final String fileRelativePath; /** - * 功能描述:获取文件绝对路径 + * 功能描述:获取文件绝对路径前缀 * * @return {@link String } * @author cuizhibin * @date 2025/06/23 14:46 **/ - public String getFileAbsolutePath() { + public String getFileAbsolutePathPrefix() { return SpringUtil.getBean(Environment.class).getProperty("upload.save-path") + fileRelativePath + FileUtil.FILE_SEPARATOR; } /** - * 功能描述:获取图像下载路径 + * 功能描述:获取文件绝对路径全路径 + * + * @return {@link String } + * @author cuizhibin + * @date 2025/06/23 14:46 + **/ + public String getFileAbsolutePath(String fileDownPath) { + return FileUtil.normalize(getFileAbsolutePathPrefix() + StrUtil.removePrefix(fileDownPath, urlPath)); + } + + /** + * 功能描述:获取下载路径 * * @param absolutePath * @return {@link String } * @author cuizhibin * @date 2025/06/06 09:07 **/ - public String getImageDownPath(String absolutePath) { - String relativePath = StrUtil.removePrefix(absolutePath, getFileAbsolutePath()); + public String getFileDownPath(String absolutePath) { + String relativePath = StrUtil.removePrefix(absolutePath, getFileAbsolutePathPrefix()); return StrUtil.replace(urlPath.concat(relativePath), FileUtil.FILE_SEPARATOR, StrUtil.SLASH); } diff --git a/core/src/main/java/com/dite/znpt/mapper/ModelConfigMapper.java b/core/src/main/java/com/dite/znpt/mapper/ModelConfigMapper.java new file mode 100644 index 0000000..37906a4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ModelConfigMapper.java @@ -0,0 +1,18 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ModelConfigEntity; +import com.dite.znpt.domain.vo.ModelConfigListReq; +import com.dite.znpt.domain.vo.ModelConfigResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 模型配置表数据库访问层 + */ +public interface ModelConfigMapper extends BaseMapper { + List queryBySelective(ModelConfigListReq modelConfigReq); +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/PartMapper.java b/core/src/main/java/com/dite/znpt/mapper/PartMapper.java index efcb3fa..2ec4e0d 100644 --- a/core/src/main/java/com/dite/znpt/mapper/PartMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/PartMapper.java @@ -4,15 +4,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.PartListReq; import com.dite.znpt.domain.vo.PartListResp; -import com.dite.znpt.domain.vo.PartResp; -import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author huise23 * @date 2025/04/11 23:17 - * @Description: 表数据库访问层 + * @Description: 部件表数据库访问层 */ public interface PartMapper extends BaseMapper { List queryBySelective(PartListReq partReq); diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index f11a8df..3c4987f 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -7,7 +7,6 @@ import com.dite.znpt.enums.AttachBusinessTypeEnum; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.rmi.ServerException; import java.util.List; /** diff --git a/core/src/main/java/com/dite/znpt/service/ModelConfigService.java b/core/src/main/java/com/dite/znpt/service/ModelConfigService.java new file mode 100644 index 0000000..052ef99 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ModelConfigService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ModelConfigEntity; +import com.dite.znpt.domain.vo.ModelConfigListReq; +import com.dite.znpt.domain.vo.ModelConfigReq; +import com.dite.znpt.domain.vo.ModelConfigResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 模型配置表服务接口 + */ +public interface ModelConfigService extends IService { + + /** + * 功能描述:查询列表 + * + * @param modelConfigReq + * @return {@link List }<{@link ModelConfigResp }> + * @author huise23 + * @date 2025/07/02 20:57 + **/ + List selectList(ModelConfigListReq modelConfigReq); + + /** + * 功能描述:查询单条 + * + * @param modelId Id + * @return {@link ModelConfigResp } + * @author huise23 + * @date 2025/07/02 20:57 + **/ + ModelConfigResp selectById(String modelId); + + /** + * 功能描述:新增 + * + * @param modelConfigReq + * @author huise23 + * @date 2025/07/02 20:57 + **/ + void saveData(ModelConfigReq modelConfigReq); + + /** + * 功能描述:更新 + * + * @param modelConfigReq + * @author huise23 + * @date 2025/07/02 20:57 + **/ + void updateData(ModelConfigReq modelConfigReq); + + /** + * 功能描述:删除 + * + * @param modelId Id + * @author huise23 + * @date 2025/07/02 20:57 + **/ + void deleteById(String modelId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java index 1eba964..1901493 100644 --- a/core/src/main/java/com/dite/znpt/service/PartService.java +++ b/core/src/main/java/com/dite/znpt/service/PartService.java @@ -13,7 +13,7 @@ import java.util.List; /** * @author huise23 * @date 2025/04/11 23:17 - * @Description: 表服务接口 + * @Description: 部件表服务接口 */ public interface PartService extends IService { diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 2762f34..93c77dd 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -10,17 +10,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.AttachInfoEntity; -import com.dite.znpt.domain.entity.InsuranceInfoEntity; import com.dite.znpt.domain.vo.AttachInfoReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.FilePathEnum; -import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.mapper.FileInfoMapper; +import com.dite.znpt.service.AttachInfoService; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; -import com.dite.znpt.util.PageUtil; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -69,7 +67,7 @@ public class AttachInfoServiceImpl extends ServiceImpl saveData(String businessType, AttachInfoReq infoReq, MultipartFile[] files) { - String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePath().concat(businessType).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.ATTACH.getFileAbsolutePathPrefix().concat(businessType).concat(FileUtil.FILE_SEPARATOR); if(StrUtil.isNotBlank(infoReq.getUserDefinedPath())){ temPathPrefix = temPathPrefix.concat(infoReq.getUserDefinedPath()).concat(FileUtil.FILE_SEPARATOR); } @@ -84,7 +82,7 @@ public class AttachInfoServiceImpl extends ServiceImpl list = new ArrayList<>(); for (MultipartFile file : files) { AudioFileInfoEntity audio = new AudioFileInfoEntity(); @@ -113,7 +113,7 @@ public class AudioFileInfoServiceImpl extends ServiceImpl impleme dictReq.setDictId(dictId); List list = selectList(dictReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new DictResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new DictResp(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index dd87b06..d786566 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -52,8 +52,8 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); - String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); @@ -62,7 +62,7 @@ public class ImageCollectServiceImpl extends ServiceImpl impl Map partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity())); list.forEach(req -> { if(partIdMap.containsKey(req.getPartId())){ - String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); - String temp_path_prefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); + String temp_path_prefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH); File file = new File(req.getImagePath()); if(file.exists() && req.getImagePath().contains(temp_path_prefix)){ ImageEntity entity = new ImageEntity(); @@ -146,12 +142,12 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } List list = new ArrayList<>(files.length); - File temCategory = new File(FilePathEnum.IMAGE_TEMP.getFileAbsolutePath()); + File temCategory = new File(FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix()); if (!temCategory.exists()) { // 创建完整的目录 temCategory.mkdirs(); } - String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); for (MultipartFile file : files) { if (!file.isEmpty()) { try { @@ -173,7 +169,7 @@ public class ImageServiceImpl extends ServiceImpl impl throw new ServiceException(Message.IMAGE_IS_EMPTY); } String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePath().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); if (Objects.nonNull(imageWorkReq)) { path_prefix = path_prefix.concat(StrUtil.emptyToDefault(imageWorkReq.getUploadUser(), "默认用户")).concat(FileUtil.FILE_SEPARATOR) .concat(StrUtil.emptyToDefault(imageWorkReq.getLongitude(), "0")) @@ -188,7 +184,7 @@ public class ImageServiceImpl extends ServiceImpl impl for (MultipartFile multipartFile : files) { String path = path_prefix + multipartFile.getOriginalFilename(); FileUtil.writeBytes(multipartFile.getBytes(),path); - result.add(FilePathEnum.IMAGE.getImageDownPath(path)); + result.add(FilePathEnum.IMAGE.getFileDownPath(path)); } String partId = imageWorkReq.getPartId(); if (StrUtil.isNotEmpty(partId)) { @@ -202,7 +198,7 @@ public class ImageServiceImpl extends ServiceImpl impl List imageList = new ArrayList<>(); result.forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); try { ImageReq imageReq = imageRespBuilder(absolutePath); BeanUtil.copyProperties(imageReq, imageEntity); @@ -251,7 +247,7 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - req.setImagePath(FilePathEnum.IMAGE_TEMP.getImageDownPath(path)); + req.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -308,11 +304,11 @@ public class ImageServiceImpl extends ServiceImpl impl @Override public List listAppUploadImages() { List filePaths = new ArrayList<>(); - PathUtil.walkFiles(Path.of(FilePathEnum.IMAGE.getFileAbsolutePath()), new SimpleFileVisitor<>() { + PathUtil.walkFiles(Path.of(FilePathEnum.IMAGE.getFileAbsolutePathPrefix()), new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { if (path.toFile().isFile()) { - String imageDownPath = FilePathEnum.IMAGE.getImageDownPath(path.toFile().getAbsolutePath()); + String imageDownPath = FilePathEnum.IMAGE.getFileDownPath(path.toFile().getAbsolutePath()); List split = StrUtil.split(imageDownPath, StrUtil.SLASH, true, true); // /static/image/source/date try { @@ -405,7 +401,7 @@ public class ImageServiceImpl extends ServiceImpl impl List newImageList = new ArrayList<>(); partReq.getImagePaths().forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); try { ImageReq imageReq = imageRespBuilder(absolutePath); BeanUtil.copyProperties(imageReq, imageEntity); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ModelConfigServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ModelConfigServiceImpl.java new file mode 100644 index 0000000..b940600 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ModelConfigServiceImpl.java @@ -0,0 +1,123 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.config.YoloModelRegistry; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.ModelConfigEntity; +import com.dite.znpt.domain.vo.ModelConfigListReq; +import com.dite.znpt.domain.vo.ModelConfigReq; +import com.dite.znpt.domain.vo.ModelConfigResp; +import com.dite.znpt.enums.AttachBusinessTypeEnum; +import com.dite.znpt.mapper.ModelConfigMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.ModelConfigService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/02 20:57 + * @Description: 模型配置表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ModelConfigServiceImpl extends ServiceImpl implements ModelConfigService { + + private final YoloModelRegistry modelRegistry; + private final AttachInfoService attachInfoService; + + /** + * 功能描述:查询列表 + * + * @param modelConfigReq 信息 + * @return {@link List }<{@link ModelConfigResp }> + * @author huise23 + * @date 2025/07/02 20:57 + **/ + @Override + public List selectList(ModelConfigListReq modelConfigReq) { + PageUtil.startPage(); + List modelConfigList= this.baseMapper.queryBySelective(modelConfigReq); + modelConfigList.forEach(resp -> { + + }); + return modelConfigList; + } + + /** + * 功能描述:查询单条 + * + * @param modelId Id + * @return {@link ModelConfigResp } + * @author huise23 + * @date 2025/07/02 20:57 + **/ + @Override + public ModelConfigResp selectById(String modelId) { + ModelConfigListReq modelConfigReq = new ModelConfigListReq(); + modelConfigReq.setModelId(modelId); + + List list = selectList(modelConfigReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ModelConfigResp(); + } + + /** + * 功能描述:新增 + * + * @param modelConfigReq + * @author huise23 + * @date 2025/07/02 20:57 + **/ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public void saveData(ModelConfigReq modelConfigReq) { + ModelConfigEntity entity = BeanUtil.copyProperties(modelConfigReq, ModelConfigEntity.class); + AttachInfoEntity attachInfo = attachInfoService.getById(modelConfigReq.getAttachId()); + entity.setModelPath(attachInfo.getAttachPath()); + save(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getModelId(), ListUtil.of(modelConfigReq.getAttachId()), AttachBusinessTypeEnum.MODEL_FILE); + modelRegistry.loadModel(entity); + } + + /** + * 功能描述:更新 + * + * @param modelConfigReq + * @author huise23 + * @date 2025/07/02 20:57 + **/ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public void updateData(ModelConfigReq modelConfigReq) { + ModelConfigEntity entity = BeanUtil.copyProperties(modelConfigReq, ModelConfigEntity.class); + AttachInfoEntity attachInfo = attachInfoService.getById(modelConfigReq.getAttachId()); + entity.setModelPath(attachInfo.getAttachPath()); + attachInfoService.updateBusinessIdByAttachIds(entity.getModelId(), ListUtil.of(modelConfigReq.getAttachId()), AttachBusinessTypeEnum.MODEL_FILE); + updateById(entity); + modelRegistry.reloadModel(entity); + } + + /** + * 功能描述:删除 + * + * @param modelId Id + * @author huise23 + * @date 2025/07/02 20:57 + **/ + @Override + public void deleteById(String modelId) { + modelRegistry.unloadModel(modelId); + removeById(modelId); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/MultiModelYoloService.java b/core/src/main/java/com/dite/znpt/service/impl/MultiModelYoloService.java new file mode 100644 index 0000000..b1946b9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/MultiModelYoloService.java @@ -0,0 +1,147 @@ +package com.dite.znpt.service.impl; + +import ai.onnxruntime.OnnxTensor; +import ai.onnxruntime.OrtEnvironment; +import ai.onnxruntime.OrtException; +import ai.onnxruntime.OrtSession; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.dite.znpt.config.YoloModelRegistry; +import com.dite.znpt.domain.bo.Detection; +import com.dite.znpt.domain.bo.Letterbox; +import com.dite.znpt.domain.bo.ODConfig; +import com.dite.znpt.domain.entity.ModelConfigEntity; +import com.dite.znpt.util.ModelUtil; +import lombok.extern.slf4j.Slf4j; +import org.opencv.core.Mat; +import org.opencv.core.Point; +import org.opencv.core.Scalar; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.nio.FloatBuffer; +import java.util.*; + +@Slf4j +@Service +public class MultiModelYoloService { + + @Autowired + private YoloModelRegistry registry; + + public List detect(String modelId, String inputFile, String outputFile, Float confThreshold) throws OrtException { + OrtSession session = registry.getSession(modelId); + YoloModelRegistry.ModelMetadata meta = registry.getMetadata(modelId); + OrtEnvironment environment = registry.getEnvironment(); + ModelConfigEntity modelConfig = registry.getModelConfig(modelId); + confThreshold = (Objects.isNull(confThreshold) ? modelConfig.getConfThreshold() : confThreshold) / 100; + + Mat img = Imgcodecs.imread(inputFile); + Mat image = img.clone(); + Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2RGB); + + // 在这里先定义下框的粗细、字的大小、字的类型、字的颜色(按比例设置大小粗细比较好一些) + int minDwDh = Math.min(img.width(), img.height()); + int thickness = minDwDh/ ODConfig.lineThicknessRatio; + long start_time = System.currentTimeMillis(); + // 更改 image 尺寸 + Letterbox letterbox = new Letterbox(); + image = letterbox.letterbox(image); + + double ratio = letterbox.getRatio(); + double dw = letterbox.getDw(); + double dh = letterbox.getDh(); + int rows = letterbox.getHeight(); + int cols = letterbox.getWidth(); + int channels = image.channels(); + + // 将Mat对象的像素值赋值给Float[]对象 + float[] pixels = new float[channels * rows * cols]; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + double[] pixel = image.get(j,i); + for (int k = 0; k < channels; k++) { + // 这样设置相当于同时做了image.transpose((2, 0, 1))操作 + pixels[rows*cols*k+j*cols+i] = (float) pixel[k]/255.0f; + } + } + } + + // 创建OnnxTensor对象 + long[] shape = { 1L, (long)channels, (long)rows, (long)cols }; + OnnxTensor tensor = OnnxTensor.createTensor(environment, FloatBuffer.wrap(pixels), shape); + HashMap stringOnnxTensorHashMap = new HashMap<>(); + stringOnnxTensorHashMap.put(session.getInputInfo().keySet().iterator().next(), tensor); + + // 运行推理 + OrtSession.Result output = session.run(stringOnnxTensorHashMap); + float[][] outputData = ((float[][][])output.get(0).getValue())[0]; + + outputData = ModelUtil.transposeMatrix(outputData); + Map> class2Bbox = new HashMap<>(); + + for (float[] bbox : outputData) { + float[] conditionalProbabilities = Arrays.copyOfRange(bbox, 4, bbox.length); + int label = ModelUtil.argmax(conditionalProbabilities); + float conf = conditionalProbabilities[label]; + if (conf < confThreshold) continue; + + bbox[4] = conf; + + // xywh to (x1, y1, x2, y2) + ModelUtil.xywh2xyxy(bbox); + + // skip invalid predictions + if (bbox[0] >= bbox[2] || bbox[1] >= bbox[3]) continue; + + class2Bbox.putIfAbsent(label, new ArrayList<>()); + class2Bbox.get(label).add(bbox); + } + + List detections = new ArrayList<>(); + for (Map.Entry> entry : class2Bbox.entrySet()) { + int label = entry.getKey(); + List bboxes = entry.getValue(); + bboxes = ModelUtil.nonMaxSuppression(bboxes, modelConfig.getNmsThreshold()); + for (float[] bbox : bboxes) { + String labelString = meta.getLabels()[label]; + detections.add(new Detection(labelString,entry.getKey(), Arrays.copyOfRange(bbox, 0, 4), bbox[4])); + } + } + +// 打印检测结果并将图片写入指定目录 + for (Detection detection : detections) { + float[] bbox = detection.getBbox(); + log.info(detection.toString()); + // 画框 + Point topLeft = new Point((bbox[0]-dw)/ratio, (bbox[1]-dh)/ratio); + Point bottomRight = new Point((bbox[2]-dw)/ratio, (bbox[3]-dh)/ratio); + Scalar color = new Scalar(meta.getColors().get(detection.getClsId())); + Imgproc.rectangle(img, topLeft, bottomRight, color, thickness); + // 框上写文字 + Point boxNameLoc = new Point((bbox[0]-dw)/ratio, (bbox[1]-dh-2)/ratio-3); + + Imgproc.putText(img, detection.getLabel(), boxNameLoc, Imgproc.FONT_HERSHEY_SIMPLEX, 2.5, color, thickness); + } + log.info("检测{},发现{}处问题,耗时:{} ms.", inputFile, detections.size(), (System.currentTimeMillis() - start_time)); + + // 保存图像到输出目录 + Imgcodecs.imwrite(outputFile, img); + return detections; + } + + public void runFolderDetection(String modelId, String inputFolder, String outputFolder, Float confThreshold) throws Exception { + List fileList = FileUtil.loopFiles(inputFolder, file -> { + String extName = FileUtil.extName(file); + return StrUtil.equalsAnyIgnoreCase(extName, "jpg", "png"); + }); + for (File file : fileList) { + List detections = detect(modelId, file.getAbsolutePath(), outputFolder+ FileUtil.FILE_SEPARATOR+FileUtil.getName(file), confThreshold); + } + } + +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index f4df3a7..1e5ba8c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -17,7 +17,6 @@ import com.dite.znpt.domain.vo.PartResp; import com.dite.znpt.enums.PartTypeEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.PartMapper; -import com.dite.znpt.mapper.TurbineMapper; import com.dite.znpt.service.PartService; import com.dite.znpt.service.ProjectService; import com.dite.znpt.service.TurbineService; @@ -35,7 +34,7 @@ import java.util.stream.Collectors; /** * @author huise23 * @date 2025/04/11 23:17 - * @Description: 表服务实现类 + * @Description: 部件表服务实现类 */ @Service @RequiredArgsConstructor diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index d734aee..8c26691 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -1,8 +1,8 @@ package com.dite.znpt.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.text.StrBuilder; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -10,20 +10,19 @@ import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.ProjectTaskEntity; import com.dite.znpt.domain.vo.ProjectTaskListReq; -import com.dite.znpt.domain.vo.ProjectTaskResp; import com.dite.znpt.domain.vo.ProjectTaskReq; +import com.dite.znpt.domain.vo.ProjectTaskResp; import com.dite.znpt.domain.vo.ProjectTaskStartReq; import com.dite.znpt.enums.AttachBusinessTypeEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectTaskGroupMapper; +import com.dite.znpt.mapper.ProjectTaskMapper; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.ProjectTaskService; -import com.dite.znpt.mapper.ProjectTaskMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -82,7 +81,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl list = selectList(projectTaskReq); - return list.isEmpty() ? CollUtil.getFirst(list) : new ProjectTaskResp(); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ProjectTaskResp(); } /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java index a93ee3c..fbf09f4 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/VideoFileInfoServiceImpl.java @@ -1,10 +1,10 @@ package com.dite.znpt.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.VideoFileInfoEntity; import com.dite.znpt.domain.vo.VideoFileInfoListReq; @@ -12,15 +12,13 @@ import com.dite.znpt.domain.vo.VideoFileInfoReq; import com.dite.znpt.domain.vo.VideoFileInfoResp; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.VideoFileInfoMapper; import com.dite.znpt.service.PartService; import com.dite.znpt.service.VideoFileInfoService; -import com.dite.znpt.mapper.VideoFileInfoMapper; -import lombok.SneakyThrows; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -120,7 +118,7 @@ public class VideoFileInfoServiceImpl extends ServiceImpl= re) { + re = a[i]; + arg = i; + } + } + return arg; + } + + public static List nonMaxSuppression(List bboxes, float iouThreshold) { + + List bestBboxes = new ArrayList<>(); + + bboxes.sort(Comparator.comparing(a -> a[4])); + + while (!bboxes.isEmpty()) { + float[] bestBbox = bboxes.remove(bboxes.size() - 1); + bestBboxes.add(bestBbox); + bboxes = bboxes.stream().filter(a -> computeIOU(a, bestBbox) < iouThreshold).collect(Collectors.toList()); + } + + return bestBboxes; + } + + public static float computeIOU(float[] box1, float[] box2) { + + float area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]); + float area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]); + + float left = Math.max(box1[0], box2[0]); + float top = Math.max(box1[1], box2[1]); + float right = Math.min(box1[2], box2[2]); + float bottom = Math.min(box1[3], box2[3]); + + float interArea = Math.max(right - left, 0) * Math.max(bottom - top, 0); + float unionArea = area1 + area2 - interArea; + return Math.max(interArea / unionArea, 1e-8f); + + } + +} diff --git a/core/src/main/resources/mapper/ModelConfigMapper.xml b/core/src/main/resources/mapper/ModelConfigMapper.xml new file mode 100644 index 0000000..385cbab --- /dev/null +++ b/core/src/main/resources/mapper/ModelConfigMapper.xml @@ -0,0 +1,34 @@ + + + + + + a.model_id, a.model_name, a.model_path, a.conf_threshold, + a.nms_threshold, a.update_by, a.create_time, a.create_by, + a.update_time + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java b/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java new file mode 100644 index 0000000..51ceb8a --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java @@ -0,0 +1,83 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.config.YoloModelRegistry; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ModelConfigListReq; +import com.dite.znpt.domain.vo.ModelConfigReq; +import com.dite.znpt.domain.vo.ModelConfigResp; +import com.dite.znpt.service.ModelConfigService; +import com.dite.znpt.service.impl.MultiModelYoloService; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author huise23 + * @date 2025/07/02 21:21 + */ +@Api(tags = "模型配置") +@RestController +@RequestMapping("/model-config") +public class ModelConfigController { + @Resource + private ModelConfigService modelConfigService; + @Resource + private YoloModelRegistry registry; + @Autowired + private MultiModelYoloService multiModelYoloService; + + @ApiOperation(value = "获取列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ModelConfigListReq modelConfigReq) { + return PageResult.ok(modelConfigService.selectList(modelConfigReq)); + } + + @ApiOperation(value = "根据Id获取详细信息", httpMethod = "GET") + @GetMapping("/{modelId}") + public Result getInfo(@PathVariable String modelId) { + return Result.ok(modelConfigService.selectById(modelId)); + } + + @ApiOperation(value = "新增", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ModelConfigReq modelConfigReq) { + modelConfigService.saveData(modelConfigReq); + return Result.ok(); + } + + @ApiOperation(value = "修改", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ModelConfigReq modelConfigReq) { + modelConfigService.updateData(modelConfigReq); + return Result.ok(); + } + + @ApiOperation(value = "删除", httpMethod = "DELETE") + @DeleteMapping("/{modelId}") + public Result remove(@PathVariable String modelId) { + modelConfigService.deleteById(modelId); + return Result.ok(); + } + + @PostMapping("/run") + public ResponseEntity runBatch(@RequestParam("modelId") String modelId, + @RequestParam("inputDir") String inputDir, + @RequestParam("outputDir") String outputDir, + @RequestParam("confThreshold") Float confThreshold) { + try { + multiModelYoloService.runFolderDetection(modelId, inputDir, outputDir, confThreshold); + return ResponseEntity.ok("批量推理完成"); + } catch (Exception e) { + return ResponseEntity.status(500).body("处理失败:" + e.getMessage()); + } + } +} + From 3dd13474b6fe501c578845db3651c08c73668162 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 3 Jul 2025 16:28:21 +0800 Subject: [PATCH 080/143] =?UTF-8?q?1.=E6=96=BD=E5=B7=A5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomLocalDateTimeDeserializer.java | 20 +++++++ .../com/dite/znpt/config/JacksonConfig.java | 3 + .../dite/znpt/domain/vo/DefectMarkReq.java | 41 +++++++++++++ .../dite/znpt/domain/vo/TConstructionReq.java | 57 +++++++++++++++++++ .../com/dite/znpt/enums/DefectTypeEnum.java | 2 +- .../znpt/service/TConstructionService.java | 9 +-- .../impl/TConstructionServiceImpl.java | 24 ++++---- .../com/dite/znpt/util/ValidationGroup.java | 3 +- .../znpt/web/controller/DefectController.java | 27 ++++++++- .../web/controller/ModelConfigController.java | 14 ----- .../controller/TConstructionController.java | 21 +++---- 11 files changed, 175 insertions(+), 46 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java diff --git a/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java new file mode 100644 index 0000000..9e3e1e6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java @@ -0,0 +1,20 @@ +package com.dite.znpt.config; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class CustomLocalDateTimeDeserializer extends JsonDeserializer { + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String date = p.getText(); + return LocalDateTimeUtil.parse(date, FORMATTER); + } +} diff --git a/core/src/main/java/com/dite/znpt/config/JacksonConfig.java b/core/src/main/java/com/dite/znpt/config/JacksonConfig.java index 2ac506a..8c7a729 100644 --- a/core/src/main/java/com/dite/znpt/config/JacksonConfig.java +++ b/core/src/main/java/com/dite/znpt/config/JacksonConfig.java @@ -9,6 +9,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import java.time.LocalDateTime; + /** * @date 2022/3/20 10:34 上午 * @description: @@ -25,6 +27,7 @@ public class JacksonConfig { SimpleModule simpleModule = new SimpleModule(); //JSON Long ==> String simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer()); objectMapper.registerModule(simpleModule); return objectMapper; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java new file mode 100644 index 0000000..358d979 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("缺陷记录列表请求实体") +public class DefectMarkReq implements Serializable { + + @Serial + private static final long serialVersionUID = 585419070823466048L; + + @ApiModelProperty("图片id") + private String imageId; + + @ApiModelProperty("图片集id") + private String collectId; + + @NotBlank(groups = {ValidationGroup.Request.class}, message = "模型id不能为空") + @ApiModelProperty("模型id") + private String modelId; + + @NotNull(groups = {ValidationGroup.Request.class}, message = "模型置信度不能为空") + @Min(value = 0, groups = {ValidationGroup.Request.class}, message = "模型置信度只能在0-100之间") + @Max(value = 100, groups = {ValidationGroup.Request.class}, message = "模型置信度只能在0-100之间") + @ApiModelProperty("置信度") + private float confThreshold; + + @ApiModelProperty("缺陷类型") + private List defectTypeList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java new file mode 100644 index 0000000..04dc591 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +/** + * @author huise23 + * @date 2025/07/03 16:25 + * @Description: 施工信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="TConstruction请求对象", description="施工信息表") +public class TConstructionReq implements Serializable { + + @Serial + private static final long serialVersionUID = 583631934062856440L; + + @ApiModelProperty("施工id") + private String constructionId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组id") + private String turbineCode; + + @ApiModelProperty("作业开始时间") + private LocalDateTime startTime; + + @ApiModelProperty("作业结束时间") + private LocalDateTime endTime; + + @ApiModelProperty("温度(℃)") + private Double temperature; + + @ApiModelProperty("风速(m/s)") + private Double windSpeed; + + @ApiModelProperty("采集图片数量") + private Integer imageCount; + + @ApiModelProperty("天气id") + private String weatherCode; + + @ApiModelProperty("施工状态") + private String statusId; + + @ApiModelProperty("当前时间") + private LocalDateTime createdAt; +} + diff --git a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java index 4d44f20..68505b5 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java @@ -13,7 +13,7 @@ import java.util.List; */ @Getter public enum DefectTypeEnum { - CRAZE("CRAZE", "合缝开裂"), + CRAZE("BMLW", "合缝开裂"), ABRASION("ABRASION", "合缝磨损"), LEATHER_BREAKAGE("LEATHER_BREAKAGE", "蒙皮破损"), FABRIC_BREAKAGE("FABRIC_BREAKAGE", "布层破损"), diff --git a/core/src/main/java/com/dite/znpt/service/TConstructionService.java b/core/src/main/java/com/dite/znpt/service/TConstructionService.java index 0506feb..18cb3c5 100644 --- a/core/src/main/java/com/dite/znpt/service/TConstructionService.java +++ b/core/src/main/java/com/dite/znpt/service/TConstructionService.java @@ -3,6 +3,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TConstructionEntity; import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionReq; import com.dite.znpt.domain.vo.TConstructionResp; import java.util.List; @@ -37,20 +38,20 @@ public interface TConstructionService extends IService { /** * 功能描述:新增施工信息 * - * @param tConstruction 施工信息 + * @param req 施工信息 * @author huise23 * @date 2025/04/11 23:17 **/ - void saveData(TConstructionEntity tConstruction); + void saveData(TConstructionReq req); /** * 功能描述:更新施工信息 * - * @param tConstruction 施工信息 + * @param req 施工信息 * @author huise23 * @date 2025/04/11 23:17 **/ - void updateData(TConstructionEntity tConstruction); + void updateData(TConstructionReq req); /** * 功能描述:删除施工信息 diff --git a/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java index 8e8ddfb..603f602 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TConstructionServiceImpl.java @@ -1,15 +1,17 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.entity.TConstructionEntity; import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionReq; import com.dite.znpt.domain.vo.TConstructionResp; -import com.dite.znpt.service.TConstructionService; import com.dite.znpt.mapper.TConstructionMapper; -import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.TConstructionService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; @@ -60,27 +62,25 @@ public class TConstructionServiceImpl extends ServiceImpl runBatch(@Validated(ValidationGroup.Request.class) @RequestBody DefectMarkReq markReq, + @RequestParam("outputDir") String outputDir, + @RequestParam("confThreshold") Float confThreshold) { + try { +// multiModelYoloService.runFolderDetection(modelId, inputDir, outputDir, confThreshold); + return ResponseEntity.ok("批量推理完成"); + } catch (Exception e) { + return ResponseEntity.status(500).body("处理失败:" + e.getMessage()); + } + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java b/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java index 51ceb8a..faa9c64 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ModelConfigController.java @@ -13,7 +13,6 @@ import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -66,18 +65,5 @@ public class ModelConfigController { modelConfigService.deleteById(modelId); return Result.ok(); } - - @PostMapping("/run") - public ResponseEntity runBatch(@RequestParam("modelId") String modelId, - @RequestParam("inputDir") String inputDir, - @RequestParam("outputDir") String outputDir, - @RequestParam("confThreshold") Float confThreshold) { - try { - multiModelYoloService.runFolderDetection(modelId, inputDir, outputDir, confThreshold); - return ResponseEntity.ok("批量推理完成"); - } catch (Exception e) { - return ResponseEntity.status(500).body("处理失败:" + e.getMessage()); - } - } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java index 521eb8f..0be2d88 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TConstructionController.java @@ -2,12 +2,13 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Constants; -import com.dite.znpt.domain.vo.TConstructionListReq; -import com.dite.znpt.domain.vo.TConstructionResp; -import com.dite.znpt.domain.entity.TConstructionEntity; -import com.dite.znpt.service.TConstructionService; -import com.dite.znpt.domain.Result; import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.TConstructionEntity; +import com.dite.znpt.domain.vo.TConstructionListReq; +import com.dite.znpt.domain.vo.TConstructionReq; +import com.dite.znpt.domain.vo.TConstructionResp; +import com.dite.znpt.service.TConstructionService; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import com.pig4cloud.plugin.excel.vo.ErrorMessage; @@ -21,7 +22,7 @@ import java.util.List; /** * @author huise23 - * @date 2025/04/11 23:17 + * @date 2025/07/03 16:25 */ @Api(tags = "施工信息") @RestController @@ -44,15 +45,15 @@ public class TConstructionController { @ApiOperation(value = "新增施工信息", httpMethod = "POST") @PostMapping - public Result add(@RequestBody TConstructionEntity tConstruction) { - tConstructionService.saveData(tConstruction); + public Result add(@RequestBody TConstructionReq tConstructionReq) { + tConstructionService.saveData(tConstructionReq); return Result.ok(); } @ApiOperation(value = "修改施工信息", httpMethod = "PUT") @PutMapping - public Result edit(@RequestBody TConstructionEntity tConstruction) { - tConstructionService.updateData(tConstruction); + public Result edit(@RequestBody TConstructionReq tConstructionReq) { + tConstructionService.updateData(tConstructionReq); return Result.ok(); } From 8788c6f7e417a4ac09d98802c2fc8e2f384a30f4 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 3 Jul 2025 16:34:43 +0800 Subject: [PATCH 081/143] =?UTF-8?q?1.=E6=96=BD=E5=B7=A5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/config/YoloModelConfig.java | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/config/YoloModelConfig.java diff --git a/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java b/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java deleted file mode 100644 index 7e92b49..0000000 --- a/core/src/main/java/com/dite/znpt/config/YoloModelConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.config; - -import ai.onnxruntime.OrtEnvironment; -import ai.onnxruntime.OrtException; -import ai.onnxruntime.OrtSession; -import lombok.Getter; -import org.springframework.context.annotation.Configuration; - -import javax.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@Getter -@Configuration -public class YoloModelConfig { - - private OrtEnvironment env; - private OrtSession session; - private String[] labels; - private List colors; - - @PostConstruct - public void init() throws OrtException { - env = OrtEnvironment.getEnvironment(); - OrtSession.SessionOptions options = new OrtSession.SessionOptions(); - session = env.createSession("d:\\tmp\\best.onnx", options); - - // 解析 labels - String names = session.getMetadata().getCustomMetadata().get("names"); - Pattern pattern = Pattern.compile("'([^']*)'"); - Matcher matcher = pattern.matcher(names); - List labelList = new ArrayList<>(); - colors = new ArrayList<>(); - - Random random = new Random(); - while (matcher.find()) { - labelList.add(matcher.group(1)); - colors.add(new double[]{random.nextDouble()*256, random.nextDouble()*256, random.nextDouble()*256}); - } - labels = labelList.toArray(new String[0]); - } -} From 09064b201d959300a21c01cb9dce160464dcb970 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 3 Jul 2025 16:40:24 +0800 Subject: [PATCH 082/143] =?UTF-8?q?1.=E6=96=BD=E5=B7=A5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/TConstructionEntity.java | 15 +++++++++------ .../dite/znpt/domain/vo/TConstructionListReq.java | 10 +++++----- .../com/dite/znpt/domain/vo/TConstructionReq.java | 2 +- .../main/resources/mapper/TConstructionMapper.xml | 6 +++--- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java index 0664380..405016d 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TConstructionEntity.java @@ -1,16 +1,19 @@ package com.dite.znpt.domain.entity; -import java.time.LocalDateTime; -import java.io.Serializable; - import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.domain.AuditableEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.time.LocalDateTime; + /** * @author sakura * @date 2025/04/10 13:35 @@ -36,8 +39,8 @@ public class TConstructionEntity extends AuditableEntity implements Serializable @ExcelProperty("机组id") @ApiModelProperty("机组id") - @TableField("turbine_code") - private String turbineCode; + @TableField("turbine_id") + private String turbineId; @ExcelProperty("作业开始时间") @ApiModelProperty("作业开始时间") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java index cf9c96a..6176d92 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionListReq.java @@ -1,13 +1,13 @@ package com.dite.znpt.domain.vo; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.io.Serializable; - import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + /** * @author huise23 * @date 2025/04/24 13:44 @@ -29,7 +29,7 @@ public class TConstructionListReq implements Serializable { private String projectId; @ApiModelProperty("机组id") - private String turbineCode; + private String turbineId; @ApiModelProperty("作业开始时间") private LocalDateTime startTime; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java index 04dc591..06aefc1 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TConstructionReq.java @@ -28,7 +28,7 @@ public class TConstructionReq implements Serializable { private String projectId; @ApiModelProperty("机组id") - private String turbineCode; + private String turbineId; @ApiModelProperty("作业开始时间") private LocalDateTime startTime; diff --git a/core/src/main/resources/mapper/TConstructionMapper.xml b/core/src/main/resources/mapper/TConstructionMapper.xml index 423b98d..a70371f 100644 --- a/core/src/main/resources/mapper/TConstructionMapper.xml +++ b/core/src/main/resources/mapper/TConstructionMapper.xml @@ -3,7 +3,7 @@ - a.construction_id, a.project_id, a.turbine_code, a.start_time, + a.construction_id, a.project_id, a.turbine_id, a.start_time, a.end_time, a.temperature, a.wind_speed, a.image_count, a.weather_code, a.status_id, a.created_at @@ -22,8 +22,8 @@ and a.project_id like concat ('%', #{projectId}, '%') - - and a.turbine_code like concat ('%', #{turbineCode}, '%') + + and a.turbine_id like concat ('%', #{turbineId}, '%') and a.start_time = #{startTime} From caf716c12661554ec1e40640fb44d96e50b26380 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 4 Jul 2025 10:12:11 +0800 Subject: [PATCH 083/143] =?UTF-8?q?1.=E5=9B=BE=E5=83=8F=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=A2=9E=E5=8A=A0=E9=83=A8=E4=BB=B6id?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java | 3 +++ core/src/main/resources/mapper/ImageMapper.xml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index c507576..e523da5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -24,6 +24,9 @@ public class ImageListReq implements Serializable { @ApiModelProperty("机组id") private String turbineId; + @ApiModelProperty("部件id") + private String partId; + @ApiModelProperty("图像类型") private String[] imageTypes; diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 9800029..44ebd86 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -16,6 +16,9 @@ AND p.turbine_id = #{turbineId} + + AND p.part_id = #{partId} + AND i.image_type in #{imageType} From cffae035dba82847966972e845b67ab77f4875cc Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 4 Jul 2025 13:40:47 +0800 Subject: [PATCH 084/143] =?UTF-8?q?1.=E5=9B=BE=E5=83=8F=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A2=9E=E5=8A=A0=E5=85=A5=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B8=A4=E6=AD=A5=E6=93=8D=E4=BD=9C=E6=97=B6?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=8B=BF=E5=88=B0=E4=B8=8A=E4=BC=A0=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../com/dite/znpt/service/DefectService.java | 15 +++++-- .../com/dite/znpt/service/ImageService.java | 2 +- .../znpt/service/impl/DefectServiceImpl.java | 22 ++++++++-- .../znpt/service/impl/ImageServiceImpl.java | 24 ++++++++--- .../znpt/web/controller/DefectController.java | 40 +------------------ .../znpt/web/controller/ImageController.java | 14 +++---- 7 files changed, 59 insertions(+), 59 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 0e67ef7..fdb9de4 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -17,6 +17,7 @@ public class Message implements Serializable { public static final String ATTACH_FILE_IS_NOT_EXIST = "不存在{}的附件文件"; public static final String IMAGE_PATH_IS_NOT_EXIST = "图像地址不存在"; public static final String IMAGE_ID_IS_NOT_EXIST = "图像id不存在"; + public static final String IMAGE_SOURCE_IS_NOT_EXIST = "图像类型不存在"; public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; diff --git a/core/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java index 1a0fdb1..573c5f1 100644 --- a/core/src/main/java/com/dite/znpt/service/DefectService.java +++ b/core/src/main/java/com/dite/znpt/service/DefectService.java @@ -2,10 +2,7 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.DefectEntity; -import com.dite.znpt.domain.vo.DefectListReq; -import com.dite.znpt.domain.vo.DefectReq; -import com.dite.znpt.domain.vo.DefectResp; -import com.dite.znpt.domain.vo.OutWorkDefectReq; +import com.dite.znpt.domain.vo.*; import java.util.List; @@ -75,5 +72,15 @@ public interface DefectService extends IService { * @date 2025/04/11 23:17 **/ void deleteById(String defectId); + + /** + * 功能描述:缺陷自动检测 + * + * @param markReq 马克请求类 + * @return {@link DefectResp } + * @author cuizhibin + * @date 2025/07/04 10:55 + **/ + DefectResp detect(DefectMarkReq markReq); } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 1b6dfaa..af583a7 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -23,7 +23,7 @@ public interface ImageService extends IService { ImageResp detail(String imageId); - List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files); + List batchUploadDefectImage(String partId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files); List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index 9259bb5..59b2093 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -11,12 +11,13 @@ import com.dite.znpt.enums.DefectSourceEnum; import com.dite.znpt.enums.DefectTypeEnum; import com.dite.znpt.enums.RepairStatusEnum; import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.service.DefectService; import com.dite.znpt.mapper.DefectMapper; +import com.dite.znpt.service.DefectService; import com.dite.znpt.service.ImageService; -import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -36,6 +37,8 @@ import java.util.stream.Collectors; public class DefectServiceImpl extends ServiceImpl implements DefectService { @Resource private ImageService imageService; + @Autowired + private MultiModelYoloService multiModelYoloService; /** * 功能描述:查询缺陷记录列表 @@ -150,4 +153,17 @@ public class DefectServiceImpl extends ServiceImpl i this.removeById(defectId); } + /** + * 功能描述:缺陷自动检测 + * + * @param markReq 马克请求类 + * @return {@link DefectResp } + * @author cuizhibin + * @date 2025/07/04 10:55 + **/ + @Override + public DefectResp detect(DefectMarkReq markReq) { +// multiModelYoloService.runFolderDetection(); + return null; + } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index ee0d44c..86cdeba 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -17,10 +17,7 @@ import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.*; -import com.dite.znpt.enums.FilePathEnum; -import com.dite.znpt.enums.ImageTypeEnum; -import com.dite.znpt.enums.ShootingMethodEnum; -import com.dite.znpt.enums.WeatherEnum; +import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageMapper; import com.dite.znpt.service.AudioFileInfoService; @@ -134,7 +131,10 @@ public class ImageServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) @Override - public List batchUploadDefectImage(String partId, String imageSource, MultipartFile[] files) { + public List batchUploadDefectImage(String partId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files) { + if (StrUtil.isEmpty(imageSource) || Objects.nonNull(ImageSourceEnum.getByCode(imageSource))) { + throw new ServiceException(Message.IMAGE_SOURCE_IS_NOT_EXIST); + } if(null == partService.getById(partId)){ throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); } @@ -148,17 +148,29 @@ public class ImageServiceImpl extends ServiceImpl impl temCategory.mkdirs(); } String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); + ImageCollectEntity imageCollect = BeanUtil.copyProperties(collectReq, ImageCollectEntity.class); + imageCollect.setCollectId(IdUtil.simpleUUID()); + List imageList = new ArrayList<>(); for (MultipartFile file : files) { + ImageEntity imageEntity = new ImageEntity(); if (!file.isEmpty()) { try { String path = temPathPrefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); - list.add(imageRespBuilder(path)); + ImageReq imageReq = imageRespBuilder(path); + BeanUtil.copyProperties(imageReq, imageEntity); + list.add(imageReq); + imageEntity.setImagePath(path); + imageEntity.setPartId(partId); + imageEntity.setCollectId(imageCollect.getCollectId()); + imageList.add(imageEntity); } catch (Exception e) { e.printStackTrace(); } } } + imageCollectService.save(imageCollect); + baseMapper.insert(imageList); return list; } diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 2c41797..65a3d21 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -1,25 +1,16 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; import com.dite.znpt.domain.vo.DefectMarkReq; import com.dite.znpt.domain.vo.DefectReq; import com.dite.znpt.domain.vo.DefectResp; import com.dite.znpt.service.DefectService; -import com.dite.znpt.service.impl.MultiModelYoloService; import com.dite.znpt.util.ValidationGroup; -import com.pig4cloud.plugin.excel.annotation.RequestExcel; -import com.pig4cloud.plugin.excel.annotation.ResponseExcel; -import com.pig4cloud.plugin.excel.vo.ErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -36,8 +27,6 @@ import java.util.List; public class DefectController { @Resource private DefectService defectService; - @Autowired - private MultiModelYoloService multiModelYoloService; @ApiOperation(value = "分页查询缺陷记录列表", httpMethod = "GET") @GetMapping("/page") @@ -78,35 +67,10 @@ public class DefectController { return Result.ok(); } - @ApiOperation(value = "导出缺陷记录", httpMethod = "GET") - @GetMapping("/export") - @ResponseExcel(name = "缺陷记录") - public List export(DefectListReq defectReq) { - return defectService.page(defectReq); - } - - @ApiOperation(value = "导入缺陷记录", httpMethod = "POST") - @PostMapping("/import") - public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { - // JSR 303 校验通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - if (errorMessageList != null && !errorMessageList.isEmpty()) { - return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); - } - return Result.okM("导入"+dataList.size()+"条数据"); - } - @ApiOperation(value = "单图自动标注缺陷", httpMethod = "POST") @PostMapping("/run") - public ResponseEntity runBatch(@Validated(ValidationGroup.Request.class) @RequestBody DefectMarkReq markReq, - @RequestParam("outputDir") String outputDir, - @RequestParam("confThreshold") Float confThreshold) { - try { -// multiModelYoloService.runFolderDetection(modelId, inputDir, outputDir, confThreshold); - return ResponseEntity.ok("批量推理完成"); - } catch (Exception e) { - return ResponseEntity.status(500).body("处理失败:" + e.getMessage()); - } + public Result runBatch(@Validated(ValidationGroup.Request.class) @RequestBody DefectMarkReq markReq) { + return Result.ok(defectService.detect(markReq)); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index f4fb332..9a9ce07 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -51,16 +51,16 @@ public class ImageController { } @ApiOperation(value = "批量上传图像", httpMethod = "POST") - @PostMapping("/upload-batch/{partId}") - public Result> uploadBatch(@PathVariable String partId, @RequestParam("files") MultipartFile[] files) { - return Result.ok(imageService.batchUploadDefectImage(partId, ImageSourceEnum.COLLECT.getCode(), files)); + @PostMapping("/{imageSource}/upload-batch/{partId}") + public Result> uploadBatch(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("files") MultipartFile[] files) { + return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files)); } - @ApiOperation(value = "外部工作上传图像", httpMethod = "POST") - @PostMapping("/out-work/upload/{partId}") - public Result uploadOutWork( @PathVariable String partId, @RequestParam("file") MultipartFile file) { + @ApiOperation(value = "上传图像", httpMethod = "POST") + @PostMapping("/{imageSource}/upload/{partId}") + public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { MultipartFile[] files = {file}; - return Result.ok(imageService.batchUploadDefectImage(partId, ImageSourceEnum.OUT_WORK.getCode(), files).get(0).getImagePath()); + return Result.ok(imageService.batchUploadDefectImage(partId, ImageSourceEnum.OUT_WORK.getCode(), collectReq, files).get(0).getImagePath()); } @ApiOperation(value = "设置信息", httpMethod = "POST") From cbe77aeef31e0a38bf55ca28510ffe13818d98ee Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 4 Jul 2025 13:50:30 +0800 Subject: [PATCH 085/143] =?UTF-8?q?1.=E5=9B=BE=E5=83=8F=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/ImageServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 86cdeba..35a8728 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -132,7 +132,7 @@ public class ImageServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) @Override public List batchUploadDefectImage(String partId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files) { - if (StrUtil.isEmpty(imageSource) || Objects.nonNull(ImageSourceEnum.getByCode(imageSource))) { + if (StrUtil.isEmpty(imageSource) || Objects.isNull(ImageSourceEnum.getByCode(imageSource))) { throw new ServiceException(Message.IMAGE_SOURCE_IS_NOT_EXIST); } if(null == partService.getById(partId)){ @@ -160,7 +160,7 @@ public class ImageServiceImpl extends ServiceImpl impl ImageReq imageReq = imageRespBuilder(path); BeanUtil.copyProperties(imageReq, imageEntity); list.add(imageReq); - imageEntity.setImagePath(path); + imageEntity.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); imageEntity.setPartId(partId); imageEntity.setCollectId(imageCollect.getCollectId()); imageList.add(imageEntity); From 105e33946431886168570f970fa0f8da87c71579 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 4 Jul 2025 15:36:26 +0800 Subject: [PATCH 086/143] =?UTF-8?q?1.=E7=BC=BA=E9=99=B7=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=A0=87=E6=B3=A8=E4=BF=AE=E6=94=B9=202.=E5=A2=9E=E5=8A=A0dev?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=EF=BC=8C=E9=81=BF=E5=85=8D=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=97=AE=E9=A2=98=E8=B7=AF=E5=BE=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../dite/znpt/domain/vo/DefectMarkReq.java | 3 - .../com/dite/znpt/domain/vo/DefectReq.java | 4 ++ .../com/dite/znpt/domain/vo/DefectResp.java | 8 +-- .../com/dite/znpt/enums/DefectTypeEnum.java | 2 +- .../com/dite/znpt/enums/FilePathEnum.java | 3 +- .../com/dite/znpt/enums/ImageSourceEnum.java | 22 +++---- .../com/dite/znpt/service/DefectService.java | 6 +- .../znpt/service/impl/DefectServiceImpl.java | 58 ++++++++++++++++--- .../znpt/service/impl/ImageServiceImpl.java | 2 +- .../znpt/web/controller/CommonController.java | 2 +- .../znpt/web/controller/DefectController.java | 4 +- .../znpt/web/controller/ImageController.java | 3 +- web/src/main/resources/application-dev.yml | 2 +- 14 files changed, 77 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index fdb9de4..e0e5adc 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -61,4 +61,5 @@ public class Message implements Serializable { public static final String WORK_SHIFT_NAME_EXIST = "班次名称已经存在"; public static final String WORK_SHIFT_NOT_EXIST = "班次不存在"; public static final String WORK_SHIFT_IS_NOT_UNPUBLISH = "班次的状态不是未发布"; + public static final String IMAGE_AUTO_MARK_ERROR = "自动标注出错:"; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java index 358d979..0b2367c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectMarkReq.java @@ -23,9 +23,6 @@ public class DefectMarkReq implements Serializable { @ApiModelProperty("图片id") private String imageId; - @ApiModelProperty("图片集id") - private String collectId; - @NotBlank(groups = {ValidationGroup.Request.class}, message = "模型id不能为空") @ApiModelProperty("模型id") private String modelId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java index f34d318..c4a45cd 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.domain.bo.Detection; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -51,6 +52,9 @@ public class DefectReq implements Serializable { @ApiModelProperty("标注信息") private String labelInfo; + @ApiModelProperty("标注信息") + private Detection markInfo; + @ApiModelProperty("说明") private String description; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java index 73f6444..4ff545f 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java @@ -1,16 +1,11 @@ package com.dite.znpt.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.time.LocalDate; /** * @author huise23 @@ -27,6 +22,9 @@ public class DefectResp extends DefectReq implements Serializable { @ApiModelProperty("缺陷id") private String defectId; + @ApiModelProperty("图像id") + private String imageId; + @ApiModelProperty("缺陷类型描述") private String defectTypeLabel; diff --git a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java index 68505b5..4ea3f4d 100644 --- a/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/DefectTypeEnum.java @@ -13,7 +13,7 @@ import java.util.List; */ @Getter public enum DefectTypeEnum { - CRAZE("BMLW", "合缝开裂"), + BMLW("bmlw", "表面裂纹"), ABRASION("ABRASION", "合缝磨损"), LEATHER_BREAKAGE("LEATHER_BREAKAGE", "蒙皮破损"), FABRIC_BREAKAGE("FABRIC_BREAKAGE", "布层破损"), diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 702b30f..3c522a7 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -14,8 +14,7 @@ public enum FilePathEnum { IMAGE_TEMP("/static/image/temp/", "image-temp"), VIDEO("/static/video/", "video"), AUDIO("/static/audio/", "audio"), - ATTACH("/static/attach/", "attach"), - INSURANCE("/static/insurance/", "insurance"); + ATTACH("/static/attach/", "attach"); @Getter private final String urlPath; diff --git a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java index 8919e04..c69ee63 100644 --- a/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/ImageSourceEnum.java @@ -13,19 +13,17 @@ import java.util.List; */ @Getter public enum ImageSourceEnum { - COLLECT("collect", "图像采集", Boolean.TRUE), - OUT_WORK("out-work", "外部工作", Boolean.TRUE), - IN_WORK("in-work", "内部工作", Boolean.TRUE), - LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作", Boolean.FALSE); + COLLECT("collect", "图像采集"), + OUT_WORK("out-work", "外部工作"), + IN_WORK("in-work", "内部工作"), + LIGHTNING_PROTECTING_WORK("lightning-protection-work", "防雷工作"); private final String code; private final String desc; - private final boolean isDefectImage; - ImageSourceEnum(String code, String desc, boolean isDefectImage){ + ImageSourceEnum(String code, String desc){ this.code = code; this.desc = desc; - this.isDefectImage = isDefectImage; } public static ImageSourceEnum getByCode(String code){ @@ -42,14 +40,12 @@ public enum ImageSourceEnum { return null == e ? null : e.desc; } - public static List list(Boolean isDefectImage){ + public static List list(){ List list = new ArrayList<>(ImageSourceEnum.values().length); for (ImageSourceEnum e : ImageSourceEnum.values() ) { - if(isDefectImage.equals(e.isDefectImage)){ - JSONObject jsonObject = new JSONObject(); - jsonObject.set(e.code, e.desc); - list.add(jsonObject); - } + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); } return list; } diff --git a/core/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java index 573c5f1..4796f8c 100644 --- a/core/src/main/java/com/dite/znpt/service/DefectService.java +++ b/core/src/main/java/com/dite/znpt/service/DefectService.java @@ -77,10 +77,10 @@ public interface DefectService extends IService { * 功能描述:缺陷自动检测 * * @param markReq 马克请求类 - * @return {@link DefectResp } + * @return {@link List }<{@link DefectResp }> * @author cuizhibin - * @date 2025/07/04 10:55 + * @date 2025/07/04 14:53 **/ - DefectResp detect(DefectMarkReq markReq); + List detect(DefectMarkReq markReq); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index 59b2093..8bc2ad5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -1,15 +1,17 @@ package com.dite.znpt.service.impl; +import ai.onnxruntime.OrtException; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.bo.Detection; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.*; -import com.dite.znpt.enums.DefectSourceEnum; -import com.dite.znpt.enums.DefectTypeEnum; -import com.dite.znpt.enums.RepairStatusEnum; +import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.DefectMapper; import com.dite.znpt.service.DefectService; @@ -21,9 +23,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -51,12 +55,19 @@ public class DefectServiceImpl extends ServiceImpl i @Override public List page(DefectListReq req) { PageUtil.startPage(); - return this.list(req); + List list = this.list(req); + list.forEach(defect -> { + defect.setMarkInfo(JSONUtil.toBean(defect.getLabelInfo(), Detection.class)); + }); + return list; } @Override public List list(DefectListReq req) { List defectList= this.baseMapper.queryBySelective(req); + defectList.forEach(defect -> { + defect.setMarkInfo(JSONUtil.toBean(defect.getLabelInfo(), Detection.class)); + }); return defectList; } @@ -72,9 +83,10 @@ public class DefectServiceImpl extends ServiceImpl i public DefectResp detail(String defectId) { DefectResp defectResp = this.baseMapper.detail(defectId); defectResp.setDefectTypeLabel(DefectTypeEnum.getDescByCode(defectResp.getDefectType())); - defectResp.setDefectLevel(DefectTypeEnum.getDescByCode(defectResp.getDefectLevel())); + defectResp.setDefectLevel(DefectLevelEnum.getDescByCode(defectResp.getDefectLevel())); defectResp.setRepairStatusLabel(RepairStatusEnum.getDescByCode(defectResp.getRepairStatus())); defectResp.setSourceLabel(DefectSourceEnum.getDescByCode(defectResp.getSourceLabel())); + defectResp.setMarkInfo(JSONUtil.toBean(defectResp.getLabelInfo(), Detection.class)); return defectResp; } @@ -94,6 +106,7 @@ public class DefectServiceImpl extends ServiceImpl i } DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); defectEntity.setImageId(imageId); + defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); this.save(defectEntity); } @@ -115,6 +128,7 @@ public class DefectServiceImpl extends ServiceImpl i if(imageMap.containsKey(key)){ DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); defectEntity.setImageId(imageMap.get(key).getImageId()); + defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); defectEntityList.add(defectEntity); } }); @@ -137,6 +151,7 @@ public class DefectServiceImpl extends ServiceImpl i throw new ServiceException(Message.DEFECT_ID_IS_NOT_EXIST); } DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); + defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); this.updateById(defectEntity); } @@ -157,13 +172,38 @@ public class DefectServiceImpl extends ServiceImpl i * 功能描述:缺陷自动检测 * * @param markReq 马克请求类 - * @return {@link DefectResp } + * @return {@link List }<{@link DefectResp }> * @author cuizhibin * @date 2025/07/04 10:55 **/ @Override - public DefectResp detect(DefectMarkReq markReq) { -// multiModelYoloService.runFolderDetection(); - return null; + public List detect(DefectMarkReq markReq) { + ImageEntity image = imageService.getById(markReq.getImageId()); + if (Objects.isNull(image)) { + throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); + } + FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath()); + String outputPath = FileUtil.getParent(inputPath, 1).concat(FileUtil.mainName(inputPath)+"_mark").concat(StrUtil.DOT).concat(FileUtil.extName(inputPath)); + try { + List detect = multiModelYoloService.detect(markReq.getModelId(), inputPath, outputPath, markReq.getConfThreshold()); + List respList = new ArrayList<>(); + for (Detection detection : detect) { + DefectResp resp = new DefectResp(); + resp.setImageId(markReq.getImageId()); + resp.setDefectType(detection.getLabel()); + resp.setDefectTypeLabel(DefectTypeEnum.getDescByCode(detection.getLabel())); + resp.setDetectionDate(LocalDate.now()); + resp.setSource(DefectSourceEnum.AI.getCode()); + resp.setSourceLabel(DefectSourceEnum.AI.getDesc()); + resp.setMarkInfo(detection); + resp.setRepairStatus(RepairStatusEnum.INCOMPLETE.getCode()); + resp.setRepairStatusLabel(RepairStatusEnum.INCOMPLETE.getDesc()); + respList.add(resp); + } + return respList; + } catch (OrtException e) { + throw new ServiceException(Message.IMAGE_AUTO_MARK_ERROR + e.getMessage()); + } } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 35a8728..95dca45 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -148,7 +148,7 @@ public class ImageServiceImpl extends ServiceImpl impl temCategory.mkdirs(); } String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); - ImageCollectEntity imageCollect = BeanUtil.copyProperties(collectReq, ImageCollectEntity.class); + ImageCollectEntity imageCollect = Optional.ofNullable(BeanUtil.copyProperties(collectReq, ImageCollectEntity.class)).orElse(new ImageCollectEntity()); imageCollect.setCollectId(IdUtil.simpleUUID()); List imageList = new ArrayList<>(); for (MultipartFile file : files) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 94f0d86..4e96b3b 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -90,7 +90,7 @@ public class CommonController { @ApiOperation(value = "查询通用图片来源", httpMethod = "GET") @GetMapping("/list/common-image-source") public Result listCommonImageSource(){ - return Result.ok(ImageSourceEnum.list(Boolean.FALSE)); + return Result.ok(ImageSourceEnum.list()); } @ApiOperation(value = "查询学历", httpMethod = "GET") diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 65a3d21..5634ea3 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -68,8 +68,8 @@ public class DefectController { } @ApiOperation(value = "单图自动标注缺陷", httpMethod = "POST") - @PostMapping("/run") - public Result runBatch(@Validated(ValidationGroup.Request.class) @RequestBody DefectMarkReq markReq) { + @PostMapping("/detect") + public Result> runBatch(@Validated(ValidationGroup.Request.class) @RequestBody DefectMarkReq markReq) { return Result.ok(defectService.detect(markReq)); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 9a9ce07..4c3ed4c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -4,7 +4,6 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.*; -import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.service.ImageCollectService; import com.dite.znpt.service.ImageService; import io.swagger.annotations.Api; @@ -60,7 +59,7 @@ public class ImageController { @PostMapping("/{imageSource}/upload/{partId}") public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { MultipartFile[] files = {file}; - return Result.ok(imageService.batchUploadDefectImage(partId, ImageSourceEnum.OUT_WORK.getCode(), collectReq, files).get(0).getImagePath()); + return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files).get(0).getImagePath()); } @ApiOperation(value = "设置信息", httpMethod = "POST") diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index bbc969b..d2f6810 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -8,7 +8,7 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://39.99.201.243:3306/znpt_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: BUw8YW6%@^8q druid: From a0b239f34e0265c6f4eb5a66199e2f5fc396bfc1 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 4 Jul 2025 16:09:58 +0800 Subject: [PATCH 087/143] =?UTF-8?q?1.=E7=BC=BA=E9=99=B7=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E6=A0=87=E6=B3=A8=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BC=BA=E9=99=B7=E6=A0=87=E6=B3=A8=E5=9B=BE=E7=89=87=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/vo/DefectReq.java | 3 +++ .../com/dite/znpt/domain/vo/DefectResp.java | 3 +++ .../znpt/enums/AttachBusinessTypeEnum.java | 1 + .../znpt/service/impl/DefectServiceImpl.java | 21 ++++++++++++++++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java index c4a45cd..d07b6c0 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectReq.java @@ -60,4 +60,7 @@ public class DefectReq implements Serializable { @ApiModelProperty("维修建议") private String repairIdea; + + @ApiModelProperty("附件id") + private String attachId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java index 4ff545f..e2efbde 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectResp.java @@ -37,5 +37,8 @@ public class DefectResp extends DefectReq implements Serializable { @ApiModelProperty("来源描述") private String sourceLabel; + @ApiModelProperty("缺陷附件路径") + private String attachPath; + } diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 502a022..096af63 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -16,6 +16,7 @@ public enum AttachBusinessTypeEnum { PROJECT_TASK("PROJECT_TASK", "项目任务"), INSURANCE_FILE("insurance", "保险文件"), MODEL_FILE("model", "模型文件"), + DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index 8bc2ad5..c30661b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -1,6 +1,7 @@ package com.dite.znpt.service.impl; import ai.onnxruntime.OrtException; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @@ -8,12 +9,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.bo.Detection; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.DefectMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.DefectService; import com.dite.znpt.service.ImageService; import com.dite.znpt.util.PageUtil; @@ -43,6 +46,8 @@ public class DefectServiceImpl extends ServiceImpl i private ImageService imageService; @Autowired private MultiModelYoloService multiModelYoloService; + @Autowired + private AttachInfoService attachInfoService; /** * 功能描述:查询缺陷记录列表 @@ -107,6 +112,7 @@ public class DefectServiceImpl extends ServiceImpl i DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); defectEntity.setImageId(imageId); defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); + attachInfoService.updateBusinessIdByAttachIds(defectEntity.getImageId(), ListUtil.of(req.getAttachId()), AttachBusinessTypeEnum.DEFECT_MARK_PIC); this.save(defectEntity); } @@ -153,6 +159,7 @@ public class DefectServiceImpl extends ServiceImpl i DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); this.updateById(defectEntity); + attachInfoService.updateBusinessIdByAttachIds(defectEntity.getImageId(), ListUtil.of(req.getAttachId()), AttachBusinessTypeEnum.DEFECT_MARK_PIC); } /** @@ -177,6 +184,7 @@ public class DefectServiceImpl extends ServiceImpl i * @date 2025/07/04 10:55 **/ @Override + @Transactional(rollbackFor = Exception.class) public List detect(DefectMarkReq markReq) { ImageEntity image = imageService.getById(markReq.getImageId()); if (Objects.isNull(image)) { @@ -184,7 +192,16 @@ public class DefectServiceImpl extends ServiceImpl i } FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath()); - String outputPath = FileUtil.getParent(inputPath, 1).concat(FileUtil.mainName(inputPath)+"_mark").concat(StrUtil.DOT).concat(FileUtil.extName(inputPath)); +// 写入attach同层级文件夹下 + String attachPath = FilePathEnum.ATTACH.getUrlPath() + StrUtil.removePrefix(image.getImagePath(), pathEnum.getUrlPath()); + String outputPath = FilePathEnum.ATTACH.getFileAbsolutePath(attachPath); + FileUtil.mkParentDirs(outputPath); + + AttachInfoEntity attachInfo = new AttachInfoEntity(); + attachInfo.setBusinessId(image.getImageId()); + attachInfo.setAttachPath(attachPath); + attachInfo.setBusinessType(AttachBusinessTypeEnum.DEFECT_MARK_PIC.getCode()); + attachInfoService.save(attachInfo); try { List detect = multiModelYoloService.detect(markReq.getModelId(), inputPath, outputPath, markReq.getConfThreshold()); List respList = new ArrayList<>(); @@ -199,6 +216,8 @@ public class DefectServiceImpl extends ServiceImpl i resp.setMarkInfo(detection); resp.setRepairStatus(RepairStatusEnum.INCOMPLETE.getCode()); resp.setRepairStatusLabel(RepairStatusEnum.INCOMPLETE.getDesc()); + resp.setAttachId(attachInfo.getAttachId()); + resp.setAttachPath(attachPath); respList.add(resp); } return respList; From 693e09ca6136b652ef65fc31e5e48dfc667904fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Fri, 4 Jul 2025 17:48:31 +0800 Subject: [PATCH 088/143] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 2 + .../com/dite/znpt/domain/vo/LoginReq.java | 2 +- .../znpt/domain/vo/ModifyPasswordReq.java | 34 +++++++++++ .../com/dite/znpt/service/AuthService.java | 3 + .../znpt/service/impl/AuthServiceImpl.java | 58 +++++++++++++++---- .../znpt/web/controller/AuthController.java | 11 +++- 6 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ModifyPasswordReq.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index e0e5adc..7e4c060 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -28,6 +28,8 @@ public class Message implements Serializable { public static final String MOBILE_EXIST = "手机号码已经存在,请重新输入"; public static final String EMAIL_EXIST = "邮箱已经存在,请重新输入"; public static final String IDENTITY_CARD_EXIST = "身份证已经存在,请重新输入"; + public static final String OLD_PASSWORD_EQUAL_NEW_PASSWORD = "身份证已经存在,请重新输入"; + public static final String OLD_PASSWORD_IS_ERROR = "旧密码错误,请重新输入"; public static final String DEPT_PARENT_NOT_EXIST = "父级部门不存在"; public static final String DEPT_ID_NOT_EXIST = "部门id不存在"; public static final String POST_ID_NOT_EXIST = "岗位id不存在"; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java b/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java index c434484..4a6b6fe 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/LoginReq.java @@ -25,6 +25,6 @@ public class LoginReq implements Serializable { private String account; @NotBlank(message = "密码不能为空") - @ApiModelProperty("密码,密文传输,采用aes加密,秘钥为账号") + @ApiModelProperty("密码,密文传输,密码加密采用aes(加密模式ECB,填充方式PKCS#7)加密传输,加密密钥产生逻辑:对账号做md5()计算,然后取值8-24位。") private String password; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ModifyPasswordReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ModifyPasswordReq.java new file mode 100644 index 0000000..cd60a05 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ModifyPasswordReq.java @@ -0,0 +1,34 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/22/周四 17:36 + * @description + */ +@Data +@ApiModel("修改密码请求实体") +public class ModifyPasswordReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5458522057381605255L; + + @NotBlank(message = "账号不能为空") + @ApiModelProperty("账号") + private String account; + + @NotBlank(message = "旧密码不能为空") + @ApiModelProperty("旧密码,密文传输,密码加密采用aes(加密模式ECB,填充方式PKCS#7)加密传输,加密密钥产生逻辑:对账号做md5()计算,然后取值8-24位。") + private String oldPassword; + + @NotBlank(message = "新密码不能为空") + @ApiModelProperty("新密码,密文传输,密码加密采用aes(加密模式ECB,填充方式PKCS#7)加密传输,加密密钥产生逻辑:对账号做md5()计算,然后取值8-24位。") + private String newPassword; +} diff --git a/core/src/main/java/com/dite/znpt/service/AuthService.java b/core/src/main/java/com/dite/znpt/service/AuthService.java index dd54c0d..956913a 100644 --- a/core/src/main/java/com/dite/znpt/service/AuthService.java +++ b/core/src/main/java/com/dite/znpt/service/AuthService.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.SaTokenInfo; import cn.hutool.core.lang.tree.Tree; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.ModifyPasswordReq; import com.dite.znpt.domain.vo.UserInfo; import java.util.List; @@ -17,6 +18,8 @@ public interface AuthService { Result doLogin(LoginReq req); + void modifyPassword(ModifyPasswordReq req); + void doLogout(); List> getMenuInfo(String userId); diff --git a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java index 29591f1..d5b52a7 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java @@ -1,27 +1,35 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentInfo; import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.entity.DeptEntity; +import com.dite.znpt.domain.entity.MenuEntity; +import com.dite.znpt.domain.entity.RoleMenuEntity; +import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.ModifyPasswordReq; import com.dite.znpt.domain.vo.RoleResp; import com.dite.znpt.domain.vo.UserInfo; import com.dite.znpt.enums.TerminalTypeEnum; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.*; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -52,23 +60,21 @@ public class AuthServiceImpl implements AuthService { @Override public Result doLogin(LoginReq req) { - String key = SecureUtil.md5(req.getAccount()).substring(8,24); UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); if(null == user){ return Result.error(Constants.ACCOUNT_ERROR_EXCEPTION, Constants.ACCOUNT_ERROR_EXCEPTION_MESSAGE); } - try { - String password = SecureUtil.aes(key.getBytes()).decryptStr(req.getPassword()); - String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(password).concat(user.getSalt())); - if(!pwdCiphertext.equals(user.getPassword())){ - return Result.error(Constants.PASSWORD_ERROR_EXCEPTION, Constants.PASSWORD_ERROR_EXCEPTION_MESSAGE); - } - }catch (Exception e){ - return Result.error(Constants.PASSWORD_EXCEPTION, Constants.PASSWORD_EXCEPTION_MESSAGE); - } if(!user.getStatus().equals(Constants.STATUS_0)){ return Result.error(Constants.USER_DISABLE_EXCEPTION, Constants.USER_DISABLE_EXCEPTION_MESSAGE); } + + String key = SecureUtil.md5(req.getAccount()).substring(8,24); + String password = SecureUtil.aes(key.getBytes()).decryptStr(req.getPassword()); + String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(password).concat(user.getSalt())); + if(!pwdCiphertext.equals(user.getPassword())){ + return Result.error(Constants.PASSWORD_ERROR_EXCEPTION, Constants.PASSWORD_ERROR_EXCEPTION_MESSAGE); + } + if(user.getIsDefaultPassword()){ return Result.error(Constants.DEFAULT_PASSWORD_EXCEPTION, Constants.DEFAULT_PASSWORD_EXCEPTION_MESSAGE); } @@ -80,6 +86,34 @@ public class AuthServiceImpl implements AuthService { return Result.ok(StpUtil.getTokenInfo()); } + @Transactional(rollbackFor = Exception.class) + @Override + public void modifyPassword(ModifyPasswordReq req) { + if(req.getOldPassword().equals(req.getNewPassword())){ + throw new ServiceException(Message.OLD_PASSWORD_EQUAL_NEW_PASSWORD); + } + UserEntity user = userService.getOne(Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getAccount, req.getAccount()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0)); + if(null == user){ + throw new ServiceException(Constants.ACCOUNT_ERROR_EXCEPTION_MESSAGE); + } + if(!user.getStatus().equals(Constants.STATUS_0)){ + throw new ServiceException(Constants.USER_DISABLE_EXCEPTION_MESSAGE); + } + String key = SecureUtil.md5(req.getAccount()).substring(8,24); + String oldPassword = SecureUtil.aes(key.getBytes()).decryptStr(req.getOldPassword()); + String pwdCiphertext = SecureUtil.md5(req.getAccount().concat(oldPassword).concat(user.getSalt())); + if(!pwdCiphertext.equals(user.getPassword())){ + throw new ServiceException(Message.OLD_PASSWORD_IS_ERROR); + } + String newPassword = SecureUtil.aes(key.getBytes()).decryptStr(req.getNewPassword()); + String salt = RandomUtil.randomString(req.getAccount(), 4); + user.setSalt(salt); + user.setPassword(SaSecureUtil.md5(req.getAccount().concat(newPassword).concat(salt))); + user.setIsDefaultPassword(Boolean.FALSE); + userService.updateById(user); + + } + @Override public void doLogout() { StpUtil.logout(); diff --git a/web/src/main/java/com/dite/znpt/web/controller/AuthController.java b/web/src/main/java/com/dite/znpt/web/controller/AuthController.java index 745b7a2..405eb8c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/AuthController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/AuthController.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.tree.Tree; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.LoginReq; +import com.dite.znpt.domain.vo.ModifyPasswordReq; import com.dite.znpt.domain.vo.UserInfo; import com.dite.znpt.service.AuthService; import io.swagger.annotations.Api; @@ -13,6 +14,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; /** @@ -30,10 +32,17 @@ public class AuthController { @ApiOperation(value = "登录",httpMethod = "POST", notes = "密码加密采用aes(加密模式ECB,填充方式PKCS#7)加密传输,加密密钥产生逻辑:对账号做md5()计算,然后取值8-24位。demo数据:账号:admin,加密后的密码:Csq+AVwlEzX3r5vfxL7d/g== 账号:tino,加密后的密码:owbegSu4cMJRD4CiWO+WyQ==") @PostMapping("/login") - public Result login(@Validated @RequestBody LoginReq req) { + public Result login(@Valid @RequestBody LoginReq req) { return authService.doLogin(req); } + @ApiOperation(value = "修改密码", httpMethod = "PUT") + @PutMapping("/modify-password") + public Result modifyPassword(@Valid @RequestBody ModifyPasswordReq req){ + authService.modifyPassword(req); + return Result.ok(); + } + @GetMapping("/userInfo") @ApiOperation(value = "获取用户信息",httpMethod = "GET") public Result userInfo() { From 5f77b1a3a75f043f6f620efce5fe4a26b5720e14 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 6 Jul 2025 10:01:37 +0800 Subject: [PATCH 089/143] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BF=94=E5=9B=9E=E5=9B=BE=E7=89=87=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/vo/ImageListResp.java | 6 +++--- core/src/main/resources/mapper/ImageMapper.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index cf8088b..5be2861 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -1,7 +1,5 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.domain.entity.AudioFileInfoEntity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -28,9 +26,11 @@ public class ImageListResp implements Serializable { private String imageId; @ApiModelProperty("图像名称") - @TableField("image_name") private String imageName; + @ApiModelProperty("图像路径") + private String imagePath; + @ApiModelProperty("部件id") private String partId; diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 44ebd86..f409ebf 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,7 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id From 7787724b9da0438a23cb7bf6d85d93a3b683c642 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 6 Jul 2025 12:35:16 +0800 Subject: [PATCH 090/143] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=8A=A5=E9=94=99=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/vo/ImageCollectReq.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java index e225d93..c95417c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -1,10 +1,10 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.io.Serializable; @@ -23,10 +23,12 @@ public class ImageCollectReq implements Serializable { @Serial private static final long serialVersionUID = 8937301872925896770L; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("拍摄时间-起") private LocalDateTime shootingTimeBegin; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("拍摄时间-止") private LocalDateTime shootingTimeEnd; From a9149df19c92f2574d55f52b7bf9d3d854a28121 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 6 Jul 2025 15:35:33 +0800 Subject: [PATCH 091/143] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/resources/mapper/DefectMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index 525b015..8aaf74b 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -9,7 +9,7 @@ FROM defect d LEFT JOIN image i ON d.image_id = i.image_id LEFT JOIN image_collect ic ON ic.collect_id = i.collect_id - LEFT JOIN part p ON ic.part_id = p.part_id + LEFT JOIN part p ON i.part_id = p.part_id # AND (d.defect_name LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%') OR d.defect_code LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%')) From db2b42af57021b259dd6807043493ebbd46668de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 7 Jul 2025 10:25:26 +0800 Subject: [PATCH 092/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/domain/vo/MenuReq.java | 2 +- .../java/com/dite/znpt/domain/vo/UserReq.java | 1 + .../znpt/service/impl/AuthServiceImpl.java | 5 ++- .../znpt/service/impl/MenuServiceImpl.java | 4 +- .../znpt/service/impl/UserServiceImpl.java | 37 +++++++++---------- .../znpt/web/controller/UserController.java | 6 +-- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java index f875972..8381526 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/MenuReq.java @@ -28,7 +28,7 @@ public class MenuReq implements Serializable { @ApiModelProperty("菜单名称") private String menuName; - @ApiModelProperty("父级菜单id") + @ApiModelProperty("父级菜单id,父级菜单修改无效") private String parentId; @ApiModelProperty("显示顺序") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java index 0b49e39..aec17e3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserReq.java @@ -24,6 +24,7 @@ public class UserReq implements Serializable { @Serial private static final long serialVersionUID = -5491849652107338027L; + @NotBlank(message = "账号不能为空") @Pattern(groups = {ValidationGroup.Insert.class},regexp = "^[a-zA-Z0-9_]{4,20}$", message = "只能包含字母、数字或下划线,长度4-20") @ApiModelProperty("账号") private String account; diff --git a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java index d5b52a7..4808ef2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AuthServiceImpl.java @@ -131,7 +131,10 @@ public class AuthServiceImpl implements AuthService { private void saveSession(String userId){ StpUtil.getSession().set("userInfo", queryUserInfo(userId)); - StpUtil.getSession().set("menuInfo", queryMenuInfo(userId)); + List> menuInfo = queryMenuInfo(userId); + if(!menuInfo.isEmpty()){ + StpUtil.getSession().set("menuInfo", menuInfo); + } } private UserInfo queryUserInfo(String userId){ diff --git a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java index 7e7c6e5..8893e9d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/MenuServiceImpl.java @@ -73,11 +73,13 @@ public class MenuServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public void update(String menuId, MenuReq req) { - if(null == this.getById(menuId)){ + MenuEntity menu = this.getById(menuId); + if(null == menu){ throw new ServiceException(Message.MENU_ID_NOT_EXIST); } MenuEntity entity = Converts.INSTANCE.toMenuEntity(req); entity.setMenuId(menuId); + entity.setParentId(menu.getParentId()); if(StrUtil.isBlank(entity.getParentId())){ entity.setParentId("0"); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index 08b6af0..d371487 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -134,8 +134,7 @@ public class UserServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) @Override public String save(UserReq req) { - UserEntity entity = Converts.INSTANCE.toUserEntity(req); - validate(req, null); + UserEntity entity = validate(req, null); String salt = RandomUtil.randomString(req.getAccount(), 4); entity.setSalt(salt); String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword(); @@ -176,11 +175,6 @@ public class UserServiceImpl extends ServiceImpl impleme } - public static void main(String[] args) { - System.out.println(Integer.parseInt("00001") + 1); - System.out.println(StrUtil.fillBefore("2",'0', 5)); - } - /** * 功能描述:更新用户信息 @@ -197,10 +191,9 @@ public class UserServiceImpl extends ServiceImpl impleme if(null == originalEntity || originalEntity.getDelFlag().equals(Constants.DEL_FLAG_1)){ throw new ServiceException(Message.USER_ID_NOT_EXIST); } - UserEntity entity = Converts.INSTANCE.toUserEntity(req); + UserEntity entity = validate(req, originalEntity); entity.setUserId(userId); entity.setAccount(null); - validate(req, originalEntity); if(CollUtil.isNotEmpty(req.getPostIds())){ userPostService.bindUserPost(userId, req.getPostIds()); } @@ -208,7 +201,7 @@ public class UserServiceImpl extends ServiceImpl impleme } - private void validate(UserReq req, UserEntity originalEntity){ + private UserEntity validate(UserReq req, UserEntity originalEntity){ if(StrUtil.isNotBlank(req.getDeptId()) && deptService.getById(req.getDeptId()) == null){ throw new ServiceException(Message.DEPT_ID_NOT_EXIST); } @@ -216,24 +209,30 @@ public class UserServiceImpl extends ServiceImpl impleme if(this.getOne(accountWrapper) != null && originalEntity == null){ throw new ServiceException(Message.ACCOUNT_EXIST); } - if(originalEntity == null || (StrUtil.isNotBlank(req.getMobile()) && !originalEntity.getMobile().equals(req.getMobile()))){ - LambdaQueryWrapper mobileWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getMobile()), UserEntity::getMobile, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); - if(this.getOne(mobileWrapper) != null){ + if(StrUtil.isNotBlank(req.getMobile())){ + LambdaQueryWrapper mobileWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getMobile, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + List mobileUserList = this.list(mobileWrapper); + if((originalEntity == null && !mobileUserList.isEmpty()) || (originalEntity != null && !originalEntity.getMobile().equals(req.getMobile()) && mobileUserList.size() > 1)){ throw new ServiceException(Message.MOBILE_EXIST); + } } - if(originalEntity == null || (StrUtil.isNotBlank(req.getEmail()) && !originalEntity.getEmail().equals(req.getEmail()))){ - LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getEmail()), UserEntity::getEmail, req.getEmail()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); - if(this.getOne(emailWrapper) != null){ + if(StrUtil.isNotBlank(req.getEmail())){ + LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getEmail, req.getEmail()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + List emailUserList = this.list(emailWrapper); + if((originalEntity == null && !emailUserList.isEmpty()) || (originalEntity != null && !originalEntity.getEmail().equals(req.getEmail()) && emailUserList.size() > 1)){ throw new ServiceException(Message.EMAIL_EXIST); + } } - if(originalEntity == null || (StrUtil.isNotBlank(req.getIdentityCard()) && !originalEntity.getIdentityCard().equals(req.getIdentityCard()))){ - LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(StrUtil.isNotBlank(req.getIdentityCard()), UserEntity::getIdentityCard, req.getIdentityCard()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); - if(this.getOne(emailWrapper) != null){ + if(StrUtil.isNotBlank(req.getIdentityCard())){ + LambdaQueryWrapper identifyCardWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getIdentityCard, req.getIdentityCard()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); + List identifyCardUserList = this.list(identifyCardWrapper); + if((originalEntity == null && !identifyCardUserList.isEmpty()) || (originalEntity != null && !originalEntity.getIdentityCard().equals(req.getIdentityCard()) && identifyCardUserList.size() > 1)){ throw new ServiceException(Message.IDENTITY_CARD_EXIST); } } + return Converts.INSTANCE.toUserEntity(req); } /** diff --git a/web/src/main/java/com/dite/znpt/web/controller/UserController.java b/web/src/main/java/com/dite/znpt/web/controller/UserController.java index b23c209..18bde3a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/UserController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/UserController.java @@ -1,12 +1,11 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.*; -import com.dite.znpt.service.RoleService; import com.dite.znpt.service.UserRoleService; import com.dite.znpt.service.UserService; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.PageResult; import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -14,7 +13,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; /** * @author huise23 From 14ba8266fa3c005470c4d7f69f858ebea4923e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 7 Jul 2025 10:39:22 +0800 Subject: [PATCH 093/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/service/impl/UserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index d371487..7b1bc01 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -212,7 +212,7 @@ public class UserServiceImpl extends ServiceImpl impleme if(StrUtil.isNotBlank(req.getMobile())){ LambdaQueryWrapper mobileWrapper = Wrappers.lambdaQuery(UserEntity.class).eq(UserEntity::getMobile, req.getMobile()).eq(UserEntity::getDelFlag, Constants.DEL_FLAG_0); List mobileUserList = this.list(mobileWrapper); - if((originalEntity == null && !mobileUserList.isEmpty()) || (originalEntity != null && !originalEntity.getMobile().equals(req.getMobile()) && mobileUserList.size() > 1)){ + if((originalEntity == null && !mobileUserList.isEmpty()) || (originalEntity != null && !originalEntity.getMobile().equals(req.getMobile()) && !mobileUserList.isEmpty())){ throw new ServiceException(Message.MOBILE_EXIST); } From 3e2b4e571b49ef4d13cfd0f453c78c7007139ebb Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 7 Jul 2025 10:53:08 +0800 Subject: [PATCH 094/143] =?UTF-8?q?=E8=A7=86=E9=A2=91=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java index 4743eee..3a31108 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/VideoFileInfoReq.java @@ -3,6 +3,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; import java.io.Serial; @@ -30,6 +31,7 @@ public class VideoFileInfoReq implements Serializable { @ApiModelProperty("作业人员id") private String workerUserId; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("拍摄时间") private LocalDateTime shootingTime; From 4373fb4374047f923eda126ec603468afdf2993f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 7 Jul 2025 16:44:58 +0800 Subject: [PATCH 095/143] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/ImageCollectEntity.java | 4 ++++ .../com/dite/znpt/domain/vo/ImageCollectInfo.java | 6 ++++++ .../com/dite/znpt/domain/vo/ImageCollectReq.java | 3 +++ .../java/com/dite/znpt/domain/vo/ImageListResp.java | 6 ++++++ .../dite/znpt/service/impl/ImageServiceImpl.java | 13 ++++++++----- core/src/main/resources/mapper/ImageMapper.xml | 5 +++-- 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java index dbd7331..5321e72 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageCollectEntity.java @@ -75,4 +75,8 @@ public class ImageCollectEntity extends AuditableEntity implements Serializable @ApiModelProperty("采集员姓名") @TableField("collector_name") private String collectorName; + + @ApiModelProperty("来源") + @TableField("image_source") + private String imageSource; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java index 1c7811f..df0237e 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectInfo.java @@ -47,4 +47,10 @@ public class ImageCollectInfo implements Serializable { @ApiModelProperty("采集员姓名") private String collectorName; + + @ApiModelProperty("来源") + private String imageSource; + + @ApiModelProperty("来源描述") + private String imageSourceLabel; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java index c95417c..ec0dc60 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -60,6 +60,9 @@ public class ImageCollectReq implements Serializable { @ApiModelProperty("采集员姓名") private String collectorName; + @ApiModelProperty("来源") + private String imageSource; + @ApiModelProperty("图像信息") private List imageList; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index 5be2861..771dd3a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -83,6 +83,12 @@ public class ImageListResp implements Serializable { @ApiModelProperty("采集员姓名") private String collectorName; + @ApiModelProperty("来源,枚举ImageSourceEnum") + private String imageSource; + + @ApiModelProperty("来源描述") + private String imageSourceLabel; + @ApiModelProperty("影像类型,枚举ImageTypeEnum") private String imageType; diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 95dca45..c47e9c2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -69,18 +69,19 @@ public class ImageServiceImpl extends ServiceImpl impl @Override public List list(ImageListReq req) { - List partList= this.baseMapper.queryImageList(req); - if (CollUtil.isNotEmpty(partList)) { - Map> audioMap = audioFileInfoService.selectByImageIds(partList.stream().map(ImageListResp::getImageId).collect(Collectors.toList())) + List list = this.baseMapper.queryImageList(req); + if (CollUtil.isNotEmpty(list)) { + Map> audioMap = audioFileInfoService.selectByImageIds(list.stream().map(ImageListResp::getImageId).collect(Collectors.toList())) .stream().collect(Collectors.groupingBy(AudioFileInfoResp::getImageId)); - partList.forEach(resp -> { + list.forEach(resp -> { resp.setAudioList(BeanUtil.copyToList(audioMap.get(resp.getImageId()), AudioFileInfoResp.class)); resp.setWeatherLabel(WeatherEnum.getDescByCode(resp.getWeather())); resp.setShootingMethodLabel(ShootingMethodEnum.getDescByCode(resp.getShootingMethod())); resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); + resp.setImageSourceLabel(ImageSourceEnum.getDescByCode(resp.getImageSource())); }); } - return partList; + return list; } @Override @@ -124,6 +125,7 @@ public class ImageServiceImpl extends ServiceImpl impl if (null != imageResp.getImageCollectInfo()) { imageResp.getImageCollectInfo().setWeatherLabel(WeatherEnum.getDescByCode(imageResp.getImageCollectInfo().getWeather())); imageResp.getImageCollectInfo().setShootingMethodLabel(ShootingMethodEnum.getDescByCode(imageResp.getImageCollectInfo().getShootingMethodLabel())); + imageResp.getImageCollectInfo().setImageSourceLabel(ImageSourceEnum.getDescByCode(imageResp.getImageCollectInfo().getImageSource())); } } return imageResp; @@ -150,6 +152,7 @@ public class ImageServiceImpl extends ServiceImpl impl String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); ImageCollectEntity imageCollect = Optional.ofNullable(BeanUtil.copyProperties(collectReq, ImageCollectEntity.class)).orElse(new ImageCollectEntity()); imageCollect.setCollectId(IdUtil.simpleUUID()); + imageCollect.setImageSource(imageSource); List imageList = new ArrayList<>(); for (MultipartFile file : files) { ImageEntity imageEntity = new ImageEntity(); diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index f409ebf..580bbd0 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,7 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -56,6 +56,7 @@ + @@ -63,7 +64,7 @@ SELECT i.image_id, i.image_name, i.image_path, i.image_height, i.image_resolution, i.image_width, i.image_height, i.focal_distance, i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, - ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name + ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId} From a440eca381119d54364b842375b06d7799e30141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 7 Jul 2025 17:50:14 +0800 Subject: [PATCH 096/143] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=8A=A5=E5=91=8A-to?= =?UTF-8?q?do?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/InspectionReportEntity.java | 78 +++++++++++++++++++ .../znpt/mapper/InspectionReportMapper.java | 12 +++ .../znpt/service/InspectionReportService.java | 12 +++ .../impl/InspectionReportServiceImpl.java | 20 +++++ .../mapper/InspectionReportMapper.xml | 4 + .../InspectionReportController.java | 16 ++++ 6 files changed, 142 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/InspectionReportService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java create mode 100644 core/src/main/resources/mapper/InspectionReportMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java new file mode 100644 index 0000000..7836c20 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java @@ -0,0 +1,78 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/7/7/周一 16:59 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("inspection_report") +@ApiModel(value="InspectionReportEntity对象", description="检测报告表") +public class InspectionReportEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 6994234156669409533L; + + + @ApiModelProperty("报告id") + @TableId(value = "report_id", type = IdType.ASSIGN_UUID) + private String reportId; + + @ApiModelProperty("主标题") + @TableField("title") + private String title; + + @ApiModelProperty("副标题") + @TableField("sub_title") + private String subTitle; + + @ApiModelProperty("报告日期") + @TableField("report_date") + private LocalDate reportDate; + + @ApiModelProperty("检查日期") + @TableField("check_date") + private LocalDate checkDate; + + @ApiModelProperty("检查位置") + @TableField("check_position") + private String checkPosition; + + @ApiModelProperty("检查内容") + @TableField("check_content") + private String checkContent; + + @ApiModelProperty("检查方式") + @TableField("check_method") + private String checkMethod; + + @ApiModelProperty("检查人员id,多个人员英文逗号分隔") + @TableField("check_user_id") + private String checkUserId; + + @ApiModelProperty("报告编制人员id") + @TableField("report_writer") + private String reportWriter; + + @ApiModelProperty("报告复核人员id") + @TableField("report_reviewer") + private String reportReviewer; + + @ApiModelProperty("报告审核人员id") + @TableField("report_auditor") + private String reportAuditor; +} diff --git a/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java b/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java new file mode 100644 index 0000000..f9a62ab --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.InspectionReportEntity; + +/** + * @author Bear.G + * @date 2025/7/7/周一 17:34 + * @description + */ +public interface InspectionReportMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/InspectionReportService.java b/core/src/main/java/com/dite/znpt/service/InspectionReportService.java new file mode 100644 index 0000000..6723e3a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/InspectionReportService.java @@ -0,0 +1,12 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.InspectionReportEntity; + +/** + * @author Bear.G + * @date 2025/7/7/周一 17:42 + * @description + */ +public interface InspectionReportService extends IService { +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java new file mode 100644 index 0000000..b2d352a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java @@ -0,0 +1,20 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.InspectionReportEntity; +import com.dite.znpt.mapper.InspectionReportMapper; +import org.springframework.stereotype.Service; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/7/周一 17:42 + * @description + */ +@Service +public class InspectionReportServiceImpl extends ServiceImpl implements Serializable { + @Serial + private static final long serialVersionUID = 1460849450000057636L; +} diff --git a/core/src/main/resources/mapper/InspectionReportMapper.xml b/core/src/main/resources/mapper/InspectionReportMapper.xml new file mode 100644 index 0000000..6a13b56 --- /dev/null +++ b/core/src/main/resources/mapper/InspectionReportMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java new file mode 100644 index 0000000..090f103 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java @@ -0,0 +1,16 @@ +package com.dite.znpt.web.controller; + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Bear.G + * @date 2025/7/7/周一 17:43 + * @description + */ +@Api(tags = "检查报告") +@RestController +@RequestMapping("/inspection-report") +public class InspectionReportController { +} From 4f23f68a2662d554997b8b37eedd4003ab2b32f0 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 7 Jul 2025 23:31:52 +0800 Subject: [PATCH 097/143] =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=E5=BA=93=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 2 + .../java/com/dite/znpt/converts/Converts.java | 6 ++ .../entity/MaintainSuggestionEntity.java | 46 +++++++++ .../znpt/domain/vo/MaintainSuggestionReq.java | 37 +++++++ .../domain/vo/MaintainSuggestionResp.java | 40 ++++++++ .../znpt/mapper/MaintainSuggestionMapper.java | 13 +++ .../service/MaintainSuggestionService.java | 23 +++++ .../impl/MaintainSuggestionServiceImpl.java | 99 +++++++++++++++++++ .../mapper/MaintainSuggestionMapper.xml | 4 + .../MaintainSuggestionController.java | 67 +++++++++++++ 10 files changed, 337 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/MaintainSuggestionEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/MaintainSuggestionMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/MaintainSuggestionService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/MaintainSuggestionServiceImpl.java create mode 100644 core/src/main/resources/mapper/MaintainSuggestionMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/MaintainSuggestionController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 7e4c060..1a3a116 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -64,4 +64,6 @@ public class Message implements Serializable { public static final String WORK_SHIFT_NOT_EXIST = "班次不存在"; public static final String WORK_SHIFT_IS_NOT_UNPUBLISH = "班次的状态不是未发布"; public static final String IMAGE_AUTO_MARK_ERROR = "自动标注出错:"; + public static final String SUGGESTION_ID_IS_NOT_EXIST = "维修建议id不存在"; + public static final String SUGGESTION_LEVEL_TYPE_FORBID_REPEAT = "存在缺陷级别为[{}]缺陷类型为[{}]的维修建议"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 61ea9be..c6428a3 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -97,5 +97,11 @@ public interface Converts { WorkShiftResp toWorkShiftResp(WorkShiftEntity entity); WorkShiftEntity toWorkShiftEntity(WorkShiftReq req); + + List toMaintainSuggestionResp(List list); + + MaintainSuggestionResp toMaintainSuggestionResp(MaintainSuggestionEntity entity); + + MaintainSuggestionEntity toMaintainSuggestionEntity(MaintainSuggestionReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/MaintainSuggestionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/MaintainSuggestionEntity.java new file mode 100644 index 0000000..7191246 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/MaintainSuggestionEntity.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:18 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("maintain_suggestion") +@ApiModel(value="MaintainSuggestionEntity对象", description="维修建议库") +public class MaintainSuggestionEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5774159362861473940L; + + @ApiModelProperty("建议id") + @TableId(value = "suggestion_id", type = IdType.ASSIGN_UUID) + private String suggestionId; + + @ApiModelProperty("建议类容") + @TableField("suggestion_content") + private String suggestionContent; + + @ApiModelProperty("缺陷级别") + @TableField("defect_level") + private String defectLevel; + + + @ApiModelProperty("缺陷类型") + @TableField("defect_type") + private String defectType; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionReq.java b/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionReq.java new file mode 100644 index 0000000..0c6b112 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionReq.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:25 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("维修建议请求实体") +public class MaintainSuggestionReq implements Serializable { + @Serial + private static final long serialVersionUID = 6390137746113715095L; + + @NotBlank(message = "建议内容不能为空") + @Size(max = 200, message = "建议内容不能超过200个字符") + @ApiModelProperty("建议内容") + private String suggestionContent; + + @NotBlank(message = "缺陷类型不能为空") + @ApiModelProperty("缺陷类型,枚举:DefectTypeEnum") + private String defectType; + + @NotBlank(message = "缺陷级别不能为空") + @ApiModelProperty("缺陷级别,枚举:DefectLevelEnum") + private String defectLevel; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionResp.java b/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionResp.java new file mode 100644 index 0000000..42b2963 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/MaintainSuggestionResp.java @@ -0,0 +1,40 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:26 + * @Description: + */ +@Data +@Accessors(chain = true) +@ApiModel("维修建议响应实体") +public class MaintainSuggestionResp implements Serializable { + @Serial + private static final long serialVersionUID = -5835303002016693551L; + + @ApiModelProperty("建议id") + private String suggestionId; + + @ApiModelProperty("建议内容") + private String suggestionContent; + + @ApiModelProperty("缺陷类型,枚举:DefectTypeEnum") + private String defectType; + + @ApiModelProperty("缺陷类型描述") + private String defectTypeLabel; + + @ApiModelProperty("缺陷级别,枚举:DefectLevelEnum") + private String defectLevel; + + @ApiModelProperty("缺陷级别描述") + private String defectLevelLabel; +} diff --git a/core/src/main/java/com/dite/znpt/mapper/MaintainSuggestionMapper.java b/core/src/main/java/com/dite/znpt/mapper/MaintainSuggestionMapper.java new file mode 100644 index 0000000..ed0e581 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/MaintainSuggestionMapper.java @@ -0,0 +1,13 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.MaintainSuggestionEntity; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:22 + * @Description: + */ +public interface MaintainSuggestionMapper extends BaseMapper { + +} diff --git a/core/src/main/java/com/dite/znpt/service/MaintainSuggestionService.java b/core/src/main/java/com/dite/znpt/service/MaintainSuggestionService.java new file mode 100644 index 0000000..af96086 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/MaintainSuggestionService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.MaintainSuggestionEntity; +import com.dite.znpt.domain.vo.MaintainSuggestionReq; +import com.dite.znpt.domain.vo.MaintainSuggestionResp; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:24 + * @Description: + */ +public interface MaintainSuggestionService extends IService { + + List page(String defectLevel, String defectType); + List list(String defectLevel, String defectType); + MaintainSuggestionResp detail(String suggestionId); + void save(MaintainSuggestionReq req); + void update(String suggestionId, MaintainSuggestionReq req); + void deleteById(String suggestionId); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/MaintainSuggestionServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/MaintainSuggestionServiceImpl.java new file mode 100644 index 0000000..4cf5e6d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/MaintainSuggestionServiceImpl.java @@ -0,0 +1,99 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.MaintainSuggestionEntity; +import com.dite.znpt.domain.vo.MaintainSuggestionReq; +import com.dite.znpt.domain.vo.MaintainSuggestionResp; +import com.dite.znpt.enums.DefectLevelEnum; +import com.dite.znpt.enums.DefectTypeEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.MaintainSuggestionMapper; +import com.dite.znpt.service.MaintainSuggestionService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:25 + * @Description: + */ +@Service +public class MaintainSuggestionServiceImpl extends ServiceImpl implements MaintainSuggestionService { + @Override + public List page(String defectLevel, String defectType) { + PageUtil.startPage(); + return this.list(defectLevel, defectType); + } + + @Override + public List list(String defectLevel, String defectType) { + List result = Converts.INSTANCE.toMaintainSuggestionResp( + this.list(Wrappers.lambdaQuery(MaintainSuggestionEntity.class) + .eq(StrUtil.isNotEmpty(defectLevel), MaintainSuggestionEntity::getDefectLevel, defectLevel) + .eq(StrUtil.isNotEmpty(defectType), MaintainSuggestionEntity::getDefectType, defectType) + )); + result.forEach(resp -> { + resp.setDefectLevelLabel(DefectLevelEnum.getDescByCode(resp.getDefectLevel())); + resp.setDefectTypeLabel(DefectTypeEnum.getDescByCode(resp.getDefectType())); + }); + return result; + } + + @Override + public MaintainSuggestionResp detail(String suggestionId) { + MaintainSuggestionResp result = Converts.INSTANCE.toMaintainSuggestionResp(this.getById(suggestionId)); + result.setDefectLevelLabel(DefectLevelEnum.getDescByCode(result.getDefectLevel())); + result.setDefectTypeLabel(DefectTypeEnum.getDescByCode(result.getDefectType())); + return result; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(MaintainSuggestionReq req) { + if(!validDefectLevelAndType(req.getDefectLevel(), req.getDefectType())){ + throw new ServiceException(StrUtil.format(Message.SUGGESTION_LEVEL_TYPE_FORBID_REPEAT, req.getDefectLevel(), req.getDefectType())); + } + this.save(Converts.INSTANCE.toMaintainSuggestionEntity(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String suggestionId, MaintainSuggestionReq req) { + MaintainSuggestionEntity maintainSuggestion = this.getById(suggestionId); + if(null == maintainSuggestion){ + throw new ServiceException(Message.SUGGESTION_ID_IS_NOT_EXIST); + } + if(!req.getDefectLevel().equals(maintainSuggestion.getDefectLevel()) || !req.getDefectType().equals(maintainSuggestion.getDefectType())){ + if(!validDefectLevelAndType(req.getDefectLevel(), req.getDefectType())){ + throw new ServiceException(StrUtil.format(Message.SUGGESTION_LEVEL_TYPE_FORBID_REPEAT, req.getDefectLevel(), req.getDefectType())); + } + } + MaintainSuggestionEntity entity = Converts.INSTANCE.toMaintainSuggestionEntity(req); + entity.setSuggestionId(suggestionId); + this.updateById(entity); + } + + private Boolean validDefectLevelAndType(String defectLevel, String defectType){ + return this.list( + Wrappers.lambdaQuery(MaintainSuggestionEntity.class) + .eq(MaintainSuggestionEntity::getDefectLevel, defectLevel) + .eq(MaintainSuggestionEntity::getDefectType, defectType) + ).size() == 0 ; + + }; + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String suggestionId) { + if(null == this.getById(suggestionId)){ + throw new ServiceException(Message.SUGGESTION_ID_IS_NOT_EXIST); + } + this.removeById(suggestionId); + } +} diff --git a/core/src/main/resources/mapper/MaintainSuggestionMapper.xml b/core/src/main/resources/mapper/MaintainSuggestionMapper.xml new file mode 100644 index 0000000..597b5f8 --- /dev/null +++ b/core/src/main/resources/mapper/MaintainSuggestionMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/MaintainSuggestionController.java b/web/src/main/java/com/dite/znpt/web/controller/MaintainSuggestionController.java new file mode 100644 index 0000000..cbc0220 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/MaintainSuggestionController.java @@ -0,0 +1,67 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.MaintainSuggestionReq; +import com.dite.znpt.domain.vo.MaintainSuggestionResp; +import com.dite.znpt.service.MaintainSuggestionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/7 22:31 + * @Description: + */ +@Api(tags = "维修建议库") +@RestController +@RequestMapping("/maintain_suggestion") +public class MaintainSuggestionController { + + @Resource + private MaintainSuggestionService maintainSuggestionService; + + @ApiOperation(value = "分页查询维修建议列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(required = false) String defectLevel, @RequestParam(required = false) String defectType){ + return PageResult.ok(maintainSuggestionService.page(defectLevel, defectType)); + } + + @ApiOperation(value = "查询维修建议列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestParam(required = false) String defectLevel, @RequestParam(required = false) String defectType){ + return Result.ok(maintainSuggestionService.list(defectLevel, defectType)); + } + + @ApiOperation(value = "查询维修建议详情", httpMethod = "GET") + @GetMapping("/detail/{suggestionId}") + public Result detail(@PathVariable String suggestionId){ + return Result.ok(maintainSuggestionService.detail(suggestionId)); + } + + @ApiOperation(value = "新增维修建议", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody MaintainSuggestionReq req){ + maintainSuggestionService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改维修建议", httpMethod = "PUT") + @PutMapping + public Result edit(@PathVariable String suggestionId, @Validated @RequestBody MaintainSuggestionReq req){ + maintainSuggestionService.update(suggestionId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除维修建议", httpMethod = "DELETE") + @DeleteMapping("/{suggestionId}") + public Result remove(@PathVariable String suggestionId){ + maintainSuggestionService.deleteById(suggestionId); + return Result.ok(); + } +} From a65975a5207931064c5da49ea9c693434c29aa1c Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Wed, 9 Jul 2025 21:43:35 +0800 Subject: [PATCH 098/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/AudioFileInfoEntity.java | 6 ++---- .../com/dite/znpt/domain/vo/AudioFileInfoResp.java | 13 +++---------- .../znpt/service/impl/AudioFileInfoServiceImpl.java | 2 +- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java index 58339b7..23fc373 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AudioFileInfoEntity.java @@ -1,10 +1,8 @@ package com.dite.znpt.domain.entity; import java.io.Serial; -import java.time.LocalDateTime; import java.io.Serializable; -import com.alibaba.excel.annotation.ExcelIgnore; import com.baomidou.mybatisplus.annotation.*; import com.dite.znpt.domain.AuditableEntity; import io.swagger.annotations.ApiModel; @@ -29,8 +27,8 @@ public class AudioFileInfoEntity extends AuditableEntity implements Serializable @ExcelProperty("id") @ApiModelProperty("id") - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @TableId(value = "audio_id", type = IdType.ASSIGN_ID) + private String audioId; @ExcelProperty("图片id") @ApiModelProperty("图片id") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java index c222a75..72983f3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AudioFileInfoResp.java @@ -1,7 +1,5 @@ package com.dite.znpt.domain.vo; -import java.time.LocalDateTime; - import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; @@ -9,8 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import com.dite.znpt.domain.entity.AudioFileInfoEntity; /** * @author huise23 @@ -21,19 +17,16 @@ import com.dite.znpt.domain.entity.AudioFileInfoEntity; @ApiModel("音频文件信息响应实体") public class AudioFileInfoResp { - @ExcelProperty("id") - @ApiModelProperty("id") - @TableId(value = "id", type = IdType.ASSIGN_ID) - private String id; + @ExcelProperty("audioId") + @ApiModelProperty("audioId") + private String audioId; @ExcelProperty("图片id") @ApiModelProperty("图片id") - @TableField("image_id") private String imageId; @ExcelProperty("文件保存路径") @ApiModelProperty("文件保存路径") - @TableField("file_path") private String filePath; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java index a38f356..42ee984 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java @@ -51,7 +51,7 @@ public class AudioFileInfoServiceImpl extends ServiceImpl Date: Thu, 10 Jul 2025 00:16:19 +0800 Subject: [PATCH 099/143] =?UTF-8?q?1=E3=80=81=E9=A1=B9=E7=9B=AE=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=80=BB=E5=B7=A5=E6=9C=9F=E5=AD=97=E6=AE=B5=202?= =?UTF-8?q?=E3=80=81=E6=A3=80=E6=9F=A5=E6=96=B9=E5=BC=8F=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E6=9F=A5=E7=9A=84=E6=8E=A5=E5=8F=A3=202=E3=80=81?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=8A=A5=E5=91=8A=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../java/com/dite/znpt/converts/Converts.java | 5 ++ .../znpt/domain/entity/CheckSchemeEntity.java | 57 +++++++++++++ .../domain/entity/InspectionReportEntity.java | 28 ++++++- .../znpt/domain/entity/ProjectEntity.java | 5 ++ .../dite/znpt/domain/vo/CheckSchemeReq.java | 51 +++++++++++ .../dite/znpt/domain/vo/CheckSchemeResp.java | 44 ++++++++++ .../domain/vo/InspectionReportCheckInfo.java | 38 +++++++++ .../domain/vo/InspectionReportCoverInfo.java | 61 ++++++++++++++ .../znpt/domain/vo/InspectionReportReq.java | 78 +++++++++++++++++ .../znpt/domain/vo/InspectionReportResp.java | 39 +++++++++ .../domain/vo/InspectionReportSchemeInfo.java | 40 +++++++++ .../dite/znpt/domain/vo/ProjectListResp.java | 3 + .../com/dite/znpt/domain/vo/ProjectReq.java | 3 + .../com/dite/znpt/enums/CheckMethodEnum.java | 52 ++++++++++++ .../dite/znpt/mapper/CheckSchemeMapper.java | 12 +++ .../dite/znpt/service/CheckSchemeService.java | 23 +++++ .../service/impl/CheckSchemeServiceImpl.java | 84 +++++++++++++++++++ .../web/controller/CheckSchemeController.java | 65 ++++++++++++++ 19 files changed, 685 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportSchemeInfo.java create mode 100644 core/src/main/java/com/dite/znpt/enums/CheckMethodEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/CheckSchemeMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/CheckSchemeService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 1a3a116..d694614 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -66,4 +66,5 @@ public class Message implements Serializable { public static final String IMAGE_AUTO_MARK_ERROR = "自动标注出错:"; public static final String SUGGESTION_ID_IS_NOT_EXIST = "维修建议id不存在"; public static final String SUGGESTION_LEVEL_TYPE_FORBID_REPEAT = "存在缺陷级别为[{}]缺陷类型为[{}]的维修建议"; + public static final String CHECK_SCHEME_ID_IS_NOT_EXIST = "检查方案id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index c6428a3..a8f7ba6 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -103,5 +103,10 @@ public interface Converts { MaintainSuggestionResp toMaintainSuggestionResp(MaintainSuggestionEntity entity); MaintainSuggestionEntity toMaintainSuggestionEntity(MaintainSuggestionReq req); + + List toCheckSchemeResp(List list); + CheckSchemeResp toCheckSchemeResp(CheckSchemeEntity entity); + + CheckSchemeEntity toCheckSchemeEntity(CheckSchemeReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java new file mode 100644 index 0000000..75517d7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:29 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("check_scheme") +@ApiModel(value="CheckSchemeEntity对象", description="检查方案") +public class CheckSchemeEntity extends AuditableEntity implements Serializable { + + @ApiModelProperty("方案id") + @TableId(value = "scheme_id", type = IdType.ASSIGN_UUID) + private String schemeId; + + @ApiModelProperty("工作内容") + @TableField("work_content") + private String workContent; + + @ApiModelProperty("人员配置") + @TableField("staff_config") + private String staffConfig; + + @ApiModelProperty("设备配置") + @TableField("device_config") + private String deviceConfig; + + @ApiModelProperty("实施方案") + @TableField("construction_scheme") + private String constructionScheme; + + @ApiModelProperty("检查方式,枚举CheckTypeEnum") + @TableField("check_type") + private String checkType; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableField("delFlag") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java index 7836c20..be836b3 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java @@ -13,6 +13,7 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; +import java.time.LocalDateTime; /** * @author Bear.G @@ -27,7 +28,6 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @Serial private static final long serialVersionUID = 6994234156669409533L; - @ApiModelProperty("报告id") @TableId(value = "report_id", type = IdType.ASSIGN_UUID) private String reportId; @@ -40,9 +40,17 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @TableField("sub_title") private String subTitle; - @ApiModelProperty("报告日期") - @TableField("report_date") - private LocalDate reportDate; + @ApiModelProperty("封面") + @TableField("cover_image") + private String coverImage; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ApiModelProperty("机组id") + @TableField("turbine_id") + private String turbineId; @ApiModelProperty("检查日期") @TableField("check_date") @@ -68,11 +76,23 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @TableField("report_writer") private String reportWriter; + @ApiModelProperty("报告编制时间") + @TableField("report_write_time") + private LocalDateTime reportWriteTime; + @ApiModelProperty("报告复核人员id") @TableField("report_reviewer") private String reportReviewer; + @ApiModelProperty("报告复核时间") + @TableField("report_review_time") + private LocalDateTime reportReviewTime; + @ApiModelProperty("报告审核人员id") @TableField("report_auditor") private String reportAuditor; + + @ApiModelProperty("报告审核时间") + @TableField("report_audit_time") + private LocalDateTime reportAuditTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index df8ec34..c044195 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -80,6 +80,11 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("scale") private String scale; + @ExcelProperty("总工期,单位天") + @ApiModelProperty("总工期,单位天") + @TableField("duration") + private Integer duration; + @ExcelProperty("风机型号") @ApiModelProperty("风机型号") @TableField("turbine_model") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java new file mode 100644 index 0000000..6935dbe --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java @@ -0,0 +1,51 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:35 + * @Description: + */ +@Data +@ApiModel("检查方案请求实体") +public class CheckSchemeReq implements Serializable { + @Serial + private static final long serialVersionUID = 2699725873314667276L; + + @NotBlank(message = "工作内容不能为空") + @Size(max = 1000, message = "工作内容不能超过1000个字") + @ApiModelProperty("工作内容") + private String workContent; + + @NotBlank(message = "人员配置不能为空") + @Size(max = 200, message = "人员配置不能超过200个字") + @ApiModelProperty("人员配置") + private String staffConfig; + + @NotBlank(message = "设备配置不能为空") + @Size(max = 500, message = "设备配置不能超过500个字") + @ApiModelProperty("设备配置") + private String deviceConfig; + + @NotBlank(message = "实施方案不能为空") + @Size(max = 2000, message = "实施方案不能超过2000个字") + @ApiModelProperty("实施方案") + private String constructionScheme; + + @NotBlank(message = "检查方式不能为空") + @ApiModelProperty("检查方式,枚举CheckMethodEnum") + private String checkMethod; + + @NotBlank(message = "备注不能为空") + @Size(max = 500, message = "备注不能超过500个字") + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeResp.java new file mode 100644 index 0000000..50e7971 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeResp.java @@ -0,0 +1,44 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:14 + * @Description: + */ +@Data +@ApiModel("检查方案响应实体") +public class CheckSchemeResp implements Serializable { + @Serial + private static final long serialVersionUID = 2327453920890578467L; + + @ApiModelProperty("方案id") + private String schemeId; + + @ApiModelProperty("工作内容") + private String workContent; + + @ApiModelProperty("人员配置") + private String staffConfig; + + @ApiModelProperty("设备配置") + private String deviceConfig; + + @ApiModelProperty("实施方案") + private String constructionScheme; + + @ApiModelProperty("检查方式,枚举CheckMethodEnum") + private String checkMethod; + + @ApiModelProperty("检查方式描述") + private String checkMethodLabel; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java new file mode 100644 index 0000000..57a255c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java @@ -0,0 +1,38 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 22:23 + * @Description: + */ +@Data +@ApiModel("检查报告检查信息") +public class InspectionReportCheckInfo implements Serializable { + @Serial + private static final long serialVersionUID = 193233798058399831L; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("检查日期") + private LocalDate checkDate; + + @ApiModelProperty("检查位置") + private String checkPosition; + + @ApiModelProperty("检查内容") + private String checkContent; + + @ApiModelProperty("检查方式") + private String checkMethod; + + @ApiModelProperty("检查人员id,多个人员英文逗号分隔") + private String checkUserId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java new file mode 100644 index 0000000..19d51ec --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java @@ -0,0 +1,61 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 22:16 + * @Description: + */ +@Data +@ApiModel("检查报告封面信息") +public class InspectionReportCoverInfo implements Serializable { + @Serial + private static final long serialVersionUID = 2416173276374292199L; + + @ApiModelProperty("报告id") + private String reportId; + + @ApiModelProperty("主标题") + private String title; + + @ApiModelProperty("副标题") + private String subTitle; + + @ApiModelProperty("封面") + private String coverImage; + + @ApiModelProperty("报告编制人员id") + private String reportWriter; + + @ApiModelProperty("报告编制人员") + private String reportWriterName; + + @ApiModelProperty("报告编制时间") + private LocalDateTime reportWriteTime; + + @ApiModelProperty("报告复核人员id") + private String reportReviewer; + + @ApiModelProperty("报告复核人员") + private String reportReviewerName; + + @ApiModelProperty("报告复核时间") + private LocalDateTime reportReviewTime; + + @ApiModelProperty("报告审核人员id") + private String reportAuditor; + + @ApiModelProperty("报告审核人员") + private String reportAuditName; + + @ApiModelProperty("报告审核时间") + private LocalDateTime reportAuditTime; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java new file mode 100644 index 0000000..c679385 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java @@ -0,0 +1,78 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 22:08 + * @Description: + */ +@Data +@ApiModel("检查报告请求实体") +public class InspectionReportReq implements Serializable { + @Serial + private static final long serialVersionUID = 4937399975205847660L; + + @ApiModelProperty("报告id") + private String reportId; + + @ApiModelProperty("主标题") + private String title; + + @ApiModelProperty("副标题") + private String subTitle; + + @ApiModelProperty("封面") + private String coverImage; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组id") + private String turbineId; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("检查日期") + private LocalDate checkDate; + + @ApiModelProperty("检查位置") + private String checkPosition; + + @ApiModelProperty("检查内容") + private String checkContent; + + @ApiModelProperty("检查方式,多个方式英文逗号分隔") + private String checkMethod; + + @ApiModelProperty("检查人员id,多个人员英文逗号分隔") + private String checkUserId; + + @ApiModelProperty("报告编制人员id") + private String reportWriter; + + @ApiModelProperty("报告编制时间") + private LocalDateTime reportWriteTime; + + @ApiModelProperty("报告复核人员id") + private String reportReviewer; + + @ApiModelProperty("报告复核时间") + private LocalDateTime reportReviewTime; + + @ApiModelProperty("报告审核人员id") + private String reportAuditor; + + @ApiModelProperty("报告审核时间") + private LocalDateTime reportAuditTime; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java new file mode 100644 index 0000000..8d15c94 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 22:14 + * @Description: + */ +@Data +@ApiModel("检查报告响应实体") +public class InspectionReportResp implements Serializable { + @Serial + private static final long serialVersionUID = -2229157312487991799L; + + @ApiModelProperty("封面信息") + private InspectionReportCoverInfo coverInfo; + + @ApiModelProperty("项目信息") + private ProjectResp projectInfo; + + @ApiModelProperty("检查信息") + private InspectionReportCheckInfo checkInfo; + + @ApiModelProperty("机组信息") + private TurbineInfoResp turbineInfo; + + @ApiModelProperty("检查方案") + private List schemeInfoList; + + @ApiModelProperty("缺陷信息") + private List defectInfoList; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportSchemeInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportSchemeInfo.java new file mode 100644 index 0000000..8e6acb5 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportSchemeInfo.java @@ -0,0 +1,40 @@ +package com.dite.znpt.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 22:24 + * @Description: + */ +@Data +@ApiModel("检查报告方案信息") +public class InspectionReportSchemeInfo implements Serializable { + + + @ApiModelProperty("检查日期") + @TableField("check_date") + private LocalDate checkDate; + + @ApiModelProperty("检查位置") + @TableField("check_position") + private String checkPosition; + + @ApiModelProperty("检查内容") + @TableField("check_content") + private String checkContent; + + @ApiModelProperty("检查方式") + @TableField("check_method") + private String checkMethod; + + @ApiModelProperty("检查人员id,多个人员英文逗号分隔") + @TableField("check_user_id") + private String checkUserId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java index d2db815..8947fcc 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java @@ -67,6 +67,9 @@ public class ProjectListResp implements Serializable { @ApiModelProperty("项目规模") private String scale; + @ApiModelProperty("总工期,单位天") + private Integer duration; + @ApiModelProperty("风机型号") private String turbineModel; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java index b36e673..501ac49 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java @@ -74,6 +74,9 @@ public class ProjectReq implements Serializable { @ApiModelProperty("项目规模") private String scale; + @ApiModelProperty("总工期,单位天") + private Integer duration; + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "风机型号不能超过20字符") @ApiModelProperty("风机型号") private String turbineModel; diff --git a/core/src/main/java/com/dite/znpt/enums/CheckMethodEnum.java b/core/src/main/java/com/dite/znpt/enums/CheckMethodEnum.java new file mode 100644 index 0000000..400332a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/CheckMethodEnum.java @@ -0,0 +1,52 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:23 + * @Description: + */ +@Getter +public enum CheckMethodEnum { + BLADE_OUTSIDE("blade-outside","叶片外观检查"), + BLADE_INSIDE("blade-inside","叶片内腔检查"), + BLADE_LIGHTNING_PROTECTION("blade-lightning-protection","叶片叶尖防雷导通检测"), + TURBINE_LIGHTNING_PROTECTION("turbine-lightning-protection","风电机组防雷检测"), + ; + private final String code; + private final String desc; + + CheckMethodEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static CheckMethodEnum getByCode(String code){ + for (CheckMethodEnum e : CheckMethodEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + CheckMethodEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(CheckMethodEnum.values().length); + for (CheckMethodEnum e : CheckMethodEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/CheckSchemeMapper.java b/core/src/main/java/com/dite/znpt/mapper/CheckSchemeMapper.java new file mode 100644 index 0000000..33439c8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/CheckSchemeMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.CheckSchemeEntity; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:37 + * @Description: + */ +public interface CheckSchemeMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java new file mode 100644 index 0000000..ae88c87 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.CheckSchemeEntity; +import com.dite.znpt.domain.vo.CheckSchemeReq; +import com.dite.znpt.domain.vo.CheckSchemeResp; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:38 + * @Description: + */ +public interface CheckSchemeService extends IService { + List page(String checkType); + List list(String checkType); + CheckSchemeResp detail(String checkSchemeId); + void save(CheckSchemeReq req); + void update(String checkSchemeId, CheckSchemeReq req); + void deleteById(String checkSchemeId); + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java new file mode 100644 index 0000000..866a578 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java @@ -0,0 +1,84 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.CheckSchemeEntity; +import com.dite.znpt.domain.vo.CheckSchemeReq; +import com.dite.znpt.domain.vo.CheckSchemeResp; +import com.dite.znpt.enums.CheckMethodEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.CheckSchemeMapper; +import com.dite.znpt.service.CheckSchemeService; +import com.dite.znpt.util.PageUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:39 + * @Description: + */ +@Service +public class CheckSchemeServiceImpl extends ServiceImpl implements CheckSchemeService { + + @Override + public List page(String checkType) { + PageUtil.startPage(); + return this.list(checkType); + } + + @Override + public List list(String checkType) { + List result = Converts.INSTANCE.toCheckSchemeResp(this.list(Wrappers.lambdaQuery(CheckSchemeEntity.class).eq(StrUtil.isNotBlank(checkType), CheckSchemeEntity::getCheckType, checkType))); + result.forEach(resp -> { + resp.setCheckMethodLabel(CheckMethodEnum.getDescByCode(resp.getCheckMethod())); + }); + return result; + } + + @Override + public CheckSchemeResp detail(String checkSchemeId) { + CheckSchemeEntity checkScheme = this.getById(checkSchemeId); + if(null == checkScheme || checkScheme.getDelFlag() != Constants.DEL_FLAG_0){ + throw new ServiceException(Message.CHECK_SCHEME_ID_IS_NOT_EXIST); + } + CheckSchemeResp resp = Converts.INSTANCE.toCheckSchemeResp(checkScheme); + resp.setCheckMethodLabel(CheckMethodEnum.getDescByCode(resp.getCheckMethod())); + return resp; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(CheckSchemeReq req) { + this.save(Converts.INSTANCE.toCheckSchemeEntity(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String checkSchemeId, CheckSchemeReq req) { + CheckSchemeEntity checkScheme = this.getById(checkSchemeId); + if(null == checkScheme || checkScheme.getDelFlag() != Constants.DEL_FLAG_0){ + throw new ServiceException(Message.CHECK_SCHEME_ID_IS_NOT_EXIST); + } + CheckSchemeEntity entity = Converts.INSTANCE.toCheckSchemeEntity(req); + entity.setSchemeId(checkSchemeId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String checkSchemeId) { + CheckSchemeEntity checkScheme = this.getById(checkSchemeId); + if(null == checkScheme || checkScheme.getDelFlag() != Constants.DEL_FLAG_0){ + throw new ServiceException(Message.CHECK_SCHEME_ID_IS_NOT_EXIST); + } + checkScheme.setDelFlag(Constants.DEL_FLAG_1); + this.updateById(checkScheme); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java new file mode 100644 index 0000000..f32641c --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java @@ -0,0 +1,65 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.CheckSchemeReq; +import com.dite.znpt.domain.vo.CheckSchemeResp; +import com.dite.znpt.service.CheckSchemeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:39 + * @Description: + */ +@Api(tags = "检查方案") +@RestController +@RequestMapping("/check-scheme") +public class CheckSchemeController { + @Resource + private CheckSchemeService checkSchemeService; + + @ApiOperation(value = "分页查询检查方案信息", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(@RequestParam(required = false) String checkType){ + return PageResult.ok(checkSchemeService.page(checkType)); + } + + @ApiOperation(value = "查询检查方案信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(@RequestParam(required = false) String checkType){ + return Result.ok(checkSchemeService.list(checkType)); + } + + @ApiOperation(value = "查询检查方案详情", httpMethod = "GET") + @GetMapping("/detail/{checkSchemeId}") + public Result detail(@PathVariable String checkSchemeId){ + return Result.ok(checkSchemeService.detail(checkSchemeId)); + } + @ApiOperation(value = "新增检查方案", httpMethod = "POST") + @PostMapping() + public Result add(@Validated @RequestBody CheckSchemeReq req){ + checkSchemeService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改检查方案", httpMethod = "PUT") + @PutMapping("/{checkSchemeId}") + public Result update(@PathVariable String checkSchemeId, @Validated @RequestBody CheckSchemeReq req){ + checkSchemeService.update(checkSchemeId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除检查方案", httpMethod = "DELETE") + @DeleteMapping("/{checkSchemeId}") + public Result remove(@PathVariable String checkSchemeId){ + checkSchemeService.deleteById(checkSchemeId); + return Result.ok(); + } +} From 1143ea4c181cd31d53e221c408339afd04caee4e Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Thu, 10 Jul 2025 00:29:32 +0800 Subject: [PATCH 100/143] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/CheckSchemeEntity.java | 6 +++--- .../com/dite/znpt/service/CheckSchemeService.java | 4 ++-- .../znpt/service/impl/CheckSchemeServiceImpl.java | 8 ++++---- .../znpt/web/controller/CheckSchemeController.java | 8 ++++---- .../dite/znpt/web/controller/CommonController.java | 12 +++++++++--- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java index 75517d7..d007394 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java @@ -43,9 +43,9 @@ public class CheckSchemeEntity extends AuditableEntity implements Serializable { @TableField("construction_scheme") private String constructionScheme; - @ApiModelProperty("检查方式,枚举CheckTypeEnum") - @TableField("check_type") - private String checkType; + @ApiModelProperty("检查方式,枚举CheckMethodEnum") + @TableField("check_method") + private String checkMethod; @ApiModelProperty("备注") @TableField("remark") diff --git a/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java index ae88c87..78e7e6f 100644 --- a/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java +++ b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java @@ -13,8 +13,8 @@ import java.util.List; * @Description: */ public interface CheckSchemeService extends IService { - List page(String checkType); - List list(String checkType); + List page(String checkMethod); + List list(String checkMethod); CheckSchemeResp detail(String checkSchemeId); void save(CheckSchemeReq req); void update(String checkSchemeId, CheckSchemeReq req); diff --git a/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java index 866a578..7c0535b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java @@ -28,14 +28,14 @@ import java.util.List; public class CheckSchemeServiceImpl extends ServiceImpl implements CheckSchemeService { @Override - public List page(String checkType) { + public List page(String checkMethod) { PageUtil.startPage(); - return this.list(checkType); + return this.list(checkMethod); } @Override - public List list(String checkType) { - List result = Converts.INSTANCE.toCheckSchemeResp(this.list(Wrappers.lambdaQuery(CheckSchemeEntity.class).eq(StrUtil.isNotBlank(checkType), CheckSchemeEntity::getCheckType, checkType))); + public List list(String checkMethod) { + List result = Converts.INSTANCE.toCheckSchemeResp(this.list(Wrappers.lambdaQuery(CheckSchemeEntity.class).eq(StrUtil.isNotBlank(checkMethod), CheckSchemeEntity::getCheckMethod, checkMethod))); result.forEach(resp -> { resp.setCheckMethodLabel(CheckMethodEnum.getDescByCode(resp.getCheckMethod())); }); diff --git a/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java index f32641c..c8e30dc 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java @@ -27,14 +27,14 @@ public class CheckSchemeController { @ApiOperation(value = "分页查询检查方案信息", httpMethod = "GET") @GetMapping("/page") - public PageResult page(@RequestParam(required = false) String checkType){ - return PageResult.ok(checkSchemeService.page(checkType)); + public PageResult page(@RequestParam(required = false) String checkMethod){ + return PageResult.ok(checkSchemeService.page(checkMethod)); } @ApiOperation(value = "查询检查方案信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(@RequestParam(required = false) String checkType){ - return Result.ok(checkSchemeService.list(checkType)); + public Result> list(@RequestParam(required = false) String checkMethod){ + return Result.ok(checkSchemeService.list(checkMethod)); } @ApiOperation(value = "查询检查方案详情", httpMethod = "GET") diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 4e96b3b..1edc6e8 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -134,7 +134,7 @@ public class CommonController { } @ApiOperation(value = "查询在职状态", httpMethod = "GET") - @GetMapping("/list/user_status") + @GetMapping("/list/user-status") public Result listUserStatus(){ return Result.ok(UserStatusEnum.listAll()); } @@ -146,16 +146,22 @@ public class CommonController { } @ApiOperation(value = "查询保险状态", httpMethod = "GET") - @GetMapping("/list/insurance_status") + @GetMapping("/list/insurance-status") public Result listInsuranceStatus(){ return Result.ok(InsuranceStatusEnum.listAll()); } @ApiOperation(value = "查询附件业务类型", httpMethod = "GET") - @GetMapping("/list/attach_business_type") + @GetMapping("/list/attach-business_type") public Result listAttachBusinessType(){ return Result.ok(AttachBusinessTypeEnum.listAll()); } + @ApiOperation(value = "查询检查方式", httpMethod = "GET") + @GetMapping("/list/check-method") + public Result listCheckMethod(){ + return Result.ok(CheckMethodEnum.listAll()); + } + } From 817791b6e1cbddc9cdacddaddd56a3d59f54265b Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sat, 12 Jul 2025 22:14:00 +0800 Subject: [PATCH 101/143] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E4=BB=B6id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/vo/DefectListReq.java | 8 +++++--- .../java/com/dite/znpt/domain/vo/DefectListResp.java | 7 +++++++ .../src/main/java/com/dite/znpt/mapper/DefectMapper.java | 4 ++-- .../main/java/com/dite/znpt/service/DefectService.java | 4 ++-- .../com/dite/znpt/service/impl/DefectServiceImpl.java | 8 ++++---- core/src/main/resources/mapper/DefectMapper.xml | 6 +++--- .../com/dite/znpt/web/controller/DefectController.java | 9 +++------ 7 files changed, 26 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 7d06d01..87ef106 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -1,12 +1,11 @@ package com.dite.znpt.domain.vo; -import java.io.Serializable; -import java.math.BigDecimal; - import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + /** * @author huise23 * @date 2025/04/11 23:17 @@ -27,6 +26,9 @@ public class DefectListReq implements Serializable { @ApiModelProperty("机组id") private String turbineId; + @ApiModelProperty("部件id") + private String partId; + @ApiModelProperty("缺陷类型,枚举:DefectTypeEnum") private String defectType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java index cabef9b..3dc0e60 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.dite.znpt.domain.bo.Detection; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -32,4 +33,10 @@ public class DefectListResp implements Serializable { @ApiModelProperty("说明") private String description; + + @ApiModelProperty("标注信息") + private String labelInfo; + + @ApiModelProperty("标注信息") + private Detection markInfo; } diff --git a/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java b/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java index 4a9e2c9..d1ddb14 100644 --- a/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/DefectMapper.java @@ -3,8 +3,8 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.DefectEntity; import com.dite.znpt.domain.vo.DefectListReq; +import com.dite.znpt.domain.vo.DefectListResp; import com.dite.znpt.domain.vo.DefectResp; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * @Description: 缺陷记录表数据库访问层 */ public interface DefectMapper extends BaseMapper { - List queryBySelective(DefectListReq defectReq); + List queryBySelective(DefectListReq defectReq); DefectResp detail(String defectId); } diff --git a/core/src/main/java/com/dite/znpt/service/DefectService.java b/core/src/main/java/com/dite/znpt/service/DefectService.java index 4796f8c..c2e9eef 100644 --- a/core/src/main/java/com/dite/znpt/service/DefectService.java +++ b/core/src/main/java/com/dite/znpt/service/DefectService.java @@ -21,9 +21,9 @@ public interface DefectService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List page(DefectListReq req); + List page(DefectListReq req); - List list(DefectListReq req); + List list(DefectListReq req); /** * 功能描述:查询单条缺陷记录 diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index c30661b..a68dbd6 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -58,9 +58,9 @@ public class DefectServiceImpl extends ServiceImpl i * @date 2025/04/11 23:17 **/ @Override - public List page(DefectListReq req) { + public List page(DefectListReq req) { PageUtil.startPage(); - List list = this.list(req); + List list = this.list(req); list.forEach(defect -> { defect.setMarkInfo(JSONUtil.toBean(defect.getLabelInfo(), Detection.class)); }); @@ -68,8 +68,8 @@ public class DefectServiceImpl extends ServiceImpl i } @Override - public List list(DefectListReq req) { - List defectList= this.baseMapper.queryBySelective(req); + public List list(DefectListReq req) { + List defectList= this.baseMapper.queryBySelective(req); defectList.forEach(defect -> { defect.setMarkInfo(JSONUtil.toBean(defect.getLabelInfo(), Detection.class)); }); diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index 8aaf74b..36ca53a 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -11,12 +11,12 @@ LEFT JOIN image_collect ic ON ic.collect_id = i.collect_id LEFT JOIN part p ON i.part_id = p.part_id - -# AND (d.defect_name LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%') OR d.defect_code LIKE concat('%', #{keyword,jdbcType=VARCHAR}, '%')) - AND p.turbine_id = #{turbineId} + + AND i.part_id = #{partId} + AND d.defect_type = #{defectType} diff --git a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java index 5634ea3..91e1f88 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DefectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DefectController.java @@ -3,10 +3,7 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.DefectListReq; -import com.dite.znpt.domain.vo.DefectMarkReq; -import com.dite.znpt.domain.vo.DefectReq; -import com.dite.znpt.domain.vo.DefectResp; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.service.DefectService; import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.Api; @@ -30,13 +27,13 @@ public class DefectController { @ApiOperation(value = "分页查询缺陷记录列表", httpMethod = "GET") @GetMapping("/page") - public PageResult page(DefectListReq req) { + public PageResult page(DefectListReq req) { return PageResult.ok(defectService.page(req)); } @ApiOperation(value = "查询缺陷记录列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(DefectListReq req) { + public Result> list(DefectListReq req) { return Result.ok(defectService.list(req)); } From c8cf7169ca6cfc1eb1662536f9f7370c912bfec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 14 Jul 2025 18:15:46 +0800 Subject: [PATCH 102/143] =?UTF-8?q?=E7=94=9F=E6=88=90=E6=8A=A5=E5=91=8A-to?= =?UTF-8?q?do?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 3 + .../java/com/dite/znpt/converts/Converts.java | 2 + .../znpt/domain/entity/CheckSchemeEntity.java | 2 +- .../domain/entity/InspectionReportEntity.java | 7 +- .../znpt/domain/vo/CheckSchemeListReq.java | 27 ++++++ .../dite/znpt/domain/vo/CheckSchemeReq.java | 1 - .../domain/vo/InspectionReportCoverInfo.java | 4 + .../domain/vo/InspectionReportListReq.java | 40 +++++++++ .../domain/vo/InspectionReportListResp.java | 59 +++++++++++++ .../znpt/domain/vo/InspectionReportReq.java | 40 +++++---- .../com/dite/znpt/domain/vo/TurbineResp.java | 2 +- .../znpt/mapper/InspectionReportMapper.java | 9 ++ .../dite/znpt/service/CheckSchemeService.java | 4 +- .../znpt/service/InspectionReportService.java | 11 +++ .../service/impl/CheckSchemeServiceImpl.java | 10 ++- .../impl/InspectionReportServiceImpl.java | 82 +++++++++++++++++-- .../mapper/InspectionReportMapper.xml | 6 ++ .../web/controller/CheckSchemeController.java | 8 +- .../InspectionReportController.java | 51 +++++++++++- 19 files changed, 330 insertions(+), 38 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index d694614..974043f 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -20,7 +20,9 @@ public class Message implements Serializable { public static final String IMAGE_SOURCE_IS_NOT_EXIST = "图像类型不存在"; public static final String DEFECT_ID_IS_NOT_EXIST = "缺陷id不存在"; public static final String PROJECT_ID_IS_NOT_EXIST = "项目id不存在"; + public static final String PROJECT_STATUS_IS_NOT_COMPLETED = "项目[{}]的状态不是已完工"; public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在"; + public static final String TURBINE_STATUS_IS_NOT_COMPLETED = "机组[{}]的状态不是已完工"; public static final String PART_ID_IS_NOT_EXIST = "部件id不存在"; public static final String USER_ID_NOT_EXIST = "用户id不存在"; public static final String USER_ID_NOT_EXIST_OR_ILLEGAL = "用户id不存在或者不合法"; @@ -67,4 +69,5 @@ public class Message implements Serializable { public static final String SUGGESTION_ID_IS_NOT_EXIST = "维修建议id不存在"; public static final String SUGGESTION_LEVEL_TYPE_FORBID_REPEAT = "存在缺陷级别为[{}]缺陷类型为[{}]的维修建议"; public static final String CHECK_SCHEME_ID_IS_NOT_EXIST = "检查方案id不存在"; + public static final String INSPECTION_REPORT_ID_IS_NOT_EXIST = "检查报告id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index a8f7ba6..35a0e18 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -108,5 +108,7 @@ public interface Converts { CheckSchemeResp toCheckSchemeResp(CheckSchemeEntity entity); CheckSchemeEntity toCheckSchemeEntity(CheckSchemeReq req); + + InspectionReportEntity toInspectionReportEntity(InspectionReportReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java index d007394..ae4d742 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/CheckSchemeEntity.java @@ -52,6 +52,6 @@ public class CheckSchemeEntity extends AuditableEntity implements Serializable { private String remark; @ApiModelProperty("删除标志(0代表存在 1代表删除)") - @TableField("delFlag") + @TableField("del_flag") private String delFlag; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java index be836b3..308e6a2 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java @@ -13,7 +13,6 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; -import java.time.LocalDateTime; /** * @author Bear.G @@ -78,7 +77,7 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告编制时间") @TableField("report_write_time") - private LocalDateTime reportWriteTime; + private LocalDate reportWriteTime; @ApiModelProperty("报告复核人员id") @TableField("report_reviewer") @@ -86,7 +85,7 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告复核时间") @TableField("report_review_time") - private LocalDateTime reportReviewTime; + private LocalDate reportReviewTime; @ApiModelProperty("报告审核人员id") @TableField("report_auditor") @@ -94,5 +93,5 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告审核时间") @TableField("report_audit_time") - private LocalDateTime reportAuditTime; + private LocalDate reportAuditTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeListReq.java new file mode 100644 index 0000000..514f615 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeListReq.java @@ -0,0 +1,27 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/9 23:35 + * @Description: + */ +@Data +@ApiModel("检查方案列表查询请求实体") +public class CheckSchemeListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1345082408495150993L; + + @ApiModelProperty("检查方式,枚举CheckMethodEnum") + private List checkMethod; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java index 6935dbe..02c0ab2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/CheckSchemeReq.java @@ -44,7 +44,6 @@ public class CheckSchemeReq implements Serializable { @ApiModelProperty("检查方式,枚举CheckMethodEnum") private String checkMethod; - @NotBlank(message = "备注不能为空") @Size(max = 500, message = "备注不能超过500个字") @ApiModelProperty("备注") private String remark; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java index 19d51ec..697e437 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java @@ -1,6 +1,7 @@ package com.dite.znpt.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -38,6 +39,7 @@ public class InspectionReportCoverInfo implements Serializable { @ApiModelProperty("报告编制人员") private String reportWriterName; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("报告编制时间") private LocalDateTime reportWriteTime; @@ -47,6 +49,7 @@ public class InspectionReportCoverInfo implements Serializable { @ApiModelProperty("报告复核人员") private String reportReviewerName; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("报告复核时间") private LocalDateTime reportReviewTime; @@ -56,6 +59,7 @@ public class InspectionReportCoverInfo implements Serializable { @ApiModelProperty("报告审核人员") private String reportAuditName; + @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("报告审核时间") private LocalDateTime reportAuditTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListReq.java new file mode 100644 index 0000000..9daa4d3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListReq.java @@ -0,0 +1,40 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/14/周一 15:32 + * @description + */ +@Data +@ApiModel("检查报告列表请求实体") +public class InspectionReportListReq implements Serializable { + @Serial + private static final long serialVersionUID = -8122588121700840604L; + + @ApiModelProperty("主标题") + private String title; + + @ApiModelProperty("副标题") + private String subTile; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("机组id") + private String turbineId; + + @ApiModelProperty("风场名字") + private String farmName; + + @ApiModelProperty("委托单位") + private String client; + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java new file mode 100644 index 0000000..80153c0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java @@ -0,0 +1,59 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/14/周一 15:32 + * @description + */ +@Data +@ApiModel("检查报告列表响应实体") +public class InspectionReportListResp implements Serializable { + @Serial + private static final long serialVersionUID = -7652873535955803183L; + + @ApiModelProperty("报告id") + private String reportId; + + @ApiModelProperty("主标题") + private String title; + + @ApiModelProperty("副标题") + private String subTitle; + + @ApiModelProperty("报告编制人员") + private String reportWriterName; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("报告编制时间") + private LocalDateTime reportWriteTime; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("风场名字") + private String farmName; + + @ApiModelProperty("委托单位") + private String client; + + @ApiModelProperty("机组id") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组编码") + private String turbineCode; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java index c679385..dd5ebe4 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReq.java @@ -1,17 +1,16 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; -import java.time.LocalDateTime; /** * @Author: gaoxiong @@ -24,55 +23,68 @@ public class InspectionReportReq implements Serializable { @Serial private static final long serialVersionUID = 4937399975205847660L; - @ApiModelProperty("报告id") - private String reportId; - + @NotBlank(message = "主标题不能为空") + @Size(max = 50, message = "主标题长度不能超过50") @ApiModelProperty("主标题") private String title; + @NotBlank(message = "副标题不能为空") + @Size(max = 50, message = "副标题长度不能超过50") @ApiModelProperty("副标题") private String subTitle; @ApiModelProperty("封面") private String coverImage; + @NotBlank(message = "项目id不能为空") @ApiModelProperty("项目id") private String projectId; + @NotBlank(message = "机组id不能为空") @ApiModelProperty("机组id") private String turbineId; + @NotNull(message = "检查日期不能为空") @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("检查日期") private LocalDate checkDate; - @ApiModelProperty("检查位置") - private String checkPosition; - + @NotBlank(message = "检查内容不能为空") @ApiModelProperty("检查内容") private String checkContent; - @ApiModelProperty("检查方式,多个方式英文逗号分隔") + @NotBlank(message = "检查内容不能为空") + @ApiModelProperty("检查方式,多个方式英文逗号分隔,枚举:CheckMethodEnum") private String checkMethod; + @NotBlank(message = "检查人员不能为空") @ApiModelProperty("检查人员id,多个人员英文逗号分隔") private String checkUserId; + @NotBlank(message = "报告编制人员不能为空") @ApiModelProperty("报告编制人员id") private String reportWriter; + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "报告编制时间不能为空") @ApiModelProperty("报告编制时间") - private LocalDateTime reportWriteTime; + private LocalDate reportWriteTime; + @NotBlank(message = "报告复核人员不能为空") @ApiModelProperty("报告复核人员id") private String reportReviewer; + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "报告复核时间不能为空") @ApiModelProperty("报告复核时间") - private LocalDateTime reportReviewTime; + private LocalDate reportReviewTime; + @NotBlank(message = "报告审核人员不能为空") @ApiModelProperty("报告审核人员id") private String reportAuditor; + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "报告审核时间不能为空") @ApiModelProperty("报告审核时间") - private LocalDateTime reportAuditTime; + private LocalDate reportAuditTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java index beb18d9..7e60769 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TurbineResp.java @@ -18,7 +18,7 @@ public class TurbineResp implements Serializable { @Serial private static final long serialVersionUID = -1403719853347580858L; - @ApiModelProperty("机组号") + @ApiModelProperty("机组id") private String turbineId; @ApiModelProperty("项目id") diff --git a/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java b/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java index f9a62ab..8a42c64 100644 --- a/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/InspectionReportMapper.java @@ -2,6 +2,12 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.InspectionReportEntity; +import com.dite.znpt.domain.vo.InspectionReportListReq; +import com.dite.znpt.domain.vo.InspectionReportListResp; +import com.dite.znpt.domain.vo.InspectionReportResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G @@ -9,4 +15,7 @@ import com.dite.znpt.domain.entity.InspectionReportEntity; * @description */ public interface InspectionReportMapper extends BaseMapper { + + List listInspectionReportListResp(@Param("req") InspectionReportListReq req); + InspectionReportResp getInspectionReportResp(@Param("reportId") String reportId); } diff --git a/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java index 78e7e6f..06274c0 100644 --- a/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java +++ b/core/src/main/java/com/dite/znpt/service/CheckSchemeService.java @@ -13,8 +13,8 @@ import java.util.List; * @Description: */ public interface CheckSchemeService extends IService { - List page(String checkMethod); - List list(String checkMethod); + List page(List checkMethods); + List list(List checkMethods); CheckSchemeResp detail(String checkSchemeId); void save(CheckSchemeReq req); void update(String checkSchemeId, CheckSchemeReq req); diff --git a/core/src/main/java/com/dite/znpt/service/InspectionReportService.java b/core/src/main/java/com/dite/znpt/service/InspectionReportService.java index 6723e3a..df8db79 100644 --- a/core/src/main/java/com/dite/znpt/service/InspectionReportService.java +++ b/core/src/main/java/com/dite/znpt/service/InspectionReportService.java @@ -2,6 +2,12 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.InspectionReportEntity; +import com.dite.znpt.domain.vo.InspectionReportListReq; +import com.dite.znpt.domain.vo.InspectionReportListResp; +import com.dite.znpt.domain.vo.InspectionReportReq; +import com.dite.znpt.domain.vo.InspectionReportResp; + +import java.util.List; /** * @author Bear.G @@ -9,4 +15,9 @@ import com.dite.znpt.domain.entity.InspectionReportEntity; * @description */ public interface InspectionReportService extends IService { + List page(InspectionReportListReq req); + List list(InspectionReportListReq req); + InspectionReportResp detail(String reportId); + void save(InspectionReportReq req); + void update(String reportId, InspectionReportReq req); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java index 7c0535b..6d5829c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/CheckSchemeServiceImpl.java @@ -28,14 +28,16 @@ import java.util.List; public class CheckSchemeServiceImpl extends ServiceImpl implements CheckSchemeService { @Override - public List page(String checkMethod) { + public List page(List checkMethods) { PageUtil.startPage(); - return this.list(checkMethod); + return this.list(checkMethods); } @Override - public List list(String checkMethod) { - List result = Converts.INSTANCE.toCheckSchemeResp(this.list(Wrappers.lambdaQuery(CheckSchemeEntity.class).eq(StrUtil.isNotBlank(checkMethod), CheckSchemeEntity::getCheckMethod, checkMethod))); + public List list(List checkMethods) { + List result = Converts.INSTANCE.toCheckSchemeResp( + this.list(Wrappers.lambdaQuery(CheckSchemeEntity.class).in(null != checkMethods && !checkMethods.isEmpty(), CheckSchemeEntity::getCheckMethod, checkMethods)) + ); result.forEach(resp -> { resp.setCheckMethodLabel(CheckMethodEnum.getDescByCode(resp.getCheckMethod())); }); diff --git a/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java index b2d352a..0304d35 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java @@ -1,12 +1,29 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.InspectionReportEntity; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.vo.InspectionReportListReq; +import com.dite.znpt.domain.vo.InspectionReportListResp; +import com.dite.znpt.domain.vo.InspectionReportReq; +import com.dite.znpt.domain.vo.InspectionReportResp; +import com.dite.znpt.enums.ProjectStatusEnum; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.InspectionReportMapper; +import com.dite.znpt.service.InspectionReportService; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.TurbineService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.io.Serial; -import java.io.Serializable; +import javax.annotation.Resource; +import java.util.List; /** * @author Bear.G @@ -14,7 +31,62 @@ import java.io.Serializable; * @description */ @Service -public class InspectionReportServiceImpl extends ServiceImpl implements Serializable { - @Serial - private static final long serialVersionUID = 1460849450000057636L; +public class InspectionReportServiceImpl extends ServiceImpl implements InspectionReportService { + + @Resource + private ProjectService projectService; + + @Resource + private TurbineService turbineService; + + @Override + public List page(InspectionReportListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(InspectionReportListReq req) { + return this.baseMapper.listInspectionReportListResp(req); + } + + @Override + public InspectionReportResp detail(String reportId) { + return this.baseMapper.getInspectionReportResp(reportId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(InspectionReportReq req) { + this.save(validation(req)); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String reportId, InspectionReportReq req) { + if(this.getById(reportId) == null){ + throw new ServiceException(Message.INSPECTION_REPORT_ID_IS_NOT_EXIST); + } + InspectionReportEntity entity = validation(req); + entity.setReportId(reportId); + this.updateById(entity); + } + + private InspectionReportEntity validation(InspectionReportReq req){ + ProjectEntity project = projectService.getById(req.getProjectId()); + if(null == project){ + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + if(ProjectStatusEnum.COMPLETED.getCode() != project.getStatus()){ + throw new ServiceException(StrUtil.format(Message.PROJECT_STATUS_IS_NOT_COMPLETED, project.getProjectName())); + } + TurbineEntity turbine = turbineService.getById(req.getTurbineId()); + if(null == turbine){ + throw new ServiceException(Message.TURBINE_ID_IS_NOT_EXIST); + } + if(ProjectStatusEnum.COMPLETED.getCode() != turbine.getStatus()){ + throw new ServiceException(StrUtil.format(Message.TURBINE_STATUS_IS_NOT_COMPLETED, turbine.getTurbineName())); + } + return Converts.INSTANCE.toInspectionReportEntity(req); + } } diff --git a/core/src/main/resources/mapper/InspectionReportMapper.xml b/core/src/main/resources/mapper/InspectionReportMapper.xml index 6a13b56..a98f8e4 100644 --- a/core/src/main/resources/mapper/InspectionReportMapper.xml +++ b/core/src/main/resources/mapper/InspectionReportMapper.xml @@ -1,4 +1,10 @@ + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java index c8e30dc..0dd4abb 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CheckSchemeController.java @@ -27,14 +27,14 @@ public class CheckSchemeController { @ApiOperation(value = "分页查询检查方案信息", httpMethod = "GET") @GetMapping("/page") - public PageResult page(@RequestParam(required = false) String checkMethod){ - return PageResult.ok(checkSchemeService.page(checkMethod)); + public PageResult page(@RequestParam(required = false) List checkMethods){ + return PageResult.ok(checkSchemeService.page(checkMethods)); } @ApiOperation(value = "查询检查方案信息列表", httpMethod = "GET") @GetMapping("/list") - public Result> list(@RequestParam(required = false) String checkMethod){ - return Result.ok(checkSchemeService.list(checkMethod)); + public Result> list(@RequestParam(required = false) List checkMethods){ + return Result.ok(checkSchemeService.list(checkMethods)); } @ApiOperation(value = "查询检查方案详情", httpMethod = "GET") diff --git a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java index 090f103..2e49681 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java @@ -1,8 +1,19 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.InspectionReportListReq; +import com.dite.znpt.domain.vo.InspectionReportListResp; +import com.dite.znpt.domain.vo.InspectionReportReq; +import com.dite.znpt.domain.vo.InspectionReportResp; +import com.dite.znpt.service.InspectionReportService; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; /** * @author Bear.G @@ -13,4 +24,40 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/inspection-report") public class InspectionReportController { + + @Resource + private InspectionReportService inspectionReportService; + + + @ApiOperation(value = "分页查询检查报告列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(InspectionReportListReq req) { + return PageResult.ok(inspectionReportService.page(req)); + } + + @ApiOperation(value = "查询检查报告列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(InspectionReportListReq req) { + return Result.ok(inspectionReportService.list(req)); + } + + @ApiOperation(value = "查询检查报告详情", httpMethod = "GET") + @GetMapping("/detail/{reportId}") + public Result detail(@PathVariable String reportId) { + return Result.ok(inspectionReportService.detail(reportId)); + } + + @ApiOperation(value = "新增检查报告", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody InspectionReportReq req) { + inspectionReportService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改检查报告", httpMethod = "PUT") + @PostMapping("/{reportId}") + public Result edit(@PathVariable String reportId, @Validated @RequestBody InspectionReportReq req) { + inspectionReportService.update(reportId, req); + return Result.ok(); + } } From c29255b7bffa82cee2dd3f89c8a790a97711f693 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Tue, 15 Jul 2025 01:06:12 +0800 Subject: [PATCH 103/143] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=A2=9E=E4=BC=A4=E6=94=B9=E6=9F=A5=E6=8E=A5=E5=8F=A3=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/converts/Converts.java | 6 ++ .../domain/entity/InspectionReportEntity.java | 11 ++- .../dite/znpt/domain/vo/DefectListReq.java | 2 + .../dite/znpt/domain/vo/DefectListResp.java | 17 ++++- .../domain/vo/InspectionReportCheckInfo.java | 9 ++- .../domain/vo/InspectionReportListResp.java | 3 + ...o.java => InspectionReportReportInfo.java} | 6 +- .../znpt/domain/vo/InspectionReportResp.java | 6 +- .../com/dite/znpt/domain/vo/PartListReq.java | 2 + .../znpt/service/impl/DefectServiceImpl.java | 2 + .../impl/InspectionReportServiceImpl.java | 70 +++++++++++++++---- .../znpt/service/impl/ProjectServiceImpl.java | 9 +++ .../znpt/service/impl/TurbineServiceImpl.java | 7 +- .../main/resources/mapper/DefectMapper.xml | 2 +- .../mapper/InspectionReportMapper.xml | 30 +++++++- .../InspectionReportController.java | 7 ++ 16 files changed, 156 insertions(+), 33 deletions(-) rename core/src/main/java/com/dite/znpt/domain/vo/{InspectionReportCoverInfo.java => InspectionReportReportInfo.java} (90%) diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 35a0e18..7154245 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -110,5 +110,11 @@ public interface Converts { CheckSchemeEntity toCheckSchemeEntity(CheckSchemeReq req); InspectionReportEntity toInspectionReportEntity(InspectionReportReq req); + + InspectionReportCheckInfo toInspectionReportCheckInfo(InspectionReportEntity entity); + + InspectionReportReportInfo toInspectionReportReportInfo(InspectionReportEntity entity); + + List toInspectionReportSchemeInfo(List list); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java index 308e6a2..0e47de4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/InspectionReportEntity.java @@ -13,6 +13,7 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; +import java.time.LocalDateTime; /** * @author Bear.G @@ -55,10 +56,6 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @TableField("check_date") private LocalDate checkDate; - @ApiModelProperty("检查位置") - @TableField("check_position") - private String checkPosition; - @ApiModelProperty("检查内容") @TableField("check_content") private String checkContent; @@ -77,7 +74,7 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告编制时间") @TableField("report_write_time") - private LocalDate reportWriteTime; + private LocalDateTime reportWriteTime; @ApiModelProperty("报告复核人员id") @TableField("report_reviewer") @@ -85,7 +82,7 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告复核时间") @TableField("report_review_time") - private LocalDate reportReviewTime; + private LocalDateTime reportReviewTime; @ApiModelProperty("报告审核人员id") @TableField("report_auditor") @@ -93,5 +90,5 @@ public class InspectionReportEntity extends AuditableEntity implements Serializa @ApiModelProperty("报告审核时间") @TableField("report_audit_time") - private LocalDate reportAuditTime; + private LocalDateTime reportAuditTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java index 87ef106..14299d6 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListReq.java @@ -3,6 +3,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serializable; @@ -12,6 +13,7 @@ import java.io.Serializable; * @Description: 缺陷记录请求实体 */ @Data +@Accessors(chain = true) @ApiModel("缺陷记录列表请求实体") public class DefectListReq implements Serializable { diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java index 3dc0e60..f002788 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java @@ -28,12 +28,27 @@ public class DefectListResp implements Serializable { @ApiModelProperty("部件名称") private String partName; - @ApiModelProperty("缺陷未知") + @ApiModelProperty("缺陷类型描述") + private String defectTypeLabel; + + @ApiModelProperty("缺陷类型,枚举DefectTypeEnum") + private String defectType; + + @ApiModelProperty("危重等级描述") + private String defectLevelLabel; + + @ApiModelProperty("危重等级,枚举DefectLevelEnum") + private String defectLevel; + + @ApiModelProperty("缺陷位置") private String defectPosition; @ApiModelProperty("说明") private String description; + @ApiModelProperty("维修建议") + private String repairIdea; + @ApiModelProperty("标注信息") private String labelInfo; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java index 57a255c..9c825b3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCheckInfo.java @@ -24,15 +24,18 @@ public class InspectionReportCheckInfo implements Serializable { @ApiModelProperty("检查日期") private LocalDate checkDate; - @ApiModelProperty("检查位置") - private String checkPosition; - @ApiModelProperty("检查内容") private String checkContent; @ApiModelProperty("检查方式") private String checkMethod; + @ApiModelProperty("检查方式描述") + private String checkMethodLabel; + @ApiModelProperty("检查人员id,多个人员英文逗号分隔") private String checkUserId; + + @ApiModelProperty("检查人员") + private String checkUserName; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java index 80153c0..a5c6e04 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportListResp.java @@ -29,6 +29,9 @@ public class InspectionReportListResp implements Serializable { @ApiModelProperty("副标题") private String subTitle; + @ApiModelProperty("报告编制人员id") + private String reportWriter; + @ApiModelProperty("报告编制人员") private String reportWriterName; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReportInfo.java similarity index 90% rename from core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java rename to core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReportInfo.java index 697e437..fd12a76 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportCoverInfo.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportReportInfo.java @@ -1,6 +1,5 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -16,8 +15,8 @@ import java.time.LocalDateTime; * @Description: */ @Data -@ApiModel("检查报告封面信息") -public class InspectionReportCoverInfo implements Serializable { +@ApiModel("检查报告信息") +public class InspectionReportReportInfo implements Serializable { @Serial private static final long serialVersionUID = 2416173276374292199L; @@ -62,4 +61,5 @@ public class InspectionReportCoverInfo implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty("报告审核时间") private LocalDateTime reportAuditTime; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java index 8d15c94..d307245 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/InspectionReportResp.java @@ -3,6 +3,7 @@ package com.dite.znpt.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serial; import java.io.Serializable; @@ -14,13 +15,14 @@ import java.util.List; * @Description: */ @Data +@Accessors(chain = true) @ApiModel("检查报告响应实体") public class InspectionReportResp implements Serializable { @Serial private static final long serialVersionUID = -2229157312487991799L; @ApiModelProperty("封面信息") - private InspectionReportCoverInfo coverInfo; + private InspectionReportReportInfo reportInfo; @ApiModelProperty("项目信息") private ProjectResp projectInfo; @@ -35,5 +37,5 @@ public class InspectionReportResp implements Serializable { private List schemeInfoList; @ApiModelProperty("缺陷信息") - private List defectInfoList; + private List defectInfoList; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java index fb5ccb0..e5b40ad 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/PartListReq.java @@ -5,6 +5,7 @@ import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.experimental.Accessors; /** * @author huise23 @@ -12,6 +13,7 @@ import lombok.Data; * @Description: 请求实体 */ @Data +@Accessors(chain = true) @ApiModel("部件列表请求实体") public class PartListReq implements Serializable { diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index a68dbd6..91dfc47 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -71,6 +71,8 @@ public class DefectServiceImpl extends ServiceImpl i public List list(DefectListReq req) { List defectList= this.baseMapper.queryBySelective(req); defectList.forEach(defect -> { + defect.setDefectTypeLabel(DefectTypeEnum.getDescByCode(defect.getDefectType())); + defect.setDefectLevelLabel(DefectLevelEnum.getDescByCode(defect.getDefectLevel())); defect.setMarkInfo(JSONUtil.toBean(defect.getLabelInfo(), Detection.class)); }); return defectList; diff --git a/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java index 0304d35..4586040 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/InspectionReportServiceImpl.java @@ -5,25 +5,21 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.InspectionReportEntity; -import com.dite.znpt.domain.entity.ProjectEntity; -import com.dite.znpt.domain.entity.TurbineEntity; -import com.dite.znpt.domain.vo.InspectionReportListReq; -import com.dite.znpt.domain.vo.InspectionReportListResp; -import com.dite.znpt.domain.vo.InspectionReportReq; -import com.dite.znpt.domain.vo.InspectionReportResp; +import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.vo.*; +import com.dite.znpt.enums.CheckMethodEnum; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.InspectionReportMapper; -import com.dite.znpt.service.InspectionReportService; -import com.dite.znpt.service.ProjectService; -import com.dite.znpt.service.TurbineService; +import com.dite.znpt.service.*; import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author Bear.G @@ -39,6 +35,16 @@ public class InspectionReportServiceImpl extends ServiceImpl page(InspectionReportListReq req) { PageUtil.startPage(); @@ -52,7 +58,47 @@ public class InspectionReportServiceImpl extends ServiceImpl userIds = new ArrayList<>(); + InspectionReportReportInfo reportInfo = Converts.INSTANCE.toInspectionReportReportInfo(inspectionReport); + userIds.add(reportInfo.getReportAuditor()); + userIds.add(reportInfo.getReportWriter()); + userIds.add(reportInfo.getReportReviewer()); + ProjectResp projectInfo = projectService.detail(inspectionReport.getProjectId()); + result.setProjectInfo(projectInfo); + TurbineInfoResp turbineInfo = turbineService.info(inspectionReport.getTurbineId()); + result.setTurbineInfo(turbineInfo); + List schemeInfoList = checkSchemeService.list(List.of(inspectionReport.getCheckMethod().split(StrUtil.COMMA))); + result.setSchemeInfoList(schemeInfoList); + InspectionReportCheckInfo checkInfo = Converts.INSTANCE.toInspectionReportCheckInfo(inspectionReport); + userIds.addAll(List.of(checkInfo.getCheckUserId().split(StrUtil.COMMA))); + Map userIdMap = userService.listByIds(userIds).stream().collect(Collectors.toMap(UserEntity::getUserId, Function.identity())); + if(userIdMap.containsKey(reportInfo.getReportAuditor())){ + reportInfo.setReportAuditName(userIdMap.get(reportInfo.getReportAuditor()).getName()); + } + if(userIdMap.containsKey(reportInfo.getReportWriter())){ + reportInfo.setReportWriterName(userIdMap.get(reportInfo.getReportWriter()).getName()); + } + if(userIdMap.containsKey(reportInfo.getReportReviewer())){ + reportInfo.setReportReviewerName(userIdMap.get(reportInfo.getReportReviewer()).getName()); + } + result.setReportInfo(reportInfo); + StringBuilder checkUserName = new StringBuilder(); + Arrays.stream(checkInfo.getCheckUserId().split(StrUtil.COMMA)).forEach(userId ->{ + if(userIdMap.containsKey(userId)){ + checkUserName.append(userIdMap.get(userId).getUserId()).append(StrUtil.COMMA); + } + }); + checkInfo.setCheckUserName(checkUserName.toString()); + checkInfo.setCheckMethodLabel(CheckMethodEnum.getDescByCode(checkInfo.getCheckMethod())); + result.setCheckInfo(checkInfo); + List defectInfoList = defectService.list(new DefectListReq().setTurbineId(inspectionReport.getTurbineId())); + result.setDefectInfoList(defectInfoList); + return result; } @Transactional(rollbackFor = Exception.class) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java index 3748b14..faf5a4a 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -97,10 +98,18 @@ public class ProjectServiceImpl extends ServiceImpl userIdMap = userService.listByIds(userIds).stream().collect(Collectors.toMap(k->k.getUserId(), Function.identity())); if(CollUtil.isNotEmpty(userIdMap)){ + StringBuilder constructorName = new StringBuilder(); resp.setAuditorName(userIdMap.containsKey(resp.getAuditorId()) ? userIdMap.get(resp.getAuditorId()).getName() : null); resp.setProjectManagerName(userIdMap.containsKey(resp.getProjectManagerId()) ? userIdMap.get(resp.getProjectManagerId()).getName() : null); resp.setConstructionTeamLeaderName(userIdMap.containsKey(resp.getConstructionTeamLeaderId()) ? userIdMap.get(resp.getConstructionTeamLeaderId()).getName() : null); resp.setQualityOfficerName(userIdMap.containsKey(resp.getQualityOfficerId()) ? userIdMap.get(resp.getQualityOfficerId()).getName() : null); + Arrays.stream(resp.getConstructorIds().split(StrUtil.COMMA)).forEach(id -> { + if(userIdMap.containsKey(id)){ + constructorName.append(userIdMap.get(id).getName()).append(StrUtil.COMMA); + } + }); + constructorName.deleteCharAt(constructorName.lastIndexOf(StrUtil.COMMA)); + resp.setConstructorName(constructorName.toString()); } } return resp; diff --git a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java index d5647af..4daf34f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TurbineServiceImpl.java @@ -11,6 +11,7 @@ import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.domain.vo.*; import com.dite.znpt.domain.vo.job.resp.TurbineStatusResp; import com.dite.znpt.enums.Enums; +import com.dite.znpt.enums.PartTypeEnum; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.TurbineMapper; @@ -119,7 +120,11 @@ public class TurbineServiceImpl extends ServiceImpl { + part.setPartTypeLabel(PartTypeEnum.getDescByCode(part.getPartType())); + }); + return result; } /** diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index 36ca53a..48f0fdf 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -5,7 +5,7 @@ - + SELECT ir.report_id, ir.title, ir.sub_title, ir.report_writer, u.name AS reportWriterName, ir.report_write_time, + ir.project_id, p.project_name, p.farm_name, p.`client`, + ir.turbine_id, t.turbine_name, t.turbine_code + FROM inspection_report ir + LEFT JOIN user u ON ir.report_writer = u.user_id + LEFT JOIN project p ON ir.project_id = p.project_id + LEFT JOIN turbine t ON ir.turbine_id = t.turbine_id + + + AND ir.title LIKE concat('%', #{req.title}, '%') + + + AND ir.sub_title LIKE concat('%', #{req.subTile}, '%') + + + AND ir.project_id = #{req.projectId} + + + AND ir.turbine_id = #{req.turbineId} + + + AND p.farm_name LIKE concat('%', #{req.farmName}, '%') + + + AND p.client LIKE concat('%', #{req.client}, '%') + + - \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java index 2e49681..d43883c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java @@ -60,4 +60,11 @@ public class InspectionReportController { inspectionReportService.update(reportId, req); return Result.ok(); } + + @ApiOperation(value = "删除检查报告", httpMethod = "DELETE") + @DeleteMapping("/{reportId}") + public Result delete(@PathVariable String reportId) { + inspectionReportService.removeById(reportId); + return Result.ok(); + } } From 469f9ebf47c3c0df6a1b1be873e911e66099d596 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 16 Jul 2025 16:22:05 +0800 Subject: [PATCH 104/143] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/entity/ImageEntity.java | 5 ++++- .../com/dite/znpt/domain/vo/ImageListReq.java | 3 +++ .../java/com/dite/znpt/domain/vo/ImageResp.java | 7 +++---- .../java/com/dite/znpt/service/ImageService.java | 9 +++++++++ .../dite/znpt/service/impl/ImageServiceImpl.java | 15 +++++++++++++++ core/src/main/resources/mapper/ImageMapper.xml | 8 ++++++-- .../dite/znpt/web/controller/ImageController.java | 7 +++++++ 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 2955ab4..3b89da4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -12,7 +12,6 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -117,4 +116,8 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("image_path") private String imagePath; + @ApiModelProperty("是否已审核,0未审核,1已审核") + @TableField("review_state") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index e523da5..1809ea2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -30,4 +30,7 @@ public class ImageListReq implements Serializable { @ApiModelProperty("图像类型") private String[] imageTypes; + @ApiModelProperty("是否已审核,0未审核,1已审核") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 4105c44..d203632 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,15 +1,11 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.domain.entity.AudioFileInfoEntity; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.List; /** @@ -47,4 +43,7 @@ public class ImageResp implements Serializable { @ApiModelProperty("关联图像的音频列表") private List audioList; + @ApiModelProperty("是否已审核,0未审核,1已审核") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index af583a7..01bb42d 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -42,4 +42,13 @@ public interface ImageService extends IService { * @date 2025/06/06 09:44 **/ void linkAppImagesToPart(AppImageToPartReq partReq); + + /** + * 功能描述:审核图片 + * + * @param imageIds 图片id列表 + * @author cuizhibin + * @date 2025/07/16 15:28 + **/ + void reviewImages(List imageIds); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index c47e9c2..ccb6c56 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -441,4 +441,19 @@ public class ImageServiceImpl extends ServiceImpl impl imageCollectService.save(BeanUtil.copyProperties(partReq, ImageCollectEntity.class)); baseMapper.insert(newImageList); } + + /** + * 功能描述:审核图片 + * + * @param imageIds 图片id列表 + * @author cuizhibin + * @date 2025/07/16 15:28 + **/ + @Override + public void reviewImages(List imageIds) { + if (CollUtil.isEmpty(imageIds)) { + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + lambdaUpdate().in(ImageEntity::getImageId, imageIds).set(ImageEntity::getReviewState, "1").update(); + } } diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 580bbd0..e47e4b9 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,7 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -22,6 +22,9 @@ AND i.image_type in #{imageType} + + and i.review_state = #{reviewState} + @@ -31,6 +34,7 @@ + @@ -64,7 +68,7 @@ SELECT i.image_id, i.image_name, i.image_path, i.image_height, i.image_resolution, i.image_width, i.image_height, i.focal_distance, i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, - ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source + ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId} diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 4c3ed4c..9ee105b 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -88,4 +88,11 @@ public class ImageController { imageService.linkAppImagesToPart(partReq); return Result.ok(); } + + @ApiOperation(value = "审核图片", httpMethod = "POST") + @PostMapping("/reviewImages") + public Result reviewImages(@RequestBody List imageIds) { + imageService.reviewImages(imageIds); + return Result.ok(); + } } From cca6148842510ed0cc708f9ed0945be6556809a1 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Fri, 18 Jul 2025 01:39:23 +0800 Subject: [PATCH 105/143] =?UTF-8?q?=E9=9B=86=E6=88=90=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=BC=95=E6=93=8Eflowable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/dto/FlowProcDefDto.java | 57 + .../znpt/domain/entity/RoleMenuEntity.java | 4 + .../dite/znpt/mapper/FlowDeployMapper.java | 23 + .../.mvn/wrapper/maven-wrapper.properties | 19 + flowable/pom.xml | 67 + .../common/constant/ProcessConstants.java | 80 ++ .../flowable/common/enums/FlowComment.java | 43 + .../flowable/common/expand/el/BaseEl.java | 12 + .../flowable/common/expand/el/FlowEl.java | 26 + .../znpt/flowable/config/FlowableConfig.java | 23 + .../config/MyDefaultProcessDiagramCanvas.java | 95 ++ .../controller/FlowDefinitionController.java | 200 +++ .../controller/FlowInstanceController.java | 62 + .../controller/FlowTaskController.java | 267 ++++ .../controller/SysExpressionController.java | 91 ++ .../controller/SysFormController.java | 104 ++ .../controller/SysListenerController.java | 92 ++ .../flowable/domain/dto/FlowCommentDto.java | 25 + .../flowable/domain/dto/FlowFromFieldDTO.java | 15 + .../znpt/flowable/domain/dto/FlowNextDto.java | 30 + .../flowable/domain/dto/FlowSaveXmlVo.java | 28 + .../znpt/flowable/domain/dto/FlowTaskDto.java | 102 ++ .../flowable/domain/dto/FlowViewerDto.java | 23 + .../flowable/domain/entity/SysDeployForm.java | 51 + .../flowable/domain/entity/SysExpression.java | 73 + .../znpt/flowable/domain/entity/SysForm.java | 63 + .../flowable/domain/entity/SysListener.java | 87 ++ .../znpt/flowable/domain/vo/FlowQueryVo.java | 36 + .../znpt/flowable/domain/vo/FlowTaskVo.java | 56 + .../flowable/domain/vo/ReturnTaskNodeVo.java | 26 + .../flowable/factory/FlowServiceFactory.java | 41 + .../flow/CustomProcessDiagramCanvas.java | 370 +++++ .../flow/CustomProcessDiagramGenerator.java | 404 ++++++ .../znpt/flowable/flow/FindNextNodeUtil.java | 266 ++++ .../znpt/flowable/flow/FlowableUtils.java | 702 +++++++++ .../listener/FlowExecutionListener.java | 36 + .../flowable/listener/FlowTaskListener.java | 32 + .../flowable/mapper/SysDeployFormMapper.java | 73 + .../flowable/mapper/SysExpressionMapper.java | 63 + .../znpt/flowable/mapper/SysFormMapper.java | 63 + .../flowable/mapper/SysListenerMapper.java | 62 + .../service/IFlowDefinitionService.java | 80 ++ .../service/IFlowInstanceService.java | 53 + .../flowable/service/IFlowTaskService.java | 218 +++ .../service/ISysDeployFormService.java | 70 + .../service/ISysExpressionService.java | 63 + .../flowable/service/ISysFormService.java | 61 + .../flowable/service/ISysListenerService.java | 63 + .../impl/FlowDefinitionServiceImpl.java | 241 ++++ .../service/impl/FlowInstanceServiceImpl.java | 119 ++ .../service/impl/FlowTaskServiceImpl.java | 1266 +++++++++++++++++ .../impl/SysDeployFormServiceImpl.java | 112 ++ .../impl/SysExpressionServiceImpl.java | 97 ++ .../service/impl/SysFormServiceImpl.java | 97 ++ .../service/impl/SysListenerServiceImpl.java | 97 ++ .../resources/mapper/FlowDeployMapper.xml | 26 + .../resources/mapper/SysDeployFormMapper.xml | 66 + .../resources/mapper/SysExpressionMapper.xml | 90 ++ .../main/resources/mapper/SysFormMapper.xml | 82 ++ .../resources/mapper/SysListenerMapper.xml | 115 ++ pom.xml | 1 + web/pom.xml | 5 + web/src/main/resources/application.yml | 9 +- 63 files changed, 7022 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/FlowProcDefDto.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/FlowDeployMapper.java create mode 100644 flowable/.mvn/wrapper/maven-wrapper.properties create mode 100644 flowable/pom.xml create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/common/constant/ProcessConstants.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/common/enums/FlowComment.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/BaseEl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/FlowEl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/config/FlowableConfig.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/config/MyDefaultProcessDiagramCanvas.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/FlowDefinitionController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/FlowInstanceController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/FlowTaskController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/SysExpressionController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/SysFormController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/controller/SysListenerController.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowCommentDto.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowFromFieldDTO.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowNextDto.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowSaveXmlVo.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowTaskDto.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowViewerDto.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysDeployForm.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysExpression.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysForm.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysListener.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowQueryVo.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowTaskVo.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/domain/vo/ReturnTaskNodeVo.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/factory/FlowServiceFactory.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramCanvas.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramGenerator.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/flow/FindNextNodeUtil.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/flow/FlowableUtils.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/listener/FlowExecutionListener.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/listener/FlowTaskListener.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/mapper/SysDeployFormMapper.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/mapper/SysExpressionMapper.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/mapper/SysFormMapper.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/mapper/SysListenerMapper.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/IFlowDefinitionService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/IFlowInstanceService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/IFlowTaskService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/ISysDeployFormService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/ISysExpressionService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/ISysFormService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/ISysListenerService.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowDefinitionServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowInstanceServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowTaskServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysDeployFormServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysExpressionServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysFormServiceImpl.java create mode 100644 flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysListenerServiceImpl.java create mode 100644 flowable/src/main/resources/mapper/FlowDeployMapper.xml create mode 100644 flowable/src/main/resources/mapper/SysDeployFormMapper.xml create mode 100644 flowable/src/main/resources/mapper/SysExpressionMapper.xml create mode 100644 flowable/src/main/resources/mapper/SysFormMapper.xml create mode 100644 flowable/src/main/resources/mapper/SysListenerMapper.xml diff --git a/core/src/main/java/com/dite/znpt/domain/dto/FlowProcDefDto.java b/core/src/main/java/com/dite/znpt/domain/dto/FlowProcDefDto.java new file mode 100644 index 0000000..b4922ea --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/FlowProcDefDto.java @@ -0,0 +1,57 @@ +package com.dite.znpt.domain.dto; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + *

      流程定义

      + * + * @author Tony + * @date 2021-04-03 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("流程定义") +public class FlowProcDefDto implements Serializable { + + @ApiModelProperty("流程id") + private String id; + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("流程key") + private String flowKey; + + @ApiModelProperty("流程分类") + private String category; + + @ApiModelProperty("配置表单名称") + private String formName; + + @ApiModelProperty("配置表单id") + private Long formId; + + @ApiModelProperty("版本") + private int version; + + @ApiModelProperty("部署ID") + private String deploymentId; + + @ApiModelProperty("流程定义状态: 1:激活 , 2:中止") + private int suspensionState; + + @ApiModelProperty("部署时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deploymentTime; + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RoleMenuEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RoleMenuEntity.java index 057f9bc..914fcdd 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RoleMenuEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RoleMenuEntity.java @@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serial; import java.io.Serializable; /** @@ -24,6 +25,9 @@ import java.io.Serializable; @ApiModel(value="RoleMenuEntity对象", description="角色和菜单关联表") public class RoleMenuEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = -795955361477553526L; + @ApiModelProperty("角色id") @TableField("role_id") private String roleId; diff --git a/core/src/main/java/com/dite/znpt/mapper/FlowDeployMapper.java b/core/src/main/java/com/dite/znpt/mapper/FlowDeployMapper.java new file mode 100644 index 0000000..02976ca --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/FlowDeployMapper.java @@ -0,0 +1,23 @@ +package com.dite.znpt.mapper; + + +import com.dite.znpt.domain.dto.FlowProcDefDto; + +import java.util.List; + +/** + * 流程定义查询 + * + * @author Tony + * @email + * @date 2022/1/29 5:44 下午 + **/ +public interface FlowDeployMapper { + + /** + * 流程定义列表 + * @param name + * @return + */ + List selectDeployList(String name); +} diff --git a/flowable/.mvn/wrapper/maven-wrapper.properties b/flowable/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..2f94e61 --- /dev/null +++ b/flowable/.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.10/apache-maven-3.9.10-bin.zip diff --git a/flowable/pom.xml b/flowable/pom.xml new file mode 100644 index 0000000..edd8467 --- /dev/null +++ b/flowable/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + flowable + 1.0.0-SNAPSHOT + + + + com.dite.znpt + core + 1.0.0-SNAPSHOT + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.53 + + + org.flowable + flowable-spring-boot-starter + 6.8.0 + + + + org.flowable + flowable-spring-security + + + + + + + com.googlecode.aviator + aviator + 5.3.3 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 17 + 17 + + + + + + diff --git a/flowable/src/main/java/com/dite/znpt/flowable/common/constant/ProcessConstants.java b/flowable/src/main/java/com/dite/znpt/flowable/common/constant/ProcessConstants.java new file mode 100644 index 0000000..987da6a --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/common/constant/ProcessConstants.java @@ -0,0 +1,80 @@ +package com.dite.znpt.flowable.common.constant; + +/** + * 流程常量信息 + * + * @author Tony + * @date 2021/4/17 22:46 + */ +public class ProcessConstants { + + /** + * 动态数据 + */ + public static final String DYNAMIC = "dynamic"; + + /** + * 固定任务接收 + */ + public static final String FIXED = "fixed"; + + /** + * 单个审批人 + */ + public static final String ASSIGNEE = "assignee"; + + + /** + * 候选人 + */ + public static final String CANDIDATE_USERS = "candidateUsers"; + + + /** + * 审批组 + */ + public static final String CANDIDATE_GROUPS = "candidateGroups"; + + /** + * 单个审批人 + */ + public static final String PROCESS_APPROVAL = "approval"; + + /** + * 会签人员 + */ + public static final String PROCESS_MULTI_INSTANCE_USER = "userList"; + + /** + * nameapace + */ + public static final String NAMASPASE = "http://flowable.org/bpmn"; + + /** + * 会签节点 + */ + public static final String PROCESS_MULTI_INSTANCE = "multiInstance"; + + /** + * 自定义属性 dataType + */ + public static final String PROCESS_CUSTOM_DATA_TYPE = "dataType"; + + /** + * 自定义属性 userType + */ + public static final String PROCESS_CUSTOM_USER_TYPE = "userType"; + + /** + * 初始化人员 + */ + public static final String PROCESS_INITIATOR = "INITIATOR"; + + + /** + * 流程跳过 + */ + public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/common/enums/FlowComment.java b/flowable/src/main/java/com/dite/znpt/flowable/common/enums/FlowComment.java new file mode 100644 index 0000000..225b865 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/common/enums/FlowComment.java @@ -0,0 +1,43 @@ +package com.dite.znpt.flowable.common.enums; + +/** + * 流程意见类型 + * + * @author Tony + * @date 2021/4/19 + */ +public enum FlowComment { + + /** + * 说明 + */ + NORMAL("1", "正常意见"), + REBACK("2", "退回意见"), + REJECT("3", "驳回意见"), + DELEGATE("4", "委派意见"), + ASSIGN("5", "转办意见"), + STOP("6", "终止流程"); + + /** + * 类型 + */ + private final String type; + + /** + * 说明 + */ + private final String remark; + + FlowComment(String type, String remark) { + this.type = type; + this.remark = remark; + } + + public String getType() { + return type; + } + + public String getRemark() { + return remark; + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/BaseEl.java b/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/BaseEl.java new file mode 100644 index 0000000..df934f2 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/BaseEl.java @@ -0,0 +1,12 @@ +package com.dite.znpt.flowable.common.expand.el; + +/** + * 扩展表达式 + * + * @author Tony + * @date 2023-03-04 09:10 + */ +public interface BaseEl { + +} + diff --git a/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/FlowEl.java b/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/FlowEl.java new file mode 100644 index 0000000..a4f8e46 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/common/expand/el/FlowEl.java @@ -0,0 +1,26 @@ +package com.dite.znpt.flowable.common.expand.el; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 扩展表达式 + * + * @author Tony + * @date 2023-03-04 12:10 + */ +@Component +@Slf4j +public class FlowEl implements BaseEl { + + public String findDeptLeader(String name){ + log.info("开始查询表达式变量值,getName"); + return name; + } + + public String getName(String name){ + log.info("开始查询表达式变量值,getName"); + return name; + } +} + diff --git a/flowable/src/main/java/com/dite/znpt/flowable/config/FlowableConfig.java b/flowable/src/main/java/com/dite/znpt/flowable/config/FlowableConfig.java new file mode 100644 index 0000000..a8988fc --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/config/FlowableConfig.java @@ -0,0 +1,23 @@ +package com.dite.znpt.flowable.config; + +import org.flowable.engine.impl.db.DbIdGenerator; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Configuration; + +/** + * 扩展流程配置 + * @author Tony + * @date 2022-12-26 10:24 + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + @Override + public void configure(SpringProcessEngineConfiguration engineConfiguration) { + engineConfiguration.setActivityFontName("宋体"); + engineConfiguration.setLabelFontName("宋体"); + engineConfiguration.setAnnotationFontName("宋体"); + engineConfiguration.setIdGenerator(new DbIdGenerator()); + } + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/config/MyDefaultProcessDiagramCanvas.java b/flowable/src/main/java/com/dite/znpt/flowable/config/MyDefaultProcessDiagramCanvas.java new file mode 100644 index 0000000..19496f4 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/config/MyDefaultProcessDiagramCanvas.java @@ -0,0 +1,95 @@ +package com.dite.znpt.flowable.config;//package com.ruoyi.flowable.config; +// +//import com.sun.prism.paint.Color; +//import org.flowable.bpmn.model.AssociationDirection; +//import org.flowable.image.impl.DefaultProcessDiagramCanvas; +// +//import java.awt.*; +//import java.awt.geom.Line2D; +//import java.awt.geom.RoundRectangle2D; +// +///** +// * @author Tony +// * @date 2021-04-03 +// */ +//public class MyDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { +// //设置高亮线的颜色 这里我设置成绿色 +// protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; +// +// public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { +// super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); +// } +// +// public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { +// super(width, height, minX, minY, imageType); +// } +// +// +// /** +// * 画线颜色设置 +// */ +// @Override +// public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, +// AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { +// +// Paint originalPaint = g.getPaint(); +// Stroke originalStroke = g.getStroke(); +// +// g.setPaint(CONNECTION_COLOR); +// if (connectionType.equals("association")) { +// g.setStroke(ASSOCIATION_STROKE); +// } else if (highLighted) { +// //设置线的颜色 +// g.setPaint(originalPaint); +// g.setStroke(HIGHLIGHT_FLOW_STROKE); +// } +// +// for (int i = 1; i < xPoints.length; i++) { +// Integer sourceX = xPoints[i - 1]; +// Integer sourceY = yPoints[i - 1]; +// Integer targetX = xPoints[i]; +// Integer targetY = yPoints[i]; +// Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); +// g.draw(line); +// } +// +// if (isDefault) { +// Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); +// drawDefaultSequenceFlowIndicator(line, scaleFactor); +// } +// +// if (conditional) { +// Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); +// drawConditionalSequenceFlowIndicator(line, scaleFactor); +// } +// +// if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { +// Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); +// drawArrowHead(line, scaleFactor); +// } +// if (associationDirection == AssociationDirection.BOTH) { +// Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); +// drawArrowHead(line, scaleFactor); +// } +// g.setPaint(originalPaint); +// g.setStroke(originalStroke); +// } +// +// /** +// * 高亮节点设置 +// */ +// @Override +// public void drawHighLight(int x, int y, int width, int height) { +// Paint originalPaint = g.getPaint(); +// Stroke originalStroke = g.getStroke(); +// //设置高亮节点的颜色 +// g.setPaint(HIGHLIGHT_COLOR); +// g.setStroke(THICK_TASK_BORDER_STROKE); +// +// RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); +// g.draw(rect); +// +// g.setPaint(originalPaint); +// g.setStroke(originalStroke); +// } +//} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowDefinitionController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowDefinitionController.java new file mode 100644 index 0000000..9235ad6 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowDefinitionController.java @@ -0,0 +1,200 @@ +package com.dite.znpt.flowable.controller; + + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.dto.FlowProcDefDto; +import com.dite.znpt.flowable.domain.entity.SysExpression; +import com.dite.znpt.domain.vo.RoleResp; +import com.dite.znpt.domain.vo.UserListReq; +import com.dite.znpt.domain.vo.UserListResp; +import com.dite.znpt.flowable.domain.dto.FlowSaveXmlVo; +import com.dite.znpt.flowable.service.IFlowDefinitionService; +import com.dite.znpt.flowable.service.ISysExpressionService; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.service.UserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +/** + *

      + * 工作流程定义 + *

      + * + * @author Tony + * @date 2021-04-03 + */ +@Slf4j +@Api(tags = "流程定义") +@RestController +@RequestMapping("/flowable/definition") +public class FlowDefinitionController { + + @Resource + private IFlowDefinitionService flowDefinitionService; + @Resource + private UserService userService; + @Resource + private RoleService roleService; + + @Resource + private ISysExpressionService sysExpressionService; + + @GetMapping(value = "/list") + @ApiOperation(value = "流程定义列表", response = FlowProcDefDto.class) + public Result list(@ApiParam(value = "当前页码", required = true) @RequestParam Integer pageNum, + @ApiParam(value = "每页条数", required = true) @RequestParam Integer pageSize, + @ApiParam(value = "流程名称", required = false) @RequestParam(required = false) String name) { + return Result.ok(flowDefinitionService.list(name, pageNum, pageSize)); + } + + + @ApiOperation(value = "导入流程文件", notes = "上传bpmn20的xml文件") + @PostMapping("/import") + public Result importFile(@RequestParam(required = false) String name, + @RequestParam(required = false) String category, + MultipartFile file) { + InputStream in = null; + try { + in = file.getInputStream(); + flowDefinitionService.importFile(name, category, in); + } catch (Exception e) { + log.error("导入失败:", e); + return Result.ok(e.getMessage()); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + log.error("关闭输入流出错", e); + } + } + + return Result.ok("导入成功"); + } + + + @ApiOperation(value = "读取xml文件") + @GetMapping("/readXml/{deployId}") + public Result readXml(@ApiParam(value = "流程定义id") @PathVariable(value = "deployId") String deployId) { + try { + return flowDefinitionService.readXml(deployId); + } catch (Exception e) { + return Result.error("加载xml文件异常"); + } + + } + + @ApiOperation(value = "读取图片文件") + @GetMapping("/readImage/{deployId}") + public void readImage(@ApiParam(value = "流程定义id") @PathVariable(value = "deployId") String deployId, HttpServletResponse response) { + OutputStream os = null; + BufferedImage image = null; + try { + image = ImageIO.read(flowDefinitionService.readImage(deployId)); + response.setContentType("image/png"); + os = response.getOutputStream(); + if (image != null) { + ImageIO.write(image, "png", os); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + + @ApiOperation(value = "保存流程设计器内的xml文件") + @PostMapping("/save") + public Result save(@RequestBody FlowSaveXmlVo vo) { + InputStream in = null; + try { + in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8)); + flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in); + } catch (Exception e) { + log.error("导入失败:", e); + return Result.error(e.getMessage()); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + log.error("关闭输入流出错", e); + } + } + + return Result.ok("导入成功"); + } + + @ApiOperation(value = "发起流程") + @PostMapping("/start/{procDefId}") + public Result start(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId, + @ApiParam(value = "变量集合,json对象") @RequestBody Map variables) { + return flowDefinitionService.startProcessInstanceById(procDefId, variables); + } + + @ApiOperation(value = "激活或挂起流程定义") + @PutMapping(value = "/updateState") + public Result updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state, + @ApiParam(value = "流程部署ID", required = true) @RequestParam String deployId) { + flowDefinitionService.updateState(state, deployId); + return Result.ok(); + } + + @ApiOperation(value = "删除流程") + @DeleteMapping(value = "/{deployIds}") + public Result delete(@PathVariable String[] deployIds) { + for (String deployId : deployIds) { + flowDefinitionService.delete(deployId); + } + return Result.ok(); + } + + @ApiOperation(value = "指定流程办理人员列表") + @GetMapping("/userList") + public Result userList(UserListReq req) { + List list = userService.list(req); + return Result.ok(list); + } + + @ApiOperation(value = "指定流程办理组列表") + @GetMapping("/roleList") + public Result roleList(String roleName) { + List list = roleService.list(roleName); + return Result.ok(list); + } + + @ApiOperation(value = "指定流程达式列表") + @GetMapping("/expList") + public Result expList(SysExpression sysExpression) { + List list = sysExpressionService.selectSysExpressionList(sysExpression); + return Result.ok(list); + } + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowInstanceController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowInstanceController.java new file mode 100644 index 0000000..19411b6 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowInstanceController.java @@ -0,0 +1,62 @@ +package com.dite.znpt.flowable.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import com.dite.znpt.flowable.service.IFlowInstanceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + *

      工作流流程实例管理

      + * + * @author Tony + * @date 2021-04-03 + */ +@Slf4j +@Api(tags = "工作流流程实例管理") +@RestController +@RequestMapping("/flowable/instance") +public class FlowInstanceController { + + @Autowired + private IFlowInstanceService flowInstanceService; + + @ApiOperation(value = "根据流程定义id启动流程实例") + @PostMapping("/startBy/{procDefId}") + public Result startById(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId, + @ApiParam(value = "变量集合,json对象") @RequestBody Map variables) { + return flowInstanceService.startProcessInstanceById(procDefId, variables); + + } + + @ApiOperation(value = "激活或挂起流程实例") + @PostMapping(value = "/updateState") + public Result updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state, + @ApiParam(value = "流程实例ID", required = true) @RequestParam String instanceId) { + flowInstanceService.updateState(state,instanceId); + return Result.ok(); + } + + @ApiOperation("结束流程实例") + @PostMapping(value = "/stopProcessInstance") + public Result stopProcessInstance(@RequestBody FlowTaskVo flowTaskVo) { + flowInstanceService.stopProcessInstance(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "删除流程实例") + @DeleteMapping(value = "/delete/{instanceIds}") + public Result delete(@ApiParam(value = "流程实例ID", required = true) @PathVariable String[] instanceIds, + @ApiParam(value = "删除原因") @RequestParam(required = false) String deleteReason) { + for (String instanceId : instanceIds) { + flowInstanceService.delete(instanceId,deleteReason); + } + return Result.ok(); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowTaskController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowTaskController.java new file mode 100644 index 0000000..f313b43 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/FlowTaskController.java @@ -0,0 +1,267 @@ +package com.dite.znpt.flowable.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.dto.FlowTaskDto; +import com.dite.znpt.flowable.domain.vo.FlowQueryVo; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import com.dite.znpt.flowable.service.IFlowTaskService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + *

      工作流任务管理

      + * + * @author Tony + * @date 2021-04-03 + */ +@Slf4j +@Api(tags = "工作流流程任务管理") +@RestController +@RequestMapping("/flowable/task") +public class FlowTaskController { + + @Autowired + private IFlowTaskService flowTaskService; + + @ApiOperation(value = "我发起的流程", response = FlowTaskDto.class) + @GetMapping(value = "/myProcess") + public Result myProcess(FlowQueryVo queryVo) { + return flowTaskService.myProcess(queryVo); + } + + @ApiOperation(value = "取消申请", response = FlowTaskDto.class) + @PostMapping(value = "/stopProcess") + public Result stopProcess(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.stopProcess(flowTaskVo); + } + + @ApiOperation(value = "撤回流程", response = FlowTaskDto.class) + @PostMapping(value = "/revokeProcess") + public Result revokeProcess(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.revokeProcess(flowTaskVo); + } + + @ApiOperation(value = "获取待办列表", response = FlowTaskDto.class) + @GetMapping(value = "/todoList") + public Result todoList(FlowQueryVo queryVo) { + return flowTaskService.todoList(queryVo); + } + + @ApiOperation(value = "获取已办任务", response = FlowTaskDto.class) + @GetMapping(value = "/finishedList") + public Result finishedList(FlowQueryVo queryVo) { + return flowTaskService.finishedList(queryVo); + } + + + @ApiOperation(value = "流程历史流转记录", response = FlowTaskDto.class) + @GetMapping(value = "/flowRecord") + public Result flowRecord(String procInsId, String deployId) { + return flowTaskService.flowRecord(procInsId, deployId); + } + + @ApiOperation(value = "根据任务ID查询挂载的表单信息") + @GetMapping(value = "/getTaskForm") + public Result getTaskForm(String taskId) { + return flowTaskService.getTaskForm(taskId); + } + + + @ApiOperation(value = "流程初始化表单", response = FlowTaskDto.class) + @GetMapping(value = "/flowFormData") + public Result flowFormData(String deployId) { + return flowTaskService.flowFormData(deployId); + } + + @ApiOperation(value = "获取流程变量", response = FlowTaskDto.class) + @GetMapping(value = "/processVariables/{taskId}") + public Result processVariables(@ApiParam(value = "流程任务Id") @PathVariable(value = "taskId") String taskId) { + return flowTaskService.processVariables(taskId); + } + + @ApiOperation(value = "审批任务") + @PostMapping(value = "/complete") + public Result complete(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.complete(flowTaskVo); + } + + @PostMapping(value = "/reject") + public Result taskReject(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.taskReject(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "退回任务") + @PostMapping(value = "/return") + public Result taskReturn(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.taskReturn(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "获取所有可回退的节点") + @PostMapping(value = "/returnList") + public Result findReturnTaskList(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.findReturnTaskList(flowTaskVo); + } + + @ApiOperation(value = "删除任务") + @DeleteMapping(value = "/delete") + public Result delete(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.deleteTask(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "认领/签收任务") + @PostMapping(value = "/claim") + public Result claim(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.claim(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "取消认领/签收任务") + @PostMapping(value = "/unClaim") + public Result unClaim(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.unClaim(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "委派任务") + @PostMapping(value = "/delegateTask") + public Result delegate(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.delegateTask(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "任务归还") + @PostMapping(value = "/resolveTask") + public Result resolveTask(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.resolveTask(flowTaskVo); + return Result.ok(); + } + + @ApiOperation(value = "转办任务") + @PostMapping(value = "/assignTask") + public Result assign(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.assignTask(flowTaskVo); + return Result.ok(); + } + + @PostMapping(value = "/addMultiInstanceExecution") + @ApiOperation(value = "多实例加签") + public Result addMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.addMultiInstanceExecution(flowTaskVo); + return Result.ok("加签成功"); + } + + @PostMapping(value = "/deleteMultiInstanceExecution") + @ApiOperation(value = "多实例减签") + public Result deleteMultiInstanceExecution(@RequestBody FlowTaskVo flowTaskVo) { + flowTaskService.deleteMultiInstanceExecution(flowTaskVo); + return Result.ok("减签成功"); + } + + @ApiOperation(value = "获取下一节点") + @PostMapping(value = "/nextFlowNode") + public Result getNextFlowNode(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.getNextFlowNode(flowTaskVo); + } + + @ApiOperation(value = "流程发起时获取下一节点") + @PostMapping(value = "/nextFlowNodeByStart") + public Result getNextFlowNodeByStart(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.getNextFlowNodeByStart(flowTaskVo); + } + + /** + * 生成流程图 + * + * @param processId 任务ID + */ + @GetMapping("/diagram/{processId}") + public void genProcessDiagram(HttpServletResponse response, + @PathVariable("processId") String processId) { + InputStream inputStream = flowTaskService.diagram(processId); + OutputStream os = null; + BufferedImage image = null; + try { + image = ImageIO.read(inputStream); + response.setContentType("image/png"); + os = response.getOutputStream(); + if (image != null) { + ImageIO.write(image, "png", os); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 获取流程执行节点 + * + * @param procInsId 流程实例编号 + * @param procInsId 任务执行编号 + */ + @GetMapping("/flowViewer/{procInsId}/{executionId}") + public Result getFlowViewer(@PathVariable("procInsId") String procInsId, + @PathVariable("executionId") String executionId) { + return flowTaskService.getFlowViewer(procInsId, executionId); + } + + /** + * 流程节点信息 + * + * @param procInsId 流程实例id + * @return + */ + @GetMapping("/flowXmlAndNode") + public Result flowXmlAndNode(@RequestParam(value = "procInsId", required = false) String procInsId, + @RequestParam(value = "deployId", required = false) String deployId) { + return flowTaskService.flowXmlAndNode(procInsId, deployId); + } + + /** + * 流程节点表单 + * + * @param taskId 流程任务编号 + * @return + */ + @GetMapping("/flowTaskForm") + public Result flowTaskForm(@RequestParam(value = "taskId", required = false) String taskId) throws Exception { + return flowTaskService.flowTaskForm(taskId); + } + + + /** + * 流程节点信息 + * + * @param procInsId 流程实例编号 + * @param elementId 流程节点编号 + * @return + */ + @GetMapping("/flowTaskInfo") + public Result flowTaskInfo(@RequestParam(value = "procInsId") String procInsId, + @RequestParam(value = "elementId") String elementId){ + return flowTaskService.flowTaskInfo(procInsId,elementId); + } + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/SysExpressionController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysExpressionController.java new file mode 100644 index 0000000..05b9b38 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysExpressionController.java @@ -0,0 +1,91 @@ +package com.dite.znpt.flowable.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.entity.SysExpression; +import com.dite.znpt.flowable.service.ISysExpressionService; +import com.dite.znpt.util.PageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 流程达式Controller + * + * @author ruoyi + * @date 2022-12-12 + */ +@RestController +@RequestMapping("/system/expression") +public class SysExpressionController +{ + @Autowired + private ISysExpressionService sysExpressionService; + + /** + * 查询流程达式列表 + */ + @GetMapping("/list") + public PageResult list(SysExpression sysExpression) + { + PageUtil.startPage(); + List list = sysExpressionService.selectSysExpressionList(sysExpression); + return PageResult.ok(list); + } + + /** + * 导出流程达式列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, SysExpression sysExpression){ + //TODO +// List list = sysExpressionService.selectSysExpressionList(sysExpression); +// ExcelUtil util = new ExcelUtil(SysExpression.class); +// util.exportExcel(response, list, "流程达式数据"); + } + + /** + * 获取流程达式详细信息 + */ + @GetMapping(value = "/{id}") + public Result getInfo(@PathVariable("id") Long id) + { + return Result.ok(sysExpressionService.selectSysExpressionById(id)); + } + + /** + * 新增流程达式 + */ + @PostMapping + public Result add(@RequestBody SysExpression sysExpression) + { + return Result.ok(sysExpressionService.insertSysExpression(sysExpression)); + } + + /** + * 修改流程达式 + */ + @PutMapping + public Result edit(@RequestBody SysExpression sysExpression) + { + return Result.ok(sysExpressionService.updateSysExpression(sysExpression)); + } + + /** + * 删除流程达式 + */ + @DeleteMapping("/{ids}") + public Result remove(@PathVariable Long[] ids) + { + return Result.ok(sysExpressionService.deleteSysExpressionByIds(ids)); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/SysFormController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysFormController.java new file mode 100644 index 0000000..9a52ee4 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysFormController.java @@ -0,0 +1,104 @@ +package com.dite.znpt.flowable.controller; + +import java.util.List; + + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.entity.SysDeployForm; +import com.dite.znpt.flowable.domain.entity.SysForm; +import com.dite.znpt.flowable.service.ISysDeployFormService; +import com.dite.znpt.flowable.service.ISysFormService; +import com.dite.znpt.util.PageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 流程表单Controller + * + * @author Tony + * @date 2021-04-03 + */ +@RestController +@RequestMapping("/flowable/form") +public class SysFormController { + @Autowired + private ISysFormService SysFormService; + + @Autowired + private ISysDeployFormService sysDeployFormService; + + /** + * 查询流程表单列表 + */ + @GetMapping("/list") + public PageResult list(SysForm sysForm) { + PageUtil.startPage(); + List list = SysFormService.selectSysFormList(sysForm); + return PageResult.ok(list); + } + + @GetMapping("/formList") + public Result formList(SysForm sysForm) { + List list = SysFormService.selectSysFormList(sysForm); + return Result.ok(list); + } + /** + * 导出流程表单列表 + */ + @GetMapping("/export") + public void export(SysForm sysForm) { + // TODO +// List list = SysFormService.selectSysFormList(sysForm); +// ExcelUtil util = new ExcelUtil(SysForm.class); +// util.exportExcel(list, "form"); + } + + /** + * 获取流程表单详细信息 + */ + @GetMapping(value = "/{formId}") + public Result getInfo(@PathVariable("formId") Long formId) { + return Result.ok(SysFormService.selectSysFormById(formId)); + } + + /** + * 新增流程表单 + */ + @PostMapping + public Result add(@RequestBody SysForm sysForm) { + return Result.ok(SysFormService.insertSysForm(sysForm)); + } + + /** + * 修改流程表单 + */ + @PutMapping + public Result edit(@RequestBody SysForm sysForm) { + return Result.ok(SysFormService.updateSysForm(sysForm)); + } + + /** + * 删除流程表单 + */ + @DeleteMapping("/{formIds}") + public Result remove(@PathVariable Long[] formIds) { + return Result.ok(SysFormService.deleteSysFormByIds(formIds)); + } + + + /** + * 挂载流程表单 + */ + @PostMapping("/addDeployForm") + public Result addDeployForm(@RequestBody SysDeployForm sysDeployForm) { + return Result.ok(sysDeployFormService.insertSysDeployForm(sysDeployForm)); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/controller/SysListenerController.java b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysListenerController.java new file mode 100644 index 0000000..35464be --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/controller/SysListenerController.java @@ -0,0 +1,92 @@ +package com.dite.znpt.flowable.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.entity.SysListener; +import com.dite.znpt.flowable.service.ISysListenerService; +import com.dite.znpt.util.PageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 流程监听Controller + * + * @author Tony + * @date 2022-12-25 + */ +@RestController +@RequestMapping("/system/listener") +public class SysListenerController +{ + @Autowired + private ISysListenerService sysListenerService; + + /** + * 查询流程监听列表 + */ + @GetMapping("/list") + public PageResult list(SysListener sysListener) + { + PageUtil.startPage(); + List list = sysListenerService.selectSysListenerList(sysListener); + return PageResult.ok(list); + } + + /** + * 导出流程监听列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, SysListener sysListener) + { + //TODO +// List list = sysListenerService.selectSysListenerList(sysListener); +// ExcelUtil util = new ExcelUtil(SysListener.class); +// util.exportExcel(response, list, "流程监听数据"); + } + + /** + * 获取流程监听详细信息 + */ + @GetMapping(value = "/{id}") + public Result getInfo(@PathVariable("id") Long id) + { + return Result.ok(sysListenerService.selectSysListenerById(id)); + } + + /** + * 新增流程监听 + */ + @PostMapping + public Result add(@RequestBody SysListener sysListener) + { + return Result.ok(sysListenerService.insertSysListener(sysListener)); + } + + /** + * 修改流程监听 + */ + @PutMapping + public Result edit(@RequestBody SysListener sysListener) + { + return Result.ok(sysListenerService.updateSysListener(sysListener)); + } + + /** + * 删除流程监听 + */ + @DeleteMapping("/{ids}") + public Result remove(@PathVariable Long[] ids) + { + return Result.ok(sysListenerService.deleteSysListenerByIds(ids)); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowCommentDto.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowCommentDto.java new file mode 100644 index 0000000..e138e49 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowCommentDto.java @@ -0,0 +1,25 @@ +package com.dite.znpt.flowable.domain.dto; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Tony + * @date 2021/3/28 15:50 + */ +@Data +@Builder +public class FlowCommentDto implements Serializable { + + /** + * 意见类别 0 正常意见 1 退回意见 2 驳回意见 + */ + private String type; + + /** + * 意见内容 + */ + private String comment; +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowFromFieldDTO.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowFromFieldDTO.java new file mode 100644 index 0000000..cc0ba8c --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowFromFieldDTO.java @@ -0,0 +1,15 @@ +package com.dite.znpt.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Tony + * @date 2021/3/31 23:20 + */ +@Data +public class FlowFromFieldDTO implements Serializable { + + private Object fields; +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowNextDto.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowNextDto.java new file mode 100644 index 0000000..6f184cc --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowNextDto.java @@ -0,0 +1,30 @@ +package com.dite.znpt.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 动态人员、组 + * @author Tony + * @date 2021/4/17 22:59 + */ +@Data +public class FlowNextDto implements Serializable { + + /** + * 审批人类型 + */ + private String type; + + /** + * 是否需要动态指定任务审批人 + */ + private String dataType; + + /** + * 流程变量 + */ + private String vars; + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowSaveXmlVo.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowSaveXmlVo.java new file mode 100644 index 0000000..a5dfff2 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowSaveXmlVo.java @@ -0,0 +1,28 @@ +package com.dite.znpt.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Tony + * @date 2021/3/28 19:48 + */ +@Data +public class FlowSaveXmlVo implements Serializable { + + /** + * 流程名称 + */ + private String name; + + /** + * 流程分类 + */ + private String category; + + /** + * xml 文件 + */ + private String xml; +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowTaskDto.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowTaskDto.java new file mode 100644 index 0000000..da21000 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowTaskDto.java @@ -0,0 +1,102 @@ +package com.dite.znpt.flowable.domain.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + *

      工作流任务

      + * + * @author Tony + * @date 2021-04-03 + */ +@Getter +@Setter +@ApiModel("工作流任务相关-返回参数") +public class FlowTaskDto implements Serializable { + + @ApiModelProperty("任务编号") + private String taskId; + + @ApiModelProperty("任务执行编号") + private String executionId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务Key") + private String taskDefKey; + + @ApiModelProperty("任务执行人Id") + private String assigneeId; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("流程发起人部门名称") + private String startDeptName; + + @ApiModelProperty("任务执行人名称") + private String assigneeName; + @ApiModelProperty("任务执行人部门") + private String assigneeDeptName;; + + @ApiModelProperty("流程发起人Id") + private String startUserId; + + @ApiModelProperty("流程发起人名称") + private String startUserName; + + @ApiModelProperty("流程类型") + private String category; + + @ApiModelProperty("流程变量信息") + private Object variables; + + @ApiModelProperty("局部变量信息") + private Object taskLocalVars; + + @ApiModelProperty("流程部署编号") + private String deployId; + + @ApiModelProperty("流程ID") + private String procDefId; + + @ApiModelProperty("流程key") + private String procDefKey; + + @ApiModelProperty("流程定义名称") + private String procDefName; + + @ApiModelProperty("流程定义内置使用版本") + private int procDefVersion; + + @ApiModelProperty("流程实例ID") + private String procInsId; + + @ApiModelProperty("历史流程实例ID") + private String hisProcInsId; + + @ApiModelProperty("任务耗时") + private String duration; + + @ApiModelProperty("任务意见") + private FlowCommentDto comment; + + @ApiModelProperty("候选执行人") + private String candidate; + + @ApiModelProperty("任务创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("任务完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date finishTime; + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowViewerDto.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowViewerDto.java new file mode 100644 index 0000000..9568799 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/dto/FlowViewerDto.java @@ -0,0 +1,23 @@ +package com.dite.znpt.flowable.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Tony + * @date 2021/4/21 20:55 + */ +@Data +public class FlowViewerDto implements Serializable { + + /** + * 流程key + */ + private String key; + + /** + * 是否完成(已经审批) + */ + private boolean completed; +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysDeployForm.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysDeployForm.java new file mode 100644 index 0000000..666ad64 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysDeployForm.java @@ -0,0 +1,51 @@ +package com.dite.znpt.flowable.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程实例关联表单对象 sys_instance_form + * + * @author Tony + * @date 2021-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_deploy_form") +@ApiModel(value="SysDeployForm对象", description="流程实例关联表单") +public class SysDeployForm implements Serializable { + + @Serial + private static final long serialVersionUID = 1229567797120051612L; + + @ApiModelProperty("主键") + @TableId(value = "id") + private Long id; + + @ApiModelProperty("表单主键") + @TableField("form_id") + private Long formId; + + @ApiModelProperty("流程定义主键") + @TableField("deploy_id") + private String deployId; + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("formId", getFormId()) + .append("deployId", getDeployId()) + .toString(); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysExpression.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysExpression.java new file mode 100644 index 0000000..6747f42 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysExpression.java @@ -0,0 +1,73 @@ +package com.dite.znpt.flowable.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程达式对象 sys_expression + * + * @author ruoyi + * @date 2022-12-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_expression") +@ApiModel(value="SysExpression对象", description="流程表达式") +public class SysExpression extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -6620158503098718552L; + /** 表单主键 */ + @TableId(value = "id") + private Long id; + + /** 表达式名称 */ + @ApiModelProperty(name = "表达式名称") + @TableField("name") + private String name; + + /** 表达式内容 */ + @ApiModelProperty(name = "表达式内容") + @TableField("expression") + private String expression; + /** 表达式类型 */ + @ApiModelProperty(name = "表达式类型") + @TableField("data_type") + private String dataType; + + /** 状态 */ + @ApiModelProperty(name = "状态") + @TableField("status") + private Integer status; + + @ApiModelProperty(name = "备注") + @TableField("remark") + private String remark; + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("expression", getExpression()) + .append("dataType", getDataType()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("status", getStatus()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysForm.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysForm.java new file mode 100644 index 0000000..404cb1e --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysForm.java @@ -0,0 +1,63 @@ +package com.dite.znpt.flowable.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程表单对象 sys_task_form + * + * @author Tony + * @date 2021-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_form") +@ApiModel(value="SysForm对象", description="流程表单") +public class SysForm extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 4305516082701611447L; + + /** 表单主键 */ + @TableId(value = "form_id") + @ApiModelProperty(name = "表单主键") + private Long formId; + + /** 表单名称 */ + @ApiModelProperty(name = "表单名称") + @TableField("form_name") + private String formName; + + /** 表单内容 */ + @ApiModelProperty(name = "表单内容") + @TableField("form_content") + private String formContent; + + @ApiModelProperty(name = "备注") + @TableField("remark") + private String remark; + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("formId", getFormId()) + .append("formName", getFormName()) + .append("formContent", getFormContent()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysListener.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysListener.java new file mode 100644 index 0000000..7ca2c52 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/entity/SysListener.java @@ -0,0 +1,87 @@ +package com.dite.znpt.flowable.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程监听对象 sys_listener + * + * @author Tony + * @date 2022-12-25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_listener") +@ApiModel(value="SysListener对象", description="流程监听") +public class SysListener extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 3933601576294703106L; + + /** 表单主键 */ + @ApiModelProperty(name = "表单主键") + @TableId(value = "id") + private Long id; + + /** 名称 */ + @ApiModelProperty(name = "名称") + @TableField("name") + private String name; + + /** 监听类型 */ + @TableField("type") + @ApiModelProperty(name = "监听类型") + private String type; + + /** 事件类型 */ + @ApiModelProperty(name = "事件类型") + @TableField("event_type") + private String eventType; + + /** 值类型 */ + @ApiModelProperty(name = "值类型") + @TableField("value_type") + private String valueType; + + /** 执行内容 */ + @ApiModelProperty(name = "执行内容") + @TableField("value") + private String value; + + /** 状态 */ + @ApiModelProperty(name = "状态") + @TableField("status") + private Integer status; + + @ApiModelProperty(name = "备注") + @TableField("remark") + private String remark; + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("type", getType()) + .append("eventType", getEventType()) + .append("valueType", getValueType()) + .append("value", getValue()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("status", getStatus()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowQueryVo.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowQueryVo.java new file mode 100644 index 0000000..a0e8384 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowQueryVo.java @@ -0,0 +1,36 @@ +package com.dite.znpt.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + *

      流程任务

      + * + * @author Tony + * @date 2021-04-03 + */ +@Data +@ApiModel("工作流任务相关--请求参数") +public class FlowQueryVo { + + @ApiModelProperty("流程名称") + private String name; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; + + @ApiModelProperty("当前页码") + private Integer pageNum; + + @ApiModelProperty("每页条数") + private Integer pageSize; + + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowTaskVo.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowTaskVo.java new file mode 100644 index 0000000..4579e8c --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/FlowTaskVo.java @@ -0,0 +1,56 @@ +package com.dite.znpt.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + *

      流程任务

      + * + * @author Tony + * @date 2021-04-03 + */ +@Data +@ApiModel("工作流任务相关--请求参数") +public class FlowTaskVo { + + @ApiModelProperty("任务Id") + private String taskId; + + @ApiModelProperty("用户Id") + private String userId; + + @ApiModelProperty("任务意见") + private String comment; + + @ApiModelProperty("流程实例Id") + private String instanceId; + + @ApiModelProperty("节点") + private String targetKey; + + private String deploymentId; + @ApiModelProperty("流程环节定义ID") + private String defId; + + @ApiModelProperty("子执行流ID") + private String currentChildExecutionId; + + @ApiModelProperty("子执行流是否已执行") + private Boolean flag; + + @ApiModelProperty("流程变量信息") + private Map variables; + + @ApiModelProperty("审批人") + private String assignee; + + @ApiModelProperty("候选人") + private List candidateUsers; + + @ApiModelProperty("审批组") + private List candidateGroups; +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/ReturnTaskNodeVo.java b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/ReturnTaskNodeVo.java new file mode 100644 index 0000000..645648e --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/domain/vo/ReturnTaskNodeVo.java @@ -0,0 +1,26 @@ +package com.dite.znpt.flowable.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + *

      可退回节点

      + * + * @author tony + * @date 2022-04-23 11:01:52 + */ +@Data +@ApiModel("可退回节点") +public class ReturnTaskNodeVo { + + @ApiModelProperty("任务Id") + private String id; + + @ApiModelProperty("用户Id") + private String name; + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/factory/FlowServiceFactory.java b/flowable/src/main/java/com/dite/znpt/flowable/factory/FlowServiceFactory.java new file mode 100644 index 0000000..9ba5683 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/factory/FlowServiceFactory.java @@ -0,0 +1,41 @@ +package com.dite.znpt.flowable.factory; + +import lombok.Getter; +import org.flowable.engine.*; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * flowable 引擎注入封装 + * @author Tony + * @date 2021-04-03 + */ +@Component +@Getter +public class FlowServiceFactory { + + @Resource + protected RepositoryService repositoryService; + + @Resource + protected RuntimeService runtimeService; + + @Resource + protected IdentityService identityService; + + @Resource + protected TaskService taskService; + + @Resource + protected HistoryService historyService; + + @Resource + protected ManagementService managementService; + + @Qualifier("processEngine") + @Resource + protected ProcessEngine processEngine; + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramCanvas.java b/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramCanvas.java new file mode 100644 index 0000000..8321d9f --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramCanvas.java @@ -0,0 +1,370 @@ +package com.dite.znpt.flowable.flow; + +import org.flowable.bpmn.model.AssociationDirection; +import org.flowable.bpmn.model.GraphicInfo; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.util.ReflectUtil; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +/** + * @author Tony + * @date 2021/4/4 23:58 + */ +public class CustomProcessDiagramCanvas extends DefaultProcessDiagramCanvas { + //定义走过流程连线颜色为绿色 + protected static Color HIGHLIGHT_SequenceFlow_COLOR = Color.GREEN; + //设置未走过流程的连接线颜色 + protected static Color CONNECTION_COLOR = Color.BLACK; + //设置flows连接线字体颜色red + protected static Color LABEL_COLOR = new Color(0, 0, 0); + //高亮显示task框颜色 + protected static Color HIGHLIGHT_COLOR = Color.GREEN; + protected static Color HIGHLIGHT_COLOR1 = Color.RED; + + public CustomProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + this.initialize(imageType); + } + + /** + * 重写绘制连线的方式,设置绘制颜色 + * @param xPoints + * @param yPoints + * @param conditional + * @param isDefault + * @param connectionType + * @param associationDirection + * @param highLighted + * @param scaleFactor + */ + @Override + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + Paint originalPaint = this.g.getPaint(); + Stroke originalStroke = this.g.getStroke(); + this.g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + this.g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + this.g.setPaint(HIGHLIGHT_SequenceFlow_COLOR); + this.g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; ++i) { + Integer sourceX = xPoints[i - 1]; + Integer sourceY = yPoints[i - 1]; + Integer targetX = xPoints[i]; + Integer targetY = yPoints[i]; + java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double((double) sourceX, (double) sourceY, (double) targetX, (double) targetY); + this.g.draw(line); + } + + java.awt.geom.Line2D.Double line; + if (isDefault) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[xPoints.length - 2], (double) yPoints[xPoints.length - 2], (double) xPoints[xPoints.length - 1], (double) yPoints[xPoints.length - 1]); + this.drawArrowHead(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[1], (double) yPoints[1], (double) xPoints[0], (double) yPoints[0]); + this.drawArrowHead(line, scaleFactor); + } + + this.g.setPaint(originalPaint); + this.g.setStroke(originalStroke); + } + + /** + * 设置字体大小图标颜色 + * @param imageType + */ + @Override + public void initialize(String imageType) { + if ("png".equalsIgnoreCase(imageType)) { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 2); + } else { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 1); + } + + this.g = this.processDiagram.createGraphics(); + if (!"png".equalsIgnoreCase(imageType)) { + this.g.setBackground(new Color(255, 255, 255, 0)); + this.g.clearRect(0, 0, this.canvasWidth, this.canvasHeight); + } + + this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + //修改图标颜色,修改图标字体大小 + this.g.setPaint(Color.black); + Font font = new Font(this.activityFontName, 10, 14); + this.g.setFont(font); + this.fontMetrics = this.g.getFontMetrics(); + //修改连接线字体大小 + LABEL_FONT = new Font(this.labelFontName, 10, 15); + ANNOTATION_FONT = new Font(this.annotationFontName, 0, 11); + + try { + USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/userTask.png", this.customClassLoader)); + SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/scriptTask.png", this.customClassLoader)); + SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/serviceTask.png", this.customClassLoader)); + RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/receiveTask.png", this.customClassLoader)); + SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/sendTask.png", this.customClassLoader)); + MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/manualTask.png", this.customClassLoader)); + BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/businessRuleTask.png", this.customClassLoader)); + SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/shellTask.png", this.customClassLoader)); + DMN_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/dmnTask.png", this.customClassLoader)); + CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/camelTask.png", this.customClassLoader)); + MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/muleTask.png", this.customClassLoader)); + HTTP_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/httpTask.png", this.customClassLoader)); + TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/timer.png", this.customClassLoader)); + COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate-throw.png", this.customClassLoader)); + COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate.png", this.customClassLoader)); + ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error-throw.png", this.customClassLoader)); + ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error.png", this.customClassLoader)); + MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message-throw.png", this.customClassLoader)); + MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message.png", this.customClassLoader)); + SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal-throw.png", this.customClassLoader)); + SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal.png", this.customClassLoader)); + } catch (IOException var4) { + LOGGER.warn("Could not load image for process diagram creation: {}", var4.getMessage()); + } + + } + + /** + * 设置连接线字体 + * @param text + * @param graphicInfo + * @param centered + */ + @Override + public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) { + float interline = 1.0f; + + // text + if (text != null && text.length() > 0) { + Paint originalPaint = g.getPaint(); + Font originalFont = g.getFont(); + + g.setPaint(LABEL_COLOR); + g.setFont(LABEL_FONT); + + int wrapWidth = 100; + int textY = (int) graphicInfo.getY(); + + // TODO: use drawMultilineText() + AttributedString as = new AttributedString(text); + as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); + as.addAttribute(TextAttribute.FONT, g.getFont()); + AttributedCharacterIterator aci = as.getIterator(); + FontRenderContext frc = new FontRenderContext(null, true, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + + while (lbm.getPosition() < text.length()) { + TextLayout tl = lbm.nextLayout(wrapWidth); + textY += tl.getAscent(); + + Rectangle2D bb = tl.getBounds(); + double tX = graphicInfo.getX(); + + if (centered) { + tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); + } + tl.draw(g, (float) tX, textY); + textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); + } + + // restore originals + g.setFont(originalFont); + g.setPaint(originalPaint); + } + } + + /** + * 高亮显示task框完成的 + * @param x + * @param y + * @param width + * @param height + */ + @Override + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义task框当前的位置 + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightNow(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR1); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义结束节点 + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightEnd(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * task框自定义文字 + * @param name + * @param graphicInfo + * @param thickBorder + * @param scaleFactor + */ + @Override + protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + // Create a new gradient paint for every task box, gradient depends on x and y and is not relative + g.setPaint(TASK_BOX_COLOR); + + int arcR = 6; + if (thickBorder) { + arcR = 3; + } + + // shape + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); + g.fill(rect); + g.setPaint(TASK_BORDER_COLOR); + + if (thickBorder) { + Stroke originalStroke = g.getStroke(); + g.setStroke(THICK_TASK_BORDER_STROKE); + g.draw(rect); + g.setStroke(originalStroke); + } else { + g.draw(rect); + } + + g.setPaint(originalPaint); + // text + if (scaleFactor == 1.0 && name != null && name.length() > 0) { + int boxWidth = width - (2 * TEXT_PADDING); + int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; + int boxX = x + width / 2 - boxWidth / 2; + int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; + + drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); + } + } + + protected static Color EVENT_COLOR = new Color(255, 255, 255); + + /** + * 重写开始事件 + * @param graphicInfo + * @param image + * @param scaleFactor + */ + @Override + public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { + Paint originalPaint = g.getPaint(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); + g.draw(circle); + g.setPaint(originalPaint); + if (image != null) { + // calculate coordinates to center image + int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / (2 * scaleFactor))); + int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / (2 * scaleFactor))); + g.drawImage(image, imageX, imageY, + (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); + } + + } + + /** + * 重写结束事件 + * @param graphicInfo + * @param scaleFactor + */ + @Override + public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); +// g.setPaint(HIGHLIGHT_COLOR); + if (scaleFactor == 1.0) { + g.setStroke(END_EVENT_STROKE); + } else { + g.setStroke(new BasicStroke(2.0f)); + } + g.draw(circle); + g.setStroke(originalStroke); + g.setPaint(originalPaint); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramGenerator.java b/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramGenerator.java new file mode 100644 index 0000000..8844341 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/flow/CustomProcessDiagramGenerator.java @@ -0,0 +1,404 @@ +package com.dite.znpt.flowable.flow; + + +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.impl.DefaultProcessDiagramGenerator; + +import java.util.Iterator; +import java.util.List; + +/** + * @author Tony + * @date 2021/4/5 0:31 + */ +public class CustomProcessDiagramGenerator extends DefaultProcessDiagramGenerator { + @Override + protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + this.prepareBpmnModel(bpmnModel); + DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + Iterator var13 = bpmnModel.getPools().iterator(); + + while (var13.hasNext()) { + Pool process = (Pool) var13.next(); + GraphicInfo subProcesses = bpmnModel.getGraphicInfo(process.getId()); + processDiagramCanvas.drawPoolOrLane(process.getName(), subProcesses, scaleFactor); + } + + var13 = bpmnModel.getProcesses().iterator(); + + Process process1; + Iterator subProcesses1; + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.getLanes().iterator(); + + while (subProcesses1.hasNext()) { + Lane artifact = (Lane) subProcesses1.next(); + GraphicInfo subProcess = bpmnModel.getGraphicInfo(artifact.getId()); + processDiagramCanvas.drawPoolOrLane(artifact.getName(), subProcess, scaleFactor); + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.findFlowElementsOfType(FlowNode.class).iterator(); + + while (subProcesses1.hasNext()) { + FlowNode artifact1 = (FlowNode) subProcesses1.next(); + if (!this.isPartOfCollapsedSubProcess(artifact1, bpmnModel)) { + this.drawActivity(processDiagramCanvas, bpmnModel, artifact1, highLightedActivities, highLightedFlows, scaleFactor, Boolean.valueOf(drawSequenceFlowNameWithNoLabelDI)); + } + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + label75: + while (true) { + List subProcesses2; + do { + if (!var13.hasNext()) { + return processDiagramCanvas; + } + + process1 = (Process) var13.next(); + subProcesses1 = process1.getArtifacts().iterator(); + + while (subProcesses1.hasNext()) { + Artifact artifact2 = (Artifact) subProcesses1.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, artifact2); + } + + subProcesses2 = process1.findFlowElementsOfType(SubProcess.class, true); + } while (subProcesses2 == null); + + Iterator artifact3 = subProcesses2.iterator(); + + while (true) { + GraphicInfo graphicInfo; + SubProcess subProcess1; + do { + do { + if (!artifact3.hasNext()) { + continue label75; + } + + subProcess1 = (SubProcess) artifact3.next(); + graphicInfo = bpmnModel.getGraphicInfo(subProcess1.getId()); + } while (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded().booleanValue()); + } while (this.isPartOfCollapsedSubProcess(subProcess1, bpmnModel)); + + Iterator var19 = subProcess1.getArtifacts().iterator(); + + while (var19.hasNext()) { + Artifact subProcessArtifact = (Artifact) var19.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + + protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + double minX = 1.7976931348623157E308D; + double maxX = 0.0D; + double minY = 1.7976931348623157E308D; + double maxY = 0.0D; + + GraphicInfo nrOfLanes; + for (Iterator flowNodes = bpmnModel.getPools().iterator(); flowNodes.hasNext(); maxY = nrOfLanes.getY() + nrOfLanes.getHeight()) { + Pool artifacts = (Pool) flowNodes.next(); + nrOfLanes = bpmnModel.getGraphicInfo(artifacts.getId()); + minX = nrOfLanes.getX(); + maxX = nrOfLanes.getX() + nrOfLanes.getWidth(); + minY = nrOfLanes.getY(); + } + + List var23 = gatherAllFlowNodes(bpmnModel); + Iterator var24 = var23.iterator(); + + label155: + while (var24.hasNext()) { + FlowNode var26 = (FlowNode) var24.next(); + GraphicInfo artifact = bpmnModel.getGraphicInfo(var26.getId()); + if (artifact.getX() + artifact.getWidth() > maxX) { + maxX = artifact.getX() + artifact.getWidth(); + } + + if (artifact.getX() < minX) { + minX = artifact.getX(); + } + + if (artifact.getY() + artifact.getHeight() > maxY) { + maxY = artifact.getY() + artifact.getHeight(); + } + + if (artifact.getY() < minY) { + minY = artifact.getY(); + } + + Iterator process = var26.getOutgoingFlows().iterator(); + + while (true) { + List l; + do { + if (!process.hasNext()) { + continue label155; + } + + SequenceFlow graphicInfoList = (SequenceFlow) process.next(); + l = bpmnModel.getFlowLocationGraphicInfo(graphicInfoList.getId()); + } while (l == null); + + Iterator graphicInfo = l.iterator(); + + while (graphicInfo.hasNext()) { + GraphicInfo graphicInfo1 = (GraphicInfo) graphicInfo.next(); + if (graphicInfo1.getX() > maxX) { + maxX = graphicInfo1.getX(); + } + + if (graphicInfo1.getX() < minX) { + minX = graphicInfo1.getX(); + } + + if (graphicInfo1.getY() > maxY) { + maxY = graphicInfo1.getY(); + } + + if (graphicInfo1.getY() < minY) { + minY = graphicInfo1.getY(); + } + } + } + } + + List var25 = gatherAllArtifacts(bpmnModel); + Iterator var27 = var25.iterator(); + + GraphicInfo var37; + while (var27.hasNext()) { + Artifact var29 = (Artifact) var27.next(); + GraphicInfo var31 = bpmnModel.getGraphicInfo(var29.getId()); + if (var31 != null) { + if (var31.getX() + var31.getWidth() > maxX) { + maxX = var31.getX() + var31.getWidth(); + } + + if (var31.getX() < minX) { + minX = var31.getX(); + } + + if (var31.getY() + var31.getHeight() > maxY) { + maxY = var31.getY() + var31.getHeight(); + } + + if (var31.getY() < minY) { + minY = var31.getY(); + } + } + + List var33 = bpmnModel.getFlowLocationGraphicInfo(var29.getId()); + if (var33 != null) { + Iterator var35 = var33.iterator(); + + while (var35.hasNext()) { + var37 = (GraphicInfo) var35.next(); + if (var37.getX() > maxX) { + maxX = var37.getX(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() > maxY) { + maxY = var37.getY(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + } + + int var28 = 0; + Iterator var30 = bpmnModel.getProcesses().iterator(); + + while (var30.hasNext()) { + Process var32 = (Process) var30.next(); + Iterator var34 = var32.getLanes().iterator(); + + while (var34.hasNext()) { + Lane var36 = (Lane) var34.next(); + ++var28; + var37 = bpmnModel.getGraphicInfo(var36.getId()); + if (var37.getX() + var37.getWidth() > maxX) { + maxX = var37.getX() + var37.getWidth(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() + var37.getHeight() > maxY) { + maxY = var37.getY() + var37.getHeight(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + + if (var23.isEmpty() && bpmnModel.getPools().isEmpty() && var28 == 0) { + minX = 0.0D; + minY = 0.0D; + } + + return new CustomProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + + private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightNow(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightNow((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightEnd(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightEnd((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + @Override + protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false; + boolean multiInstanceParallel = false; + boolean collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + + if (highLightedActivities.get(highLightedActivities.size() - 1).equals(flowNode.getId()) + && !"endenv".equals(flowNode.getId())) { + if ((flowNode.getId().contains("Event_"))) { + drawHighLightEnd((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } else { + drawHighLightNow((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + } else { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + + } + + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + if (drawSequenceFlowNameWithNoLabelDI) { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + } + } + } +} + diff --git a/flowable/src/main/java/com/dite/znpt/flowable/flow/FindNextNodeUtil.java b/flowable/src/main/java/com/dite/znpt/flowable/flow/FindNextNodeUtil.java new file mode 100644 index 0000000..d31362f --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/flow/FindNextNodeUtil.java @@ -0,0 +1,266 @@ +package com.dite.znpt.flowable.flow; + +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.Expression; +//import com.greenpineyu.fel.FelEngine; +//import com.greenpineyu.fel.FelEngineImpl; +//import com.greenpineyu.fel.context.FelContext; +//import org.apache.commons.jexl2.JexlContext; +//import org.apache.commons.jexl2.JexlEngine; +//import org.apache.commons.jexl2.MapContext; +//import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.ProcessDefinition; + +import java.util.*; + +/** + * @author Tony + * @date 2021/4/19 20:51 + */ +public class FindNextNodeUtil { + + /** + * 获取下一步骤的用户任务 + * + * @param repositoryService + * @param map + * @return + */ + public static List getNextUserTasks(RepositoryService repositoryService, org.flowable.task.api.Task task, Map map) { + List data = new ArrayList<>(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process mainProcess = bpmnModel.getMainProcess(); + Collection flowElements = mainProcess.getFlowElements(); + String key = task.getTaskDefinitionKey(); + FlowElement flowElement = bpmnModel.getFlowElement(key); + next(flowElements, flowElement, map, data); + return data; + } + + /** + * 启动流程时获取下一步骤的用户任务 + * + * @param repositoryService + * @param map + * @return + */ + public static List getNextUserTasksByStart(RepositoryService repositoryService, ProcessDefinition processDefinition, Map map) { + List data = new ArrayList<>(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process mainProcess = bpmnModel.getMainProcess(); + Collection flowElements = mainProcess.getFlowElements(); + String key = null; + // 找到开始节点 并获取唯一key + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + key = flowElement.getId(); + break; + } + } + FlowElement flowElement = bpmnModel.getFlowElement(key); + List sequenceFlows = ((StartEvent)flowElement).getOutgoingFlows(); + // 获取出口连线, 此时从开始节点往后,只能是一个出口 + if (!sequenceFlows.isEmpty()) { + SequenceFlow sequenceFlow = sequenceFlows.get(0); + FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement(); + next(flowElements, targetFlowElement, map, data); + } + return data; + } + + + /** + * 查找下一节点 + * + * @param flowElements + * @param flowElement + * @param map + * @param nextUser + */ + public static void next(Collection flowElements, FlowElement flowElement, Map map, List nextUser) { + //如果是结束节点 + if (flowElement instanceof EndEvent) { + //如果是子任务的结束节点 + if (getSubProcess(flowElements, flowElement) != null) { + flowElement = getSubProcess(flowElements, flowElement); + } + } + //获取Task的出线信息--可以拥有多个 + List outGoingFlows = null; + if (flowElement instanceof Task) { + outGoingFlows = ((Task) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof Gateway) { + outGoingFlows = ((Gateway) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof StartEvent) { + outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof SubProcess) { + outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof CallActivity) { + outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows(); + } + if (outGoingFlows != null && outGoingFlows.size() > 0) { + //遍历所有的出线--找到可以正确执行的那一条 + for (SequenceFlow sequenceFlow : outGoingFlows) { + //1.有表达式,且为true + //2.无表达式 + String expression = sequenceFlow.getConditionExpression(); + if (expression == null || + expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) { + //出线的下一节点 + String nextFlowElementID = sequenceFlow.getTargetRef(); + if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { + continue; + } + + //查询下一节点的信息 + FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements); + //调用流程 + if (nextFlowElement instanceof CallActivity) { + CallActivity ca = (CallActivity) nextFlowElement; + if (ca.getLoopCharacteristics() != null) { + UserTask userTask = new UserTask(); + userTask.setId(ca.getId()); + + userTask.setId(ca.getId()); + userTask.setLoopCharacteristics(ca.getLoopCharacteristics()); + userTask.setName(ca.getName()); + nextUser.add(userTask); + } + next(flowElements, nextFlowElement, map, nextUser); + } + //用户任务 + if (nextFlowElement instanceof UserTask) { + nextUser.add((UserTask) nextFlowElement); + } + //排他网关 + else if (nextFlowElement instanceof ExclusiveGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //并行网关 + else if (nextFlowElement instanceof ParallelGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //接收任务 + else if (nextFlowElement instanceof ReceiveTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //服务任务 + else if (nextFlowElement instanceof ServiceTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //子任务的起点 + else if (nextFlowElement instanceof StartEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + //结束节点 + else if (nextFlowElement instanceof EndEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + } + } + } + } + + /** + * 判断是否是多实例子流程并且需要设置集合类型变量 + */ + public static boolean checkSubProcess(String id, Collection flowElements, List nextUser) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess && flowElement1.getId().equals(id)) { + + SubProcess sp = (SubProcess) flowElement1; + if (sp.getLoopCharacteristics() != null) { +// String inputDataItem = sp.getLoopCharacteristics().getInputDataItem(); + UserTask userTask = new UserTask(); + userTask.setId(sp.getId()); + userTask.setLoopCharacteristics(sp.getLoopCharacteristics()); + userTask.setName(sp.getName()); + nextUser.add(userTask); + return true; + } + } + } + + return false; + + } + + /** + * 查询一个节点的是否子任务中的节点,如果是,返回子任务 + * + * @param flowElements 全流程的节点集合 + * @param flowElement 当前节点 + * @return + */ + public static FlowElement getSubProcess(Collection flowElements, FlowElement flowElement) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess) { + for (FlowElement flowElement2 : ((SubProcess) flowElement1).getFlowElements()) { + if (flowElement.equals(flowElement2)) { + return flowElement1; + } + } + } + } + return null; + } + + + /** + * 根据ID查询流程节点对象, 如果是子任务,则返回子任务的开始节点 + * + * @param Id 节点ID + * @param flowElements 流程节点集合 + * @return + */ + public static FlowElement getFlowElementById(String Id, Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement.getId().equals(Id)) { + //如果是子任务,则查询出子任务的开始节点 + if (flowElement instanceof SubProcess) { + return getStartFlowElement(((SubProcess) flowElement).getFlowElements()); + } + return flowElement; + } + if (flowElement instanceof SubProcess) { + FlowElement flowElement1 = getFlowElementById(Id, ((SubProcess) flowElement).getFlowElements()); + if (flowElement1 != null) { + return flowElement1; + } + } + } + return null; + } + + /** + * 返回流程的开始节点 + * + * @param flowElements 节点集合 + * @description: + */ + public static FlowElement getStartFlowElement(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + return flowElement; + } + } + return null; + } + + /** + * 校验el表达式 + * + * @param map + * @param expression + * @return + */ + public static boolean expressionResult(Map map, String expression) { + Expression exp = AviatorEvaluator.compile(expression); + return (Boolean) exp.execute(map); +// return true; + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/flow/FlowableUtils.java b/flowable/src/main/java/com/dite/znpt/flowable/flow/FlowableUtils.java new file mode 100644 index 0000000..742e011 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/flow/FlowableUtils.java @@ -0,0 +1,702 @@ +package com.dite.znpt.flowable.flow; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.*; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.task.api.history.HistoricTaskInstance; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Tony + * @date 2021-04-03 23:57 + */ +@Slf4j +public class FlowableUtils { + + /** + * 根据节点,获取入口连线 + * + * @param source + * @return + */ + public static List getElementIncomingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getIncomingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getIncomingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getIncomingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getIncomingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getIncomingFlows(); + } + return sequenceFlows; + } + + /** + * 根据节点,获取出口连线 + * + * @param source + * @return + */ + public static List getElementOutgoingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getOutgoingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getOutgoingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getOutgoingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getOutgoingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getOutgoingFlows(); + } + return sequenceFlows; + } + + /** + * 获取全部节点列表,包含子流程节点 + * + * @param flowElements + * @param allElements + * @return + */ + public static Collection getAllElements(Collection flowElements, Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + + for (FlowElement flowElement : flowElements) { + allElements.add(flowElement); + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; + } + + /** + * 迭代获取父级任务节点列表,向前找 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 已找到的用户任务节点 + * @return + */ + public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 类型为用户节点,则新增父级节点 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); + continue; + } + // 类型为子流程,则添加子流程开始节点出口处相连的节点 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + // 获取子流程用户任务节点 + List childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 + * + * @param source 起始节点(退回节点) + * @param runTaskKeyList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List iteratorFindChildUserTasks(FlowElement source, List runTaskKeyList, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof EndEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 迭代获取子流程用户任务节点 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = findChildProcessUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 从后向前寻路,获取所有脏线路上的点 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 目标脏线路终点 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, Set hasSequenceFlow, List targets, Set dirtyRoads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 新增经过的路线 + passRoads.add(sequenceFlow.getSourceFlowElement().getId()); + // 如果此点为目标点,确定经过的路线为脏线路,添加点到脏线路中,然后找下个连线 + if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) { + dirtyRoads.addAll(passRoads); + continue; + } + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, dirtyRoads); + // 是否存在子流程上,true 是,false 否 + Boolean isInChildProcess = dirtyTargetInChildProcess((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, targets, null); + if (isInChildProcess) { + // 已在子流程上找到,该路线结束 + continue; + } + } + // 继续迭代 + dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 迭代获取子流程脏路线 + * 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, Set dirtyRoads) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加脏路线 + dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId()); + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, dirtyRoads); + } + // 继续迭代 + dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 判断脏路线结束节点是否在子流程上 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 + * @param inChildProcess 是否存在子流程上,true 是,false 否 + * @return + */ + public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, List targets, Boolean inChildProcess) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + inChildProcess = inChildProcess != null && inChildProcess; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null && !inChildProcess) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果发现目标点在子流程上存在,说明只到子流程为止 + if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) { + inChildProcess = true; + break; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + inChildProcess = dirtyTargetInChildProcess((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, targets, inChildProcess); + } + // 继续迭代 + inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, targets, inChildProcess); + } + } + return inChildProcess; + } + + /** + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 + * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 + * + * @param source 起始节点 + * @param isSequential 是否串行 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targetKsy 目标节点 + * @return + */ + public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set hasSequenceFlow, Boolean isSequential) { + isSequential = isSequential == null || isSequential; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, isSequential); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果目标节点已被判断为并行,后面都不需要执行,直接返回 + if (!isSequential) { + break; + } + // 这条线路存在目标节点,这条线路完成,进入下个线路 + if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) { + continue; + } + if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) { + isSequential = false; + break; + } + // 否则就继续迭代 + isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, hasSequenceFlow, isSequential); + } + } + return isSequential; + } + + /** + * 从后向前寻路,获取到达节点的所有路线 + * 不存在直接回退到子流程,但是存在回退到父级流程的情况 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param roads 路线 + * @return + */ + public static List> findRoad(FlowElement source, List passRoads, Set hasSequenceFlow, List> roads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + roads = roads == null ? new ArrayList<>() : roads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null && sequenceFlows.size() != 0) { + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加经过路线 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + passRoads.add((UserTask) sequenceFlow.getSourceFlowElement()); + } + // 继续迭代 + roads = findRoad(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, roads); + } + } else { + // 添加路线 + roads.add(passRoads); + } + return roads; + } + + /** + * 历史节点数据清洗,清洗掉又回滚导致的脏数据 + * + * @param allElements 全部节点信息 + * @param historicTaskInstanceList 历史任务实例信息,数据采用开始时间升序 + * @return + */ + public static List historicTaskInstanceClean(Collection allElements, List historicTaskInstanceList) { + // 会签节点收集 + List multiTask = new ArrayList<>(); + allElements.forEach(flowElement -> { + if (flowElement instanceof UserTask) { + // 如果该节点的行为为会签行为,说明该节点为会签节点 + if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) { + multiTask.add(flowElement.getId()); + } + } + }); + // 循环放入栈,栈 LIFO:后进先出 + Stack stack = new Stack<>(); + historicTaskInstanceList.forEach(stack::push); + // 清洗后的历史任务实例 + List lastHistoricTaskInstanceList = new ArrayList<>(); + // 网关存在可能只走了部分分支情况,且还存在跳转废弃数据以及其他分支数据的干扰,因此需要对历史节点数据进行清洗 + // 临时用户任务 key + StringBuilder userTaskKey = null; + // 临时被删掉的任务 key,存在并行情况 + List deleteKeyList = new ArrayList<>(); + // 临时脏数据线路 + List> dirtyDataLineList = new ArrayList<>(); + // 由某个点跳到会签点,此时出现多个会签实例对应 1 个跳转情况,需要把这些连续脏数据都找到 + // 会签特殊处理下标 + int multiIndex = -1; + // 会签特殊处理 key + StringBuilder multiKey = null; + // 会签特殊处理操作标识 + boolean multiOpera = false; + while (!stack.empty()) { + // 从这里开始 userTaskKey 都还是上个栈的 key + // 是否是脏数据线路上的点 + final boolean[] isDirtyData = {false}; + for (Set oldDirtyDataLine : dirtyDataLineList) { + if (oldDirtyDataLine.contains(stack.peek().getTaskDefinitionKey())) { + isDirtyData[0] = true; + } + } + // 删除原因不为空,说明从这条数据开始回跳或者回退的 + // MI_END:会签完成后,其他未签到节点的删除原因,不在处理范围内 + if (stack.peek().getDeleteReason() != null && !"MI_END".equals(stack.peek().getDeleteReason())) { + // 可以理解为脏线路起点 + String dirtyPoint = ""; + if (stack.peek().getDeleteReason().contains("Change activity to ")) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", ""); + } + // 会签回退删除原因有点不同 + if (stack.peek().getDeleteReason().contains("Change parent activity to ")) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", ""); + } + FlowElement dirtyTask = null; + // 获取变更节点的对应的入口处连线 + // 如果是网关并行回退情况,会变成两条脏数据路线,效果一样 + for (FlowElement flowElement : allElements) { + if (flowElement.getId().equals(stack.peek().getTaskDefinitionKey())) { + dirtyTask = flowElement; + } + } + // 获取脏数据线路 + Set dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, Arrays.asList(dirtyPoint.split(",")), null); + // 自己本身也是脏线路上的点,加进去 + dirtyDataLine.add(stack.peek().getTaskDefinitionKey()); + log.info(stack.peek().getTaskDefinitionKey() + "点脏路线集合:" + dirtyDataLine); + // 是全新的需要添加的脏线路 + boolean isNewDirtyData = true; + for (int i = 0; i < dirtyDataLineList.size(); i++) { + // 如果发现他的上个节点在脏线路内,说明这个点可能是并行的节点,或者连续驳回 + // 这时,都以之前的脏线路节点为标准,只需合并脏线路即可,也就是路线补全 + if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) { + isNewDirtyData = false; + dirtyDataLineList.get(i).addAll(dirtyDataLine); + } + } + // 已确定时全新的脏线路 + if (isNewDirtyData) { + // deleteKey 单一路线驳回到并行,这种同时生成多个新实例记录情况,这时 deleteKey 其实是由多个值组成 + // 按照逻辑,回退后立刻生成的实例记录就是回退的记录 + // 至于驳回所生成的 Key,直接从删除原因中获取,因为存在驳回到并行的情况 + deleteKeyList.add(dirtyPoint + ","); + dirtyDataLineList.add(dirtyDataLine); + } + // 添加后,现在这个点变成脏线路上的点了 + isDirtyData[0] = true; + } + // 如果不是脏线路上的点,说明是有效数据,添加历史实例 Key + if (!isDirtyData[0]) { + lastHistoricTaskInstanceList.add(stack.peek().getTaskDefinitionKey()); + } + // 校验脏线路是否结束 + for (int i = 0; i < deleteKeyList.size(); i++) { + // 如果发现脏数据属于会签,记录下下标与对应 Key,以备后续比对,会签脏数据范畴开始 + if (multiKey == null && multiTask.contains(stack.peek().getTaskDefinitionKey()) + && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + multiIndex = i; + multiKey = new StringBuilder(stack.peek().getTaskDefinitionKey()); + } + // 会签脏数据处理,节点退回会签清空 + // 如果在会签脏数据范畴中发现 Key改变,说明会签脏数据在上个节点就结束了,可以把会签脏数据删掉 + if (multiKey != null && !multiKey.toString().equals(stack.peek().getTaskDefinitionKey())) { + deleteKeyList.set(multiIndex, deleteKeyList.get(multiIndex).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + multiKey = null; + // 结束进行下校验删除 + multiOpera = true; + } + // 其他脏数据处理 + // 发现该路线最后一条脏数据,说明这条脏数据线路处理完了,删除脏数据信息 + // 脏数据产生的新实例中是否包含这条数据 + if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + // 删除匹配到的部分 + deleteKeyList.set(i, deleteKeyList.get(i).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + } + // 如果每组中的元素都以匹配过,说明脏数据结束 + if ("".equals(deleteKeyList.get(i))) { + // 同时删除脏数据 + deleteKeyList.remove(i); + dirtyDataLineList.remove(i); + break; + } + } + // 会签数据处理需要在循环外处理,否则可能导致溢出 + // 会签的数据肯定是之前放进去的所以理论上不会溢出,但还是校验下 + if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) { + // 同时删除脏数据 + deleteKeyList.remove(multiIndex); + dirtyDataLineList.remove(multiIndex); + multiIndex = -1; + multiOpera = false; + } + // pop() 方法与 peek() 方法不同,在返回值的同时,会把值从栈中移除 + // 保存新的 userTaskKey 在下个循环中使用 + userTaskKey = new StringBuilder(stack.pop().getTaskDefinitionKey()); + } + log.info("清洗后的历史节点数据:" + lastHistoricTaskInstanceList); + return lastHistoricTaskInstanceList; + } + + /** + * 从 flowElement 获取 指定名称的 拓展元素 + * + * @param flowElement 元素 + * @param extensionElementName 拓展元素名称 + */ + public static ExtensionElement getExtensionElementFromFlowElementByName(FlowElement flowElement, String extensionElementName) { + + if (flowElement == null) { + return null; + } + Map> extensionElements = flowElement.getExtensionElements(); + for (Map.Entry> stringEntry : extensionElements.entrySet()) { + if (stringEntry.getKey().equals(extensionElementName)) { + for (ExtensionElement extensionElement : stringEntry.getValue()) { + if (extensionElement.getName().equals(extensionElementName)) { + return extensionElement; + } + } + } + } + + return null; + } + + /** + * 获取当前任务节点扩展属性信息 + * + * @param repositoryService + * @param task 当前任务 + * @return 自定义属性列表 + */ + public static List getPropertyElement(RepositoryService repositoryService, org.flowable.task.api.Task task) { + FlowElement flowElement = getCurrentElement(repositoryService, task); + ExtensionElement extensionElement = FlowableUtils.getExtensionElementFromFlowElementByName(flowElement, "properties"); + if (extensionElement == null) { + return Collections.emptyList(); + } + return getPropertyExtensionElementByName(extensionElement, "property"); + } + + /** + * 获取当前任务节点 + * + * @param repositoryService + * @param task + * @return + */ + public static FlowElement getCurrentElement(RepositoryService repositoryService, org.flowable.task.api.Task task) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + return bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + } + + /** + * 根据属性名获取扩展元素中的扩展属性列表 + * + * @param extensionElement 扩展元素 + * @param attributesName 属性名 + * @return 扩展属性列表 + */ + public static List getPropertyExtensionElementByName(ExtensionElement extensionElement, String attributesName) { + try { + // 获取名称为attributesName的子元素 + return Optional.ofNullable(extensionElement.getChildElements().get(attributesName)) + .orElse(Collections.emptyList()) // 如果子元素不存在则返回空集合,避免null引用 + .stream() + .map(element -> { + // 获取子元素的属性 + Map> attributes = element.getAttributes(); + Object propertyDto = new Object(); + // 获取FlowPropertyDto的所有属性 + Arrays.stream(propertyDto.getClass().getDeclaredFields()) + .forEach(field -> { + field.setAccessible(true); + // 获取属性名称和值 + attributes.getOrDefault(field.getName(), Collections.emptyList()) + .stream() + .findFirst() + .ifPresent(attribute -> { + try { + // 反射设置属性值 + field.set(propertyDto, attribute.getValue()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + // 如果反射设置失败则忽略该属性 + } + }); + }); + return propertyDto; + }).collect(Collectors.toList()); + } catch (Exception e) { + e.printStackTrace(); + return Collections.emptyList(); // 如果发生异常则返回空列表 + } + } + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowExecutionListener.java b/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowExecutionListener.java new file mode 100644 index 0000000..514833b --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowExecutionListener.java @@ -0,0 +1,36 @@ +package com.dite.znpt.flowable.listener; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.Expression; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.springframework.stereotype.Component; + +/** + * 执行监听器 + * + * 执行监听器允许在执行过程中执行Java代码。 + * 执行监听器可以捕获事件的类型: + * 流程实例启动,结束 + * 输出流捕获 + * 获取启动,结束 + * 路由开始,结束 + * 中间事件开始,结束 + * 触发开始事件,触发结束事件 + * + * @author Tony + * @date 2022/12/16 + */ +@Slf4j +@Component +public class FlowExecutionListener implements ExecutionListener { + /** + * 流程设计器添加的参数 + */ + private Expression param; + + @Override + public void notify(DelegateExecution execution) { + log.info("执行监听器:{}", execution); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowTaskListener.java b/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowTaskListener.java new file mode 100644 index 0000000..ec8b89f --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/listener/FlowTaskListener.java @@ -0,0 +1,32 @@ +package com.dite.znpt.flowable.listener; + +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +/** + * 任务监听器 + * + * create(创建):在任务被创建且所有的任务属性设置完成后才触发 + * assignment(指派):在任务被分配给某个办理人之后触发 + * complete(完成):在配置了监听器的上一个任务完成时触发 + * delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发 + * + * @author Tony + * @date 2021/4/20 + */ +@Slf4j +@Component +public class FlowTaskListener implements TaskListener{ + + @Override + public void notify(DelegateTask delegateTask) { + + log.info("任务监听器:{}", delegateTask); + // TODO 获取事件类型 delegateTask.getEventName(),可以通过监听器给任务执行人发送相应的通知消息 + + + } + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysDeployFormMapper.java b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysDeployFormMapper.java new file mode 100644 index 0000000..b5cc146 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysDeployFormMapper.java @@ -0,0 +1,73 @@ +package com.dite.znpt.flowable.mapper; + + +import com.dite.znpt.flowable.domain.entity.SysDeployForm; +import com.dite.znpt.flowable.domain.entity.SysForm; + +import java.util.List; + +/** + * 流程实例关联表单Mapper接口 + * + * @author Tony + * @date 2021-03-30 + */ +public interface SysDeployFormMapper +{ + /** + * 查询流程实例关联表单 + * + * @param id 流程实例关联表单ID + * @return 流程实例关联表单 + */ + public SysDeployForm selectSysDeployFormById(Long id); + + /** + * 查询流程实例关联表单列表 + * + * @param SysDeployForm 流程实例关联表单 + * @return 流程实例关联表单集合 + */ + public List selectSysDeployFormList(SysDeployForm SysDeployForm); + + /** + * 新增流程实例关联表单 + * + * @param SysDeployForm 流程实例关联表单 + * @return 结果 + */ + public int insertSysDeployForm(SysDeployForm SysDeployForm); + + /** + * 修改流程实例关联表单 + * + * @param SysDeployForm 流程实例关联表单 + * @return 结果 + */ + public int updateSysDeployForm(SysDeployForm SysDeployForm); + + /** + * 删除流程实例关联表单 + * + * @param id 流程实例关联表单ID + * @return 结果 + */ + public int deleteSysDeployFormById(Long id); + + /** + * 批量删除流程实例关联表单 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSysDeployFormByIds(Long[] ids); + + + + /** + * 查询流程挂着的表单 + * @param deployId + * @return + */ + SysForm selectSysDeployFormByDeployId(String deployId); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysExpressionMapper.java b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysExpressionMapper.java new file mode 100644 index 0000000..8156df3 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysExpressionMapper.java @@ -0,0 +1,63 @@ +package com.dite.znpt.flowable.mapper; + + +import com.dite.znpt.flowable.domain.entity.SysExpression; + +import java.util.List; + +/** + * 流程达式Mapper接口 + * + * @author ruoyi + * @date 2022-12-12 + */ +public interface SysExpressionMapper +{ + /** + * 查询流程达式 + * + * @param id 流程达式主键 + * @return 流程达式 + */ + public SysExpression selectSysExpressionById(Long id); + + /** + * 查询流程达式列表 + * + * @param sysExpression 流程达式 + * @return 流程达式集合 + */ + public List selectSysExpressionList(SysExpression sysExpression); + + /** + * 新增流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + public int insertSysExpression(SysExpression sysExpression); + + /** + * 修改流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + public int updateSysExpression(SysExpression sysExpression); + + /** + * 删除流程达式 + * + * @param id 流程达式主键 + * @return 结果 + */ + public int deleteSysExpressionById(Long id); + + /** + * 批量删除流程达式 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSysExpressionByIds(Long[] ids); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysFormMapper.java b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysFormMapper.java new file mode 100644 index 0000000..9ee72ba --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysFormMapper.java @@ -0,0 +1,63 @@ +package com.dite.znpt.flowable.mapper; + + +import com.dite.znpt.flowable.domain.entity.SysForm; + +import java.util.List; + +/** + * 流程表单Mapper接口 + * + * @author Tony + * @date 2021-03-30 + */ +public interface SysFormMapper +{ + /** + * 查询流程表单 + * + * @param formId 流程表单ID + * @return 流程表单 + */ + public SysForm selectSysFormById(Long formId); + + /** + * 查询流程表单列表 + * + * @param sysForm 流程表单 + * @return 流程表单集合 + */ + public List selectSysFormList(SysForm sysForm); + + /** + * 新增流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + public int insertSysForm(SysForm sysForm); + + /** + * 修改流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + public int updateSysForm(SysForm sysForm); + + /** + * 删除流程表单 + * + * @param formId 流程表单ID + * @return 结果 + */ + public int deleteSysFormById(Long formId); + + /** + * 批量删除流程表单 + * + * @param formIds 需要删除的数据ID + * @return 结果 + */ + public int deleteSysFormByIds(Long[] formIds); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysListenerMapper.java b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysListenerMapper.java new file mode 100644 index 0000000..10ffe5a --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/mapper/SysListenerMapper.java @@ -0,0 +1,62 @@ +package com.dite.znpt.flowable.mapper; + +import com.dite.znpt.flowable.domain.entity.SysListener; + +import java.util.List; + +/** + * 流程监听Mapper接口 + * + * @author Tony + * @date 2022-12-25 + */ +public interface SysListenerMapper +{ + /** + * 查询流程监听 + * + * @param id 流程监听主键 + * @return 流程监听 + */ + public SysListener selectSysListenerById(Long id); + + /** + * 查询流程监听列表 + * + * @param sysListener 流程监听 + * @return 流程监听集合 + */ + public List selectSysListenerList(SysListener sysListener); + + /** + * 新增流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + public int insertSysListener(SysListener sysListener); + + /** + * 修改流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + public int updateSysListener(SysListener sysListener); + + /** + * 删除流程监听 + * + * @param id 流程监听主键 + * @return 结果 + */ + public int deleteSysListenerById(Long id); + + /** + * 批量删除流程监听 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSysListenerByIds(Long[] ids); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowDefinitionService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowDefinitionService.java new file mode 100644 index 0000000..94d22d6 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowDefinitionService.java @@ -0,0 +1,80 @@ +package com.dite.znpt.flowable.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.dto.FlowProcDefDto; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * @author Tony + * @date 2021-04-03 14:41 + */ +public interface IFlowDefinitionService { + + boolean exist(String processDefinitionKey); + + + /** + * 流程定义列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return 流程定义分页列表数据 + */ + Page list(String name, Integer pageNum, Integer pageSize); + + /** + * 导入流程文件 + * 当每个key的流程第一次部署时,指定版本为1。对其后所有使用相同key的流程定义, + * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义 + * @param name + * @param category + * @param in + */ + void importFile(String name, String category, InputStream in); + + /** + * 读取xml + * @param deployId + * @return + */ + Result readXml(String deployId) throws IOException; + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId + * @param variables + * @return + */ + + Result startProcessInstanceById(String procDefId, Map variables); + + + /** + * 激活或挂起流程定义 + * + * @param state 状态 + * @param deployId 流程部署ID + */ + void updateState(Integer state, String deployId); + + + /** + * 删除流程定义 + * + * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值 + */ + void delete(String deployId); + + + /** + * 读取图片文件 + * @param deployId + * @return + */ + InputStream readImage(String deployId); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowInstanceService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowInstanceService.java new file mode 100644 index 0000000..7bc4b5d --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowInstanceService.java @@ -0,0 +1,53 @@ +package com.dite.znpt.flowable.service; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import org.flowable.engine.history.HistoricProcessInstance; +import java.util.Map; + +/** + * @author Tony + * @date 2021-04-03 14:40 + */ +public interface IFlowInstanceService { + + /** + * 结束流程实例 + * + * @param vo + */ + void stopProcessInstance(FlowTaskVo vo); + + /** + * 激活或挂起流程实例 + * + * @param state 状态 + * @param instanceId 流程实例ID + */ + void updateState(Integer state, String instanceId); + + /** + * 删除流程实例ID + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + void delete(String instanceId, String deleteReason); + + /** + * 根据实例ID查询历史实例数据 + * + * @param processInstanceId + * @return + */ + HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId); + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + Result startProcessInstanceById(String procDefId, Map variables); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowTaskService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowTaskService.java new file mode 100644 index 0000000..226845b --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/IFlowTaskService.java @@ -0,0 +1,218 @@ +package com.dite.znpt.flowable.service; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.vo.FlowQueryVo; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import org.flowable.task.api.Task; + +import java.io.InputStream; +import java.util.List; + +/** + * @author Tony + * @date 2021-04-03 14:42 + */ +public interface IFlowTaskService { + + /** + * 审批任务 + * + * @param task 请求实体参数 + */ + Result complete(FlowTaskVo task); + + /** + * 驳回任务 + * + * @param flowTaskVo + */ + void taskReject(FlowTaskVo flowTaskVo); + + + /** + * 退回任务 + * + * @param flowTaskVo 请求实体参数 + */ + void taskReturn(FlowTaskVo flowTaskVo); + + /** + * 获取所有可回退的节点 + * + * @param flowTaskVo + * @return + */ + Result findReturnTaskList(FlowTaskVo flowTaskVo); + + /** + * 删除任务 + * + * @param flowTaskVo 请求实体参数 + */ + void deleteTask(FlowTaskVo flowTaskVo); + + /** + * 认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void claim(FlowTaskVo flowTaskVo); + + /** + * 取消认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + void unClaim(FlowTaskVo flowTaskVo); + + /** + * 委派任务 + * + * @param flowTaskVo 请求实体参数 + */ + void delegateTask(FlowTaskVo flowTaskVo); + + /** + * 任务归还 + * + * @param flowTaskVo 请求实体参数 + */ + void resolveTask(FlowTaskVo flowTaskVo); + + + /** + * 转办任务 + * + * @param flowTaskVo 请求实体参数 + */ + void assignTask(FlowTaskVo flowTaskVo); + + + /** + * 多实例加签 + * @param flowTaskVo + */ + void addMultiInstanceExecution(FlowTaskVo flowTaskVo); + + /** + * 多实例减签 + * @param flowTaskVo + */ + void deleteMultiInstanceExecution(FlowTaskVo flowTaskVo); + + /** + * 我发起的流程 + * @param queryVo 请求参数 + * @return + */ + Result myProcess(FlowQueryVo queryVo); + + /** + * 取消申请 + * 目前实现方式: 直接将当前流程变更为已完成 + * @param flowTaskVo + * @return + */ + Result stopProcess(FlowTaskVo flowTaskVo); + + /** + * 撤回流程 + * @param flowTaskVo + * @return + */ + Result revokeProcess(FlowTaskVo flowTaskVo); + + + /** + * 代办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + Result todoList(FlowQueryVo queryVo); + + + /** + * 已办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + Result finishedList(FlowQueryVo queryVo); + + /** + * 流程历史流转记录 + * + * @param procInsId 流程实例Id + * @return + */ + Result flowRecord(String procInsId,String deployId); + + /** + * 根据任务ID查询挂载的表单信息 + * + * @param taskId 任务Id + * @return + */ + Result getTaskForm(String taskId); + + /** + * 获取流程过程图 + * @param processId + * @return + */ + InputStream diagram(String processId); + + /** + * 获取流程执行节点 + * @param procInsId + * @return + */ + Result getFlowViewer(String procInsId,String executionId); + + /** + * 获取流程变量 + * @param taskId + * @return + */ + Result processVariables(String taskId); + + /** + * 获取下一节点 + * @param flowTaskVo 任务 + * @return + */ + Result getNextFlowNode(FlowTaskVo flowTaskVo); + + Result getNextFlowNodeByStart(FlowTaskVo flowTaskVo); + + /** + * 流程初始化表单 + * @param deployId + * @return + */ + Result flowFormData(String deployId); + + /** + * 流程节点信息 + * @param procInsId + * @return + */ + Result flowXmlAndNode(String procInsId,String deployId); + + /** + * 流程节点表单 + * @param taskId 流程任务编号 + * @return + */ + Result flowTaskForm(String taskId) throws Exception; + + + /** + * 流程节点信息 + * @param procInsId + * @param elementId + * @return + */ + Result flowTaskInfo(String procInsId, String elementId); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/ISysDeployFormService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysDeployFormService.java new file mode 100644 index 0000000..d10ffee --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysDeployFormService.java @@ -0,0 +1,70 @@ +package com.dite.znpt.flowable.service; + +import com.dite.znpt.flowable.domain.entity.SysDeployForm; +import com.dite.znpt.flowable.domain.entity.SysForm; + +import java.util.List; + +/** + * 流程实例关联表单Service接口 + * + * @author Tony + * @date 2021-04-03 + */ +public interface ISysDeployFormService +{ + /** + * 查询流程实例关联表单 + * + * @param id 流程实例关联表单ID + * @return 流程实例关联表单 + */ + public SysDeployForm selectSysDeployFormById(Long id); + + /** + * 查询流程实例关联表单列表 + * + * @param sysDeployForm 流程实例关联表单 + * @return 流程实例关联表单集合 + */ + public List selectSysDeployFormList(SysDeployForm sysDeployForm); + + /** + * 新增流程实例关联表单 + * + * @param sysDeployForm 流程实例关联表单 + * @return 结果 + */ + public int insertSysDeployForm(SysDeployForm sysDeployForm); + + /** + * 修改流程实例关联表单 + * + * @param sysDeployForm 流程实例关联表单 + * @return 结果 + */ + public int updateSysDeployForm(SysDeployForm sysDeployForm); + + /** + * 批量删除流程实例关联表单 + * + * @param ids 需要删除的流程实例关联表单ID + * @return 结果 + */ + public int deleteSysDeployFormByIds(Long[] ids); + + /** + * 删除流程实例关联表单信息 + * + * @param id 流程实例关联表单ID + * @return 结果 + */ + public int deleteSysDeployFormById(Long id); + + /** + * 查询流程挂着的表单 + * @param deployId + * @return + */ + SysForm selectSysDeployFormByDeployId(String deployId); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/ISysExpressionService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysExpressionService.java new file mode 100644 index 0000000..f41fcab --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysExpressionService.java @@ -0,0 +1,63 @@ +package com.dite.znpt.flowable.service; + + +import com.dite.znpt.flowable.domain.entity.SysExpression; + +import java.util.List; + +/** + * 流程达式Service接口 + * + * @author ruoyi + * @date 2022-12-12 + */ +public interface ISysExpressionService +{ + /** + * 查询流程达式 + * + * @param id 流程达式主键 + * @return 流程达式 + */ + public SysExpression selectSysExpressionById(Long id); + + /** + * 查询流程达式列表 + * + * @param sysExpression 流程达式 + * @return 流程达式集合 + */ + public List selectSysExpressionList(SysExpression sysExpression); + + /** + * 新增流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + public int insertSysExpression(SysExpression sysExpression); + + /** + * 修改流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + public int updateSysExpression(SysExpression sysExpression); + + /** + * 批量删除流程达式 + * + * @param ids 需要删除的流程达式主键集合 + * @return 结果 + */ + public int deleteSysExpressionByIds(Long[] ids); + + /** + * 删除流程达式信息 + * + * @param id 流程达式主键 + * @return 结果 + */ + public int deleteSysExpressionById(Long id); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/ISysFormService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysFormService.java new file mode 100644 index 0000000..8e4ed68 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysFormService.java @@ -0,0 +1,61 @@ +package com.dite.znpt.flowable.service; + +import com.dite.znpt.flowable.domain.entity.SysForm; + +import java.util.List; + +/** + * 表单 + * @author Tony + * @date 2021-04-03 + */ +public interface ISysFormService +{ + /** + * 查询流程表单 + * + * @param formId 流程表单ID + * @return 流程表单 + */ + public SysForm selectSysFormById(Long formId); + + /** + * 查询流程表单列表 + * + * @param sysForm 流程表单 + * @return 流程表单集合 + */ + public List selectSysFormList(SysForm sysForm); + + /** + * 新增流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + public int insertSysForm(SysForm sysForm); + + /** + * 修改流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + public int updateSysForm(SysForm sysForm); + + /** + * 批量删除流程表单 + * + * @param formIds 需要删除的流程表单ID + * @return 结果 + */ + public int deleteSysFormByIds(Long[] formIds); + + /** + * 删除流程表单信息 + * + * @param formId 流程表单ID + * @return 结果 + */ + public int deleteSysFormById(Long formId); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/ISysListenerService.java b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysListenerService.java new file mode 100644 index 0000000..006d41f --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/ISysListenerService.java @@ -0,0 +1,63 @@ +package com.dite.znpt.flowable.service; + + +import com.dite.znpt.flowable.domain.entity.SysListener; + +import java.util.List; + +/** + * 流程监听Service接口 + * + * @author Tony + * @date 2022-12-25 + */ +public interface ISysListenerService +{ + /** + * 查询流程监听 + * + * @param id 流程监听主键 + * @return 流程监听 + */ + public SysListener selectSysListenerById(Long id); + + /** + * 查询流程监听列表 + * + * @param sysListener 流程监听 + * @return 流程监听集合 + */ + public List selectSysListenerList(SysListener sysListener); + + /** + * 新增流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + public int insertSysListener(SysListener sysListener); + + /** + * 修改流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + public int updateSysListener(SysListener sysListener); + + /** + * 批量删除流程监听 + * + * @param ids 需要删除的流程监听主键集合 + * @return 结果 + */ + public int deleteSysListenerByIds(Long[] ids); + + /** + * 删除流程监听信息 + * + * @param id 流程监听主键 + * @return 结果 + */ + public int deleteSysListenerById(Long id); +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowDefinitionServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowDefinitionServiceImpl.java new file mode 100644 index 0000000..b64e696 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowDefinitionServiceImpl.java @@ -0,0 +1,241 @@ +package com.dite.znpt.flowable.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.dto.FlowProcDefDto; +import com.dite.znpt.flowable.domain.entity.SysForm; +import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.flowable.common.constant.ProcessConstants; +import com.dite.znpt.flowable.common.enums.FlowComment; +import com.dite.znpt.flowable.factory.FlowServiceFactory; +import com.dite.znpt.flowable.service.IFlowDefinitionService; +import com.dite.znpt.flowable.service.ISysDeployFormService; +import com.dite.znpt.mapper.FlowDeployMapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.image.impl.DefaultProcessDiagramGenerator; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 流程定义 + * + * @author Tony + * @date 2021-04-03 + */ +@Service +@Slf4j +public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService { + + @Resource + private ISysDeployFormService sysDeployFormService; + + @Resource + private FlowDeployMapper flowDeployMapper; + + private static final String BPMN_FILE_SUFFIX = ".bpmn"; + + @Override + public boolean exist(String processDefinitionKey) { + ProcessDefinitionQuery processDefinitionQuery + = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey); + long count = processDefinitionQuery.count(); + return count > 0 ? true : false; + } + + + /** + * 流程定义列表 + * + * @param pageNum 当前页码 + * @param pageSize 每页条数 + * @return 流程定义分页列表数据 + */ + @Override + public Page list(String name, Integer pageNum, Integer pageSize) { + Page page = new Page<>(); +// // 流程定义列表数据查询 +// final ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); +// if (StringUtils.isNotEmpty(name)) { +// processDefinitionQuery.processDefinitionNameLike(name); +// } +//// processDefinitionQuery.orderByProcessDefinitionKey().asc(); +// page.setTotal(processDefinitionQuery.count()); +// List processDefinitionList = processDefinitionQuery.listPage(pageSize * (pageNum - 1), pageSize); +// +// List dataList = new ArrayList<>(); +// for (ProcessDefinition processDefinition : processDefinitionList) { +// String deploymentId = processDefinition.getDeploymentId(); +// Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult(); +// FlowProcDefDto reProcDef = new FlowProcDefDto(); +// BeanUtils.copyProperties(processDefinition, reProcDef); +// SysForm sysForm = sysDeployFormService.selectSysDeployFormByDeployId(deploymentId); +// if (Objects.nonNull(sysForm)) { +// reProcDef.setFormName(sysForm.getFormName()); +// reProcDef.setFormId(sysForm.getFormId()); +// } +// // 流程定义时间 +// reProcDef.setDeploymentTime(deployment.getDeploymentTime()); +// dataList.add(reProcDef); +// } + PageHelper.startPage(pageNum, pageSize); + final List dataList = flowDeployMapper.selectDeployList(name); + // 加载挂表单 + for (FlowProcDefDto procDef : dataList) { + SysForm sysForm = sysDeployFormService.selectSysDeployFormByDeployId(procDef.getDeploymentId()); + if (Objects.nonNull(sysForm)) { + procDef.setFormName(sysForm.getFormName()); + procDef.setFormId(sysForm.getFormId()); + } + } + page.setTotal(new PageInfo(dataList).getTotal()); + page.setRecords(dataList); + return page; + } + + + /** + * 导入流程文件 + * + * 当每个key的流程第一次部署时,指定版本为1。对其后所有使用相同key的流程定义, + * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义 + * @param name + * @param category + * @param in + */ + @Override + public void importFile(String name, String category, InputStream in) { + Deployment deploy = repositoryService.createDeployment().addInputStream(name + BPMN_FILE_SUFFIX, in).name(name).category(category).deploy(); + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), category); + + } + + /** + * 读取xml + * + * @param deployId + * @return + */ + @Override + public Result readXml(String deployId) throws IOException { + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); + String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); + return Result.okM(result,""); + } + + /** + * 读取xml + * + * @param deployId + * @return + */ + @Override + public InputStream readImage(String deployId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + //获得图片流 + DefaultProcessDiagramGenerator diagramGenerator = new DefaultProcessDiagramGenerator(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + //输出为图片 + return diagramGenerator.generateDiagram( + bpmnModel, + "png", + Collections.emptyList(), + Collections.emptyList(), + "宋体", + "宋体", + "宋体", + null, + 1.0, + false); + + } + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程模板ID + * @param variables 流程变量 + * @return + */ + @Override + public Result startProcessInstanceById(String procDefId, Map variables) { + try { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId) + .latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + return Result.error("流程已被挂起,请先激活流程"); + } + // 设置流程发起人Id到流程中 + UserInfo userInfo = (UserInfo)StpUtil.getSession().get("userInfo"); + identityService.setAuthenticatedUserId(userInfo.getUser().getUserId()); + variables.put(ProcessConstants.PROCESS_INITIATOR, userInfo.getUser().getUserId()); + + // 流程发起时 跳过发起人节点 + ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); + // 给第一步申请人节点设置任务执行人和意见 + Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); + if (Objects.nonNull(task)) { + taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), userInfo.getUser().getName() + "发起流程申请"); + taskService.complete(task.getId(), variables); + } + return Result.okM("流程启动成功"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("流程启动错误"); + } + } + + + /** + * 激活或挂起流程定义 + * + * @param state 状态 + * @param deployId 流程部署ID + */ + @Override + public void updateState(Integer state, String deployId) { + ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + // 激活 + if (state == 1) { + repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); + } + // 挂起 + if (state == 2) { + repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); + } + } + + + /** + * 删除流程定义 + * + * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值 + */ + @Override + public void delete(String deployId) { + // true 允许级联删除 ,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(deployId, true); + } + + +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowInstanceServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowInstanceServiceImpl.java new file mode 100644 index 0000000..c44b24e --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowInstanceServiceImpl.java @@ -0,0 +1,119 @@ +package com.dite.znpt.flowable.service.impl; + + +import cn.dev33.satoken.stp.StpUtil; +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import com.dite.znpt.flowable.factory.FlowServiceFactory; +import com.dite.znpt.flowable.service.IFlowInstanceService; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.history.HistoricProcessInstance; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; +import java.util.Objects; + +/** + *

      工作流流程实例管理

      + * + * @author Tony + * @date 2021-04-03 + */ +@Service +@Slf4j +public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlowInstanceService { + + /** + * 结束流程实例 + * + * @param vo + */ + @Override + public void stopProcessInstance(FlowTaskVo vo) { + String taskId = vo.getTaskId(); + + } + + /** + * 激活或挂起流程实例 + * + * @param state 状态 + * @param instanceId 流程实例ID + */ + @Override + public void updateState(Integer state, String instanceId) { + + // 激活 + if (state == 1) { + runtimeService.activateProcessInstanceById(instanceId); + } + // 挂起 + if (state == 2) { + runtimeService.suspendProcessInstanceById(instanceId); + } + } + + /** + * 删除流程实例ID + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String instanceId, String deleteReason) { + + // 查询历史数据 + HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId); + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + return; + } + // 删除流程实例 + runtimeService.deleteProcessInstance(instanceId, deleteReason); + // 删除历史流程实例 + historyService.deleteHistoricProcessInstance(instanceId); + } + + /** + * 根据实例ID查询历史实例数据 + * + * @param processInstanceId + * @return + */ + @Override + public HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId) { + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (Objects.isNull(historicProcessInstance)) { + throw new FlowableObjectNotFoundException("流程实例不存在: " + processInstanceId); + } + return historicProcessInstance; + } + + /** + * 根据流程定义ID启动流程实例 + * + * @param procDefId 流程定义Id + * @param variables 流程变量 + * @return + */ + @Override + public Result startProcessInstanceById(String procDefId, Map variables) { + + try { + // 设置流程发起人Id到流程中 + Long userId = Long.valueOf(StpUtil.getLoginId().toString()); +// identityService.setAuthenticatedUserId(userId.toString()); + variables.put("initiator",userId); + variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); + runtimeService.startProcessInstanceById(procDefId, variables); + return Result.ok("流程启动成功"); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("流程启动错误"); + } + } +} \ No newline at end of file diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowTaskServiceImpl.java new file mode 100644 index 0000000..042d53a --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/FlowTaskServiceImpl.java @@ -0,0 +1,1266 @@ +package com.dite.znpt.flowable.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dite.znpt.domain.Result; +import com.dite.znpt.flowable.domain.entity.SysForm; +import com.dite.znpt.domain.vo.RoleResp; +import com.dite.znpt.domain.vo.UserInfo; +import com.dite.znpt.domain.vo.UserResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.flowable.common.constant.ProcessConstants; +import com.dite.znpt.flowable.common.enums.FlowComment; +import com.dite.znpt.flowable.domain.dto.FlowCommentDto; +import com.dite.znpt.flowable.domain.dto.FlowNextDto; +import com.dite.znpt.flowable.domain.dto.FlowTaskDto; +import com.dite.znpt.flowable.domain.dto.FlowViewerDto; +import com.dite.znpt.flowable.domain.vo.FlowQueryVo; +import com.dite.znpt.flowable.domain.vo.FlowTaskVo; +import com.dite.znpt.flowable.factory.FlowServiceFactory; +import com.dite.znpt.flowable.flow.CustomProcessDiagramGenerator; +import com.dite.znpt.flowable.flow.FindNextNodeUtil; +import com.dite.znpt.flowable.flow.FlowableUtils; +import com.dite.znpt.flowable.service.IFlowTaskService; +import com.dite.znpt.flowable.service.ISysDeployFormService; +import com.dite.znpt.flowable.service.ISysFormService; +import com.dite.znpt.service.RoleService; +import com.dite.znpt.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.cmd.AddMultiInstanceExecutionCmd; +import org.flowable.engine.impl.cmd.DeleteMultiInstanceExecutionCmd; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.task.Comment; +import org.flowable.identitylink.api.history.HistoricIdentityLink; +import org.flowable.image.ProcessDiagramGenerator; +import org.flowable.task.api.DelegationState; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * @author Tony + * @date 2021-04-03 + **/ +@Service +@Slf4j +public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService { + @Resource + private ISysDeployFormService sysInstanceFormService; + @Resource + private ISysFormService sysFormService; + @Resource + private UserService userService; + + @Resource + private RoleService roleService; + + /** + * 完成任务 + * + * @param taskVo 请求实体参数 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Result complete(FlowTaskVo taskVo) { + Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + return Result.error("任务不存在"); + } + if (DelegationState.PENDING.equals(task.getDelegationState())) { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); + taskService.resolveTask(taskVo.getTaskId(), taskVo.getVariables()); + } else { + taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); + UserInfo userInfo = (UserInfo) StpUtil.getSession().get("userInfo"); + taskService.setAssignee(taskVo.getTaskId(), userInfo.getUser().getUserId()); + taskService.complete(taskVo.getTaskId(), taskVo.getVariables()); + } + return Result.ok(); + } + + /** + * 驳回任务 + * + * @param flowTaskVo + */ + @Override + public void taskReject(FlowTaskVo flowTaskVo) { + if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { + throw new ServiceException("任务处于挂起状态!"); + } + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + // 获取全部节点列表,包含子节点 + Collection allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); + // 获取当前任务节点元素 + FlowElement source = null; + if (allElements != null) { + for (FlowElement flowElement : allElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + // 获取节点信息 + source = flowElement; + } + } + } + + // 目的获取所有跳转到的节点 targetIds + // 获取当前节点的所有父级用户任务节点 + // 深度优先算法思想:延边迭代深入 + List parentUserTaskList = FlowableUtils.iteratorFindParentUserTasks(source, null, null); + if (parentUserTaskList == null || parentUserTaskList.size() == 0) { + throw new ServiceException("当前节点为初始任务节点,不能驳回"); + } + // 获取活动 ID 即节点 Key + List parentUserTaskKeyList = new ArrayList<>(); + parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId())); + // 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序 + List historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list(); + // 数据清洗,将回滚导致的脏数据清洗掉 + List lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); + // 此时历史任务实例为倒序,获取最后走的节点 + List targetIds = new ArrayList<>(); + // 循环结束标识,遇到当前目标节点的次数 + int number = 0; + StringBuilder parentHistoricTaskKey = new StringBuilder(); + for (String historicTaskInstanceKey : lastHistoricTaskInstanceList) { + // 当会签时候会出现特殊的,连续都是同一个节点历史数据的情况,这种时候跳过 + if (parentHistoricTaskKey.toString().equals(historicTaskInstanceKey)) { + continue; + } + parentHistoricTaskKey = new StringBuilder(historicTaskInstanceKey); + if (historicTaskInstanceKey.equals(task.getTaskDefinitionKey())) { + number++; + } + // 在数据清洗后,历史节点就是唯一一条从起始到当前节点的历史记录,理论上每个点只会出现一次 + // 在流程中如果出现循环,那么每次循环中间的点也只会出现一次,再出现就是下次循环 + // number == 1,第一次遇到当前节点 + // number == 2,第二次遇到,代表最后一次的循环范围 + if (number == 2) { + break; + } + // 如果当前历史节点,属于父级的节点,说明最后一次经过了这个点,需要退回这个点 + if (parentUserTaskKeyList.contains(historicTaskInstanceKey)) { + targetIds.add(historicTaskInstanceKey); + } + } + + + // 目的获取所有需要被跳转的节点 currentIds + // 取其中一个父级任务,因为后续要么存在公共网关,要么就是串行公共线路 + UserTask oneUserTask = parentUserTaskList.get(0); + // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务 + List runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List runTaskKeyList = new ArrayList<>(); + runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); + // 需驳回任务列表 + List currentIds = new ArrayList<>(); + // 通过父级网关的出口连线,结合 runTaskList 比对,获取需要撤回的任务 + List currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(oneUserTask, runTaskKeyList, null, null); + currentUserTaskList.forEach(item -> currentIds.add(item.getId())); + + + // 规定:并行网关之前节点必须需存在唯一用户任务节点,如果出现多个任务节点,则并行网关节点默认为结束节点,原因为不考虑多对多情况 + if (targetIds.size() > 1 && currentIds.size() > 1) { + throw new ServiceException("任务出现多对多情况,无法撤回"); + } + + // 循环获取那些需要被撤回的节点的ID,用来设置驳回原因 + List currentTaskIds = new ArrayList<>(); + currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { + if (currentId.equals(runTask.getTaskDefinitionKey())) { + currentTaskIds.add(runTask.getId()); + } + })); + // 设置驳回意见 + currentTaskIds.forEach(item -> taskService.addComment(item, task.getProcessInstanceId(), FlowComment.REJECT.getType(), flowTaskVo.getComment())); + + try { + // 如果父级任务多于 1 个,说明当前节点不是并行节点,原因为不考虑多对多情况 + if (targetIds.size() > 1) { + // 1 对 多任务跳转,currentIds 当前节点(1),targetIds 跳转到的节点(多) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()). + moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); + } + // 如果父级任务只有一个,因此当前任务可能为网关中的任务 + if (targetIds.size() == 1) { + // 1 对 1 或 多 对 1 情况,currentIds 当前要跳转的节点列表(1或多),targetIds.get(0) 跳转到的节点(1) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()) + .moveActivityIdsToSingleActivityId(currentIds, targetIds.get(0)).changeState(); + } + } catch (FlowableObjectNotFoundException e) { + throw new ServiceException("未找到流程实例,流程可能已发生变化"); + } catch (FlowableException e) { + throw new ServiceException("无法取消或开始活动"); + } + + } + + /** + * 退回任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void taskReturn(FlowTaskVo flowTaskVo) { + if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { + throw new ServiceException("任务处于挂起状态"); + } + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + // 获取全部节点列表,包含子节点 + Collection allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); + // 获取当前任务节点元素 + FlowElement source = null; + // 获取跳转的节点元素 + FlowElement target = null; + if (allElements != null) { + for (FlowElement flowElement : allElements) { + // 当前任务节点元素 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = flowElement; + } + // 跳转的节点元素 + if (flowElement.getId().equals(flowTaskVo.getTargetKey())) { + target = flowElement; + } + } + } + + // 从当前节点向前扫描 + // 如果存在路线上不存在目标节点,说明目标节点是在网关上或非同一路线上,不可跳转 + // 否则目标节点相对于当前节点,属于串行 + Boolean isSequential = FlowableUtils.iteratorCheckSequentialReferTarget(source, flowTaskVo.getTargetKey(), null, null); + if (!isSequential) { + throw new ServiceException("当前节点相对于目标节点,不属于串行关系,无法回退"); + } + + + // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务 + List runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List runTaskKeyList = new ArrayList<>(); + runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); + // 需退回任务列表 + List currentIds = new ArrayList<>(); + // 通过父级网关的出口连线,结合 runTaskList 比对,获取需要撤回的任务 + List currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(target, runTaskKeyList, null, null); + currentUserTaskList.forEach(item -> currentIds.add(item.getId())); + + // 循环获取那些需要被撤回的节点的ID,用来设置驳回原因 + List currentTaskIds = new ArrayList<>(); + currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { + if (currentId.equals(runTask.getTaskDefinitionKey())) { + currentTaskIds.add(runTask.getId()); + } + })); + // 设置回退意见 + currentTaskIds.forEach(currentTaskId -> taskService.addComment(currentTaskId, task.getProcessInstanceId(), FlowComment.REBACK.getType(), flowTaskVo.getComment())); + + try { + // 1 对 1 或 多 对 1 情况,currentIds 当前要跳转的节点列表(1或多),targetKey 跳转到的节点(1) + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(task.getProcessInstanceId()) + .moveActivityIdsToSingleActivityId(currentIds, flowTaskVo.getTargetKey()).changeState(); + } catch (FlowableObjectNotFoundException e) { + throw new ServiceException("未找到流程实例,流程可能已发生变化"); + } catch (FlowableException e) { + throw new ServiceException("无法取消或开始活动"); + } + } + + + /** + * 获取所有可回退的节点 + * + * @param flowTaskVo + * @return + */ + @Override + public Result findReturnTaskList(FlowTaskVo flowTaskVo) { + // 当前任务 task + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + // 获取流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + // 获取所有节点信息,暂不考虑子流程情况 + Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); + Collection flowElements = process.getFlowElements(); + // 获取当前任务节点元素 + UserTask source = null; + if (flowElements != null) { + for (FlowElement flowElement : flowElements) { + // 类型为用户节点 + if (flowElement.getId().equals(task.getTaskDefinitionKey())) { + source = (UserTask) flowElement; + } + } + } + // 获取节点的所有路线 + List> roads = FlowableUtils.findRoad(source, null, null, null); + // 可回退的节点列表 + List userTaskList = new ArrayList<>(); + for (List road : roads) { + if (userTaskList.size() == 0) { + // 还没有可回退节点直接添加 + userTaskList = road; + } else { + // 如果已有回退节点,则比对取交集部分 + userTaskList.retainAll(road); + } + } + return Result.ok(userTaskList); + } + + /** + * 删除任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + public void deleteTask(FlowTaskVo flowTaskVo) { + // todo 待确认删除任务是物理删除任务 还是逻辑删除,让这个任务直接通过? + taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment()); + } + + /** + * 认领/签收任务 + * 认领以后,这个用户就会成为任务的执行人,任务会从其他成员的任务列表中消失 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void claim(FlowTaskVo flowTaskVo) { + taskService.claim(flowTaskVo.getTaskId(), flowTaskVo.getUserId()); + } + + /** + * 取消认领/签收任务 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void unClaim(FlowTaskVo flowTaskVo) { + taskService.unclaim(flowTaskVo.getTaskId()); + } + + /** + * 委派任务 + * 任务委派只是委派人将当前的任务交给被委派人进行审批,处理任务后又重新回到委派人身上。 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delegateTask(FlowTaskVo flowTaskVo) { + taskService.delegateTask(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); + } + + /** + * 任务归还 + * 被委派人完成任务之后,将任务归还委派人 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void resolveTask(FlowTaskVo flowTaskVo) { + taskService.resolveTask(flowTaskVo.getTaskId()); + } + + + /** + * 转办任务 + * 直接将办理人换成别人,这时任务的拥有者不再是转办人 + * + * @param flowTaskVo 请求实体参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void assignTask(FlowTaskVo flowTaskVo) { + // 直接转派就可以覆盖掉之前的 + taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); +// // 删除指派人重新指派 +// taskService.deleteCandidateUser(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); +// taskService.addCandidateUser(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); +// // 如果要查询转给他人处理的任务,可以同时将OWNER进行设置: +// taskService.setOwner(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); + + } + + /** + * 多实例加签 + * act_ru_task、act_ru_identitylink各生成一条记录 + * + * @param flowTaskVo + */ + @Override + public void addMultiInstanceExecution(FlowTaskVo flowTaskVo) { + managementService.executeCommand(new AddMultiInstanceExecutionCmd(flowTaskVo.getDefId(), flowTaskVo.getInstanceId(), flowTaskVo.getVariables())); + } + + /** + * 多实例减签 + * act_ru_task减1、act_ru_identitylink不变 + * + * @param flowTaskVo + */ + @Override + public void deleteMultiInstanceExecution(FlowTaskVo flowTaskVo) { + managementService.executeCommand(new DeleteMultiInstanceExecutionCmd(flowTaskVo.getCurrentChildExecutionId(), flowTaskVo.getFlag())); + } + + /** + * 我发起的流程 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result myProcess(FlowQueryVo queryVo) { + Page page = new Page<>(); + UserInfo userInfo = (UserInfo)StpUtil.getSession().get("userInfo"); + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .startedBy(userInfo.getUser().getUserId()) + .orderByProcessInstanceStartTime() + .desc(); + List historicProcessInstances = historicProcessInstanceQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + page.setTotal(historicProcessInstanceQuery.count()); + List flowList = new ArrayList<>(); + for (HistoricProcessInstance hisIns : historicProcessInstances) { + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setCreateTime(hisIns.getStartTime()); + flowTask.setFinishTime(hisIns.getEndTime()); + flowTask.setProcInsId(hisIns.getId()); + + // 计算耗时 + if (Objects.nonNull(hisIns.getEndTime())) { + long time = hisIns.getEndTime().getTime() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } else { + long time = System.currentTimeMillis() - hisIns.getStartTime().getTime(); + flowTask.setDuration(getDate(time)); + } + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(hisIns.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setCategory(pd.getCategory()); + flowTask.setProcDefVersion(pd.getVersion()); + // 当前所处流程 + List taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); + if (CollectionUtils.isNotEmpty(taskList)) { + flowTask.setTaskId(taskList.get(0).getId()); + flowTask.setTaskName(taskList.get(0).getName()); + if (StringUtils.isNotBlank(taskList.get(0).getAssignee())) { + // 当前任务节点办理人信息 + UserResp user = userService.detail(taskList.get(0).getAssignee()); + if (Objects.nonNull(user)) { + flowTask.setAssigneeId(user.getUserId()); + flowTask.setAssigneeName(user.getName()); + flowTask.setAssigneeDeptName(StrUtil.isNotBlank(user.getDeptName()) ? user.getDeptName() : ""); + } + } + } else { + List historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); + flowTask.setTaskId(historicTaskInstance.get(0).getId()); + flowTask.setTaskName(historicTaskInstance.get(0).getName()); + if (StringUtils.isNotBlank(historicTaskInstance.get(0).getAssignee())) { + // 当前任务节点办理人信息 + UserResp user = userService.detail(historicTaskInstance.get(0).getAssignee()); + if (Objects.nonNull(user)) { + flowTask.setAssigneeId(user.getUserId()); + flowTask.setAssigneeName(user.getName()); + flowTask.setAssigneeDeptName(StrUtil.isNotBlank(user.getDeptName()) ? user.getDeptName() : ""); + } + } + } + flowList.add(flowTask); + } + page.setRecords(flowList); + return Result.ok(page); + } + + /** + * 取消申请 + * 目前实现方式: 直接将当前流程变更为已完成 + * + * @param flowTaskVo + * @return + */ + @Override + public Result stopProcess(FlowTaskVo flowTaskVo) { + List task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list(); + if (CollectionUtils.isEmpty(task)) { + throw new ServiceException("流程未启动或已执行完成,取消申请失败"); + } + // 获取当前流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(flowTaskVo.getInstanceId()) + .singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); + if (Objects.nonNull(bpmnModel)) { + Process process = bpmnModel.getMainProcess(); + List endNodes = process.findFlowElementsOfType(EndEvent.class, false); + if (CollectionUtils.isNotEmpty(endNodes)) { + // TODO 取消流程为什么要设置流程发起人? +// SysUser loginUser = SecurityUtils.getLoginUser().getUser(); +// Authentication.setAuthenticatedUserId(loginUser.getUserId().toString()); + +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), +// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment()); + // 获取当前流程最后一个节点 + String endId = endNodes.get(0).getId(); + List executions = runtimeService.createExecutionQuery() + .parentId(processInstance.getProcessInstanceId()).list(); + List executionIds = new ArrayList<>(); + executions.forEach(execution -> executionIds.add(execution.getId())); + // 变更流程为已结束状态 + runtimeService.createChangeActivityStateBuilder() + .moveExecutionsToSingleActivityId(executionIds, endId).changeState(); + } + } + + return Result.ok(); + } + + /** + * 撤回流程 目前存在错误 + * + * @param flowTaskVo + * @return + */ + @Override + public Result revokeProcess(FlowTaskVo flowTaskVo) { + Task task = taskService.createTaskQuery() + .processInstanceId(flowTaskVo.getInstanceId()) + .singleResult(); + if (task == null) { + throw new ServiceException("流程未启动或已执行完成,无法撤回"); + } + + UserInfo userInfo = (UserInfo)StpUtil.getSession().get("userInfo"); + List htiList = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .orderByTaskCreateTime() + .asc() + .list(); + String myTaskId = null; + for (HistoricTaskInstance hti : htiList) { + if (userInfo.getUser().getUserId().toString().equals(hti.getAssignee())) { + myTaskId = hti.getId(); + break; + } + } + if (null == myTaskId) { + throw new ServiceException("该任务非当前用户提交,无法撤回"); + } + List historicTaskInstanceList = historyService + .createHistoricTaskInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .orderByHistoricTaskInstanceStartTime() + .asc() + .list(); + Iterator it = historicTaskInstanceList.iterator(); + //循环节点,获取当前节点的上一节点的key + String tarKey = ""; + while (it.hasNext()) { + HistoricTaskInstance his = it.next(); + if (!task.getTaskDefinitionKey().equals(his.getTaskDefinitionKey())) { + tarKey = his.getTaskDefinitionKey(); + } + } + // 跳转节点 + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(flowTaskVo.getInstanceId()) + .moveActivityIdTo(task.getTaskDefinitionKey(), tarKey) + .changeState(); + + return Result.ok(); + } + + /** + * 代办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result todoList(FlowQueryVo queryVo) { + Page page = new Page<>(); + // 只查看自己的数据 + UserInfo userInfo = (UserInfo)StpUtil.getSession().get("userInfo"); + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .taskCandidateGroupIn(userInfo.getRoles().stream().map(role -> role.getRoleId().toString()).collect(Collectors.toList())) + .taskCandidateOrAssigned(userInfo.getUser().getUserId().toString()) + .orderByTaskCreateTime().desc(); + +// TODO 传入名称查询不到数据? + if (StringUtils.isNotBlank(queryVo.getName())) { + taskQuery.processDefinitionNameLike(queryVo.getName()); + } + page.setTotal(taskQuery.count()); + List taskList = taskQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + List flowList = new ArrayList<>(); + for (Task task : taskList) { + FlowTaskDto flowTask = new FlowTaskDto(); + // 当前流程信息 + flowTask.setTaskId(task.getId()); + flowTask.setTaskDefKey(task.getTaskDefinitionKey()); + flowTask.setCreateTime(task.getCreateTime()); + flowTask.setProcDefId(task.getProcessDefinitionId()); + flowTask.setExecutionId(task.getExecutionId()); + flowTask.setTaskName(task.getName()); + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(task.getProcessInstanceId()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + UserResp startUser = userService.detail(historicProcessInstance.getStartUserId()); + flowTask.setStartUserId(startUser.getUserId().toString()); + flowTask.setStartUserName(startUser.getName()); + flowTask.setStartDeptName(StrUtil.isNotBlank(startUser.getDeptName()) ? startUser.getDeptName() : ""); + flowList.add(flowTask); + } + + page.setRecords(flowList); + return Result.ok(page); + } + + + /** + * 已办任务列表 + * + * @param queryVo 请求参数 + * @return + */ + @Override + public Result finishedList(FlowQueryVo queryVo) { + Page page = new Page<>(); + UserInfo userInfo = (UserInfo)StpUtil.getSession().get("userInfo"); + HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .includeProcessVariables() + .finished() + .taskAssignee(userInfo.getUser().getUserId().toString()) + .orderByHistoricTaskInstanceEndTime() + .desc(); + List historicTaskInstanceList = taskInstanceQuery.listPage(queryVo.getPageSize() * (queryVo.getPageNum() - 1), queryVo.getPageSize()); + List hisTaskList = new ArrayList<>(); + for (HistoricTaskInstance histTask : historicTaskInstanceList) { + FlowTaskDto flowTask = new FlowTaskDto(); + // 当前流程信息 + flowTask.setTaskId(histTask.getId()); + // 审批人员信息 + flowTask.setCreateTime(histTask.getCreateTime()); + flowTask.setFinishTime(histTask.getEndTime()); + flowTask.setDuration(getDate(histTask.getDurationInMillis())); + flowTask.setProcDefId(histTask.getProcessDefinitionId()); + flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); + flowTask.setTaskName(histTask.getName()); + + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(histTask.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(histTask.getProcessInstanceId()); + flowTask.setHisProcInsId(histTask.getProcessInstanceId()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(histTask.getProcessInstanceId()) + .singleResult(); + UserResp startUser = userService.detail(historicProcessInstance.getStartUserId()); + flowTask.setStartUserId(startUser.getUserId()); + flowTask.setStartUserName(startUser.getName()); + flowTask.setStartDeptName(StrUtil.isNotBlank(startUser.getDeptName()) ? startUser.getDeptName() : ""); + hisTaskList.add(flowTask); + } + page.setTotal(taskInstanceQuery.count()); + page.setRecords(hisTaskList); + return Result.ok(page); + } + + private static Predicate distinctByKey(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); + } + + /** + * 流程历史流转记录 + * + * @param procInsId 流程实例Id + * @return + */ + @Override + public Result flowRecord(String procInsId, String deployId) { + Map map = new HashMap(); + if (StringUtils.isNotBlank(procInsId)) { + List list = historyService + .createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .orderByHistoricActivityInstanceStartTime() + .desc().list(); + List hisFlowList = new ArrayList<>(); + for (HistoricActivityInstance histIns : list) { + // 展示开始节点 +// if ("startEvent".equals(histIns.getActivityType())) { +// FlowTaskDto flowTask = new FlowTaskDto(); +// // 流程发起人信息 +// HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() +// .processInstanceId(histIns.getProcessInstanceId()) +// .singleResult(); +// SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); +// flowTask.setTaskName(startUser.getNickName() + "(" + startUser.getDept().getDeptName() + ")发起申请"); +// flowTask.setFinishTime(histIns.getEndTime()); +// hisFlowList.add(flowTask); +// } else if ("endEvent".equals(histIns.getActivityType())) { +// FlowTaskDto flowTask = new FlowTaskDto(); +// flowTask.setTaskName(StringUtils.isNotBlank(histIns.getActivityName()) ? histIns.getActivityName() : "结束"); +// flowTask.setFinishTime(histIns.getEndTime()); +// hisFlowList.add(flowTask); +// } else + if (StringUtils.isNotBlank(histIns.getTaskId())) { + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setTaskId(histIns.getTaskId()); + flowTask.setTaskName(histIns.getActivityName()); + flowTask.setCreateTime(histIns.getStartTime()); + flowTask.setFinishTime(histIns.getEndTime()); + if (StringUtils.isNotBlank(histIns.getAssignee())) { + UserResp sysUser = userService.detail(histIns.getAssignee()); + flowTask.setAssigneeId(sysUser.getUserId()); + flowTask.setAssigneeName(sysUser.getName()); + flowTask.setDeptName(StrUtil.isNotBlank(sysUser.getDeptName()) ? sysUser.getDeptName() : ""); + } + // 展示审批人员 + List linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); + StringBuilder stringBuilder = new StringBuilder(); + for (HistoricIdentityLink identityLink : linksForTask) { + // 获选人,候选组/角色(多个) + if ("candidate".equals(identityLink.getType())) { + if (StringUtils.isNotBlank(identityLink.getUserId())) { + UserResp sysUser = userService.detail(identityLink.getUserId()); + stringBuilder.append(sysUser.getName()).append(","); + } + if (StringUtils.isNotBlank(identityLink.getGroupId())) { + RoleResp sysRole = roleService.detail(identityLink.getGroupId()); + stringBuilder.append(sysRole.getRoleName()).append(","); + } + } + } + if (StringUtils.isNotBlank(stringBuilder)) { + flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); + } + + flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); + // 获取意见评论内容 + List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { + if (histIns.getTaskId().equals(comment.getTaskId())) { + flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); + } + }); + hisFlowList.add(flowTask); + } + } + map.put("flowList", hisFlowList); + } + // 第一次申请获取初始化表单 + if (StringUtils.isNotBlank(deployId)) { + SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); + if (Objects.isNull(sysForm)) { + return Result.error("请先配置流程表单"); + } + map.put("formData", JSONObject.parseObject(sysForm.getFormContent())); + } + return Result.ok(map); + } + + /** + * 根据任务ID查询挂载的表单信息 + * + * @param taskId 任务Id + * @return + */ + @Override + public Result getTaskForm(String taskId) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(task.getFormKey())); + return Result.ok(sysForm.getFormContent()); + } + + /** + * 获取流程过程图 + * + * @param processId + * @return + */ + @Override + public InputStream diagram(String processId) { + String processDefinitionId; + // 获取当前的流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); + // 如果流程已经结束,则得到结束节点 + if (Objects.isNull(processInstance)) { + HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); + + processDefinitionId = pi.getProcessDefinitionId(); + } else {// 如果流程没有结束,则取当前活动节点 + // 根据流程实例ID获得当前处于活动状态的ActivityId合集 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); + processDefinitionId = pi.getProcessDefinitionId(); + } + + // 获得活动的节点 + List highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); + + List highLightedFlows = new ArrayList<>(); + List highLightedNodes = new ArrayList<>(); + //高亮线 + for (HistoricActivityInstance tempActivity : highLightedFlowList) { + if ("sequenceFlow".equals(tempActivity.getActivityType())) { + //高亮线 + highLightedFlows.add(tempActivity.getActivityId()); + } else { + //高亮节点 + highLightedNodes.add(tempActivity.getActivityId()); + } + } + + //获取流程图 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); + //获取自定义图片生成器 + ProcessDiagramGenerator diagramGenerator = new CustomProcessDiagramGenerator(); + InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodes, highLightedFlows, configuration.getActivityFontName(), + configuration.getLabelFontName(), configuration.getAnnotationFontName(), configuration.getClassLoader(), 1.0, true); + return in; + + } + + /** + * 获取流程执行节点 + * + * @param procInsId 流程实例id + * @return + */ + @Override + public Result getFlowViewer(String procInsId, String executionId) { + List flowViewerList = new ArrayList<>(); + FlowViewerDto flowViewerDto; + // 获取任务开始节点(临时处理方式) + List startNodeList = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .orderByHistoricActivityInstanceStartTime() + .asc().listPage(0, 3); + for (HistoricActivityInstance startInstance : startNodeList) { + if (!"sequenceFlow".equals(startInstance.getActivityType())) { + flowViewerDto = new FlowViewerDto(); + if (!"sequenceFlow".equals(startInstance.getActivityType())) { + flowViewerDto.setKey(startInstance.getActivityId()); + // 根据流程节点处理时间校验改节点是否已完成 + flowViewerDto.setCompleted(!Objects.isNull(startInstance.getEndTime())); + flowViewerList.add(flowViewerDto); + } + } + } + // 历史节点 + List hisActIns = historyService.createHistoricActivityInstanceQuery() + .executionId(executionId) + .orderByHistoricActivityInstanceStartTime() + .asc().list(); + for (HistoricActivityInstance activityInstance : hisActIns) { + if (!"sequenceFlow".equals(activityInstance.getActivityType())) { + flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(activityInstance.getActivityId()); + // 根据流程节点处理时间校验改节点是否已完成 + flowViewerDto.setCompleted(!Objects.isNull(activityInstance.getEndTime())); + flowViewerList.add(flowViewerDto); + } + } + return Result.ok(flowViewerList); + } + + /** + * 获取流程变量 + * + * @param taskId + * @return + */ + @Override + public Result processVariables(String taskId) { + // 流程变量 + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); + if (Objects.nonNull(historicTaskInstance)) { + return Result.ok(historicTaskInstance.getProcessVariables()); + } else { + Map variables = taskService.getVariables(taskId); + return Result.ok(variables); + } + } + + /** + * 审批任务获取下一节点 + * + * @param flowTaskVo 任务 + * @return + */ + @Override + public Result getNextFlowNode(FlowTaskVo flowTaskVo) { + // Step 1. 获取当前节点并找到下一步节点 + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + return Result.error("任务不存在或已被审批!"); + } + // Step 2. 获取当前流程所有流程变量(网关节点时需要校验表达式) + Map variables = taskService.getVariables(task.getId()); + List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, variables); + if (CollectionUtils.isEmpty(nextUserTask)) { + return Result.ok("流程已完结!"); + } + return getFlowAttribute(nextUserTask); + } + + /** + * 发起流程获取下一节点 + * + * @param flowTaskVo 任务 + * @return + */ + @Override + public Result getNextFlowNodeByStart(FlowTaskVo flowTaskVo) { + // Step 1. 查找流程定义信息 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(flowTaskVo.getDeploymentId()).singleResult(); + if (Objects.isNull(processDefinition)) { + return Result.error("流程信息不存在!"); + } + // Step 2. 获取下一任务节点(网关节点时需要校验表达式) + List nextUserTask = FindNextNodeUtil.getNextUserTasksByStart(repositoryService, processDefinition, flowTaskVo.getVariables()); + if (CollectionUtils.isEmpty(nextUserTask)) { + return Result.error("暂未查找到下一任务,请检查流程设计是否正确!"); + } + return getFlowAttribute(nextUserTask); + } + + + /** + * 获取任务节点属性,包含自定义属性等 + * + * @param nextUserTask + */ + private Result getFlowAttribute(List nextUserTask) { + FlowNextDto flowNextDto = new FlowNextDto(); + for (UserTask userTask : nextUserTask) { + MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); + // 会签节点 + if (Objects.nonNull(multiInstance)) { + flowNextDto.setVars(multiInstance.getInputDataItem()); + flowNextDto.setType(ProcessConstants.PROCESS_MULTI_INSTANCE); + flowNextDto.setDataType(ProcessConstants.DYNAMIC); + } else { + // 读取自定义节点属性 判断是否是否需要动态指定任务接收人员、组 + String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); + String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); + flowNextDto.setVars(ProcessConstants.PROCESS_APPROVAL); + flowNextDto.setType(userType); + flowNextDto.setDataType(dataType); + } + } + return Result.ok(flowNextDto); + } + + /** + * 流程初始化表单 + * + * @param deployId + * @return + */ + @Override + public Result flowFormData(String deployId) { + // 第一次申请获取初始化表单 + if (StringUtils.isNotBlank(deployId)) { + SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); + if (Objects.isNull(sysForm)) { + return Result.error("请先配置流程表单!"); + } + return Result.ok(JSONObject.parseObject(sysForm.getFormContent())); + } else { + return Result.error("参数错误!"); + } + } + + /** + * 流程节点信息 + * + * @param procInsId + * @return + */ + @Override + public Result flowXmlAndNode(String procInsId, String deployId) { + try { + List flowViewerList = new ArrayList<>(); + // 获取已经完成的节点 + List listFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .finished() + .list(); + + // 保存已经完成的流程节点编号 + listFinished.forEach(s -> { + FlowViewerDto flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(s.getActivityId()); + flowViewerDto.setCompleted(true); + // 退回节点不进行展示 + if (StringUtils.isBlank(s.getDeleteReason())) { + flowViewerList.add(flowViewerDto); + } + }); + + // 获取代办节点 + List listUnFinished = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .unfinished() + .list(); + + // 保存需要代办的节点编号 + listUnFinished.forEach(s -> { + // 删除已退回节点 + flowViewerList.removeIf(task -> task.getKey().equals(s.getActivityId())); + FlowViewerDto flowViewerDto = new FlowViewerDto(); + flowViewerDto.setKey(s.getActivityId()); + flowViewerDto.setCompleted(false); + flowViewerList.add(flowViewerDto); + }); + Map result = new HashMap(); + // xmlData 数据 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); + InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); + String xmlData = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + result.put("nodeData", flowViewerList); + result.put("xmlData", xmlData); + return Result.ok(result); + } catch (Exception e) { + return Result.error("高亮历史任务失败"); + } + } + + /** + * 流程节点表单 + * + * @param taskId 流程任务编号 + * @return + */ + @Override + public Result flowTaskForm(String taskId) throws Exception { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + // 流程变量 + Map parameters = new HashMap<>(); + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); + if (Objects.nonNull(historicTaskInstance)) { + parameters = historicTaskInstance.getProcessVariables(); + } else { + parameters = taskService.getVariables(taskId); + } + JSONObject oldVariables = JSONObject.parseObject(JSON.toJSONString(parameters.get("formJson"))); + List oldFields = JSON.parseObject(JSON.toJSONString(oldVariables.get("widgetList")), new TypeReference>() { + }); + // 设置已填写的表单为禁用状态 + for (JSONObject oldField : oldFields) { + JSONObject options = oldField.getJSONObject("options"); + options.put("disabled", true); + } + // TODO 暂时只处理用户任务上的表单 + if (StringUtils.isNotBlank(task.getFormKey())) { + SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(task.getFormKey())); + JSONObject data = JSONObject.parseObject(sysForm.getFormContent()); + List newFields = JSON.parseObject(JSON.toJSONString(data.get("widgetList")), new TypeReference>() { + }); + // 表单回显时 加入子表单信息到流程变量中 + for (JSONObject newField : newFields) { + String key = newField.getString("id"); + // 处理图片上传组件回显问题 + if ("picture-upload".equals(newField.getString("type"))) { + parameters.put(key, new ArrayList<>()); + } else { + parameters.put(key, null); + } + } + oldFields.addAll(newFields); + } + oldVariables.put("widgetList", oldFields); + parameters.put("formJson", oldVariables); + return Result.ok(parameters); + } + + /** + * 流程节点信息 + * + * @param procInsId + * @param elementId + * @return + */ + @Override + public Result flowTaskInfo(String procInsId, String elementId) { + List list = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(procInsId) + .activityId(elementId) + .list(); + // 退回任务后有多条数据 只取待办任务进行展示 + list.removeIf(task -> StringUtils.isNotBlank(task.getDeleteReason())); + if (CollectionUtils.isEmpty(list)) { + return Result.ok(); + } + if (list.size() > 1) { + list.removeIf(task -> Objects.nonNull(task.getEndTime())); + } + HistoricActivityInstance histIns = list.get(0); + FlowTaskDto flowTask = new FlowTaskDto(); + flowTask.setTaskId(histIns.getTaskId()); + flowTask.setTaskName(histIns.getActivityName()); + flowTask.setCreateTime(histIns.getStartTime()); + flowTask.setFinishTime(histIns.getEndTime()); + if (StringUtils.isNotBlank(histIns.getAssignee())) { + UserResp sysUser = userService.detail(histIns.getAssignee()); + flowTask.setAssigneeId(sysUser.getUserId()); + flowTask.setAssigneeName(sysUser.getName()); + flowTask.setDeptName(StrUtil.isNotBlank(sysUser.getDeptName()) ? sysUser.getDeptName() : ""); + + } + // 流程变量信息 +// HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() +// .includeProcessVariables().finished().taskId(histIns.getTaskId()).singleResult(); +// flowTask.setVariables(historicTaskInstance.getProcessVariables()); + + // 展示审批人员 + List linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); + StringBuilder stringBuilder = new StringBuilder(); + for (HistoricIdentityLink identityLink : linksForTask) { + // 获选人,候选组/角色(多个) + if ("candidate".equals(identityLink.getType())) { + if (StringUtils.isNotBlank(identityLink.getUserId())) { + UserResp sysUser = userService.detail(identityLink.getUserId()); + stringBuilder.append(sysUser.getName()).append(","); + } + if (StringUtils.isNotBlank(identityLink.getGroupId())) { + RoleResp sysRole = roleService.detail(identityLink.getGroupId()); + stringBuilder.append(sysRole.getRoleName()).append(","); + } + } + } + if (StringUtils.isNotBlank(stringBuilder)) { + flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); + } + + flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); + // 获取意见评论内容 + List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { + if (histIns.getTaskId().equals(comment.getTaskId())) { + flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); + } + }); + return Result.ok(flowTask); + } + + /** + * 将Object类型的数据转化成Map + * + * @param obj + * @return + * @throws Exception + */ + public Map obj2Map(Object obj) throws Exception { + Map map = new HashMap(); + Field[] fields = obj.getClass().getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + map.put(field.getName(), field.get(obj)); + } + return map; + } + + /** + * 流程完成时间处理 + * + * @param ms + * @return + */ + private String getDate(long ms) { + + long day = ms / (24 * 60 * 60 * 1000); + long hour = (ms / (60 * 60 * 1000) - day * 24); + long minute = ((ms / (60 * 1000)) - day * 24 * 60 - hour * 60); + long second = (ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); + + if (day > 0) { + return day + "天" + hour + "小时" + minute + "分钟"; + } + if (hour > 0) { + return hour + "小时" + minute + "分钟"; + } + if (minute > 0) { + return minute + "分钟"; + } + if (second > 0) { + return second + "秒"; + } else { + return 0 + "秒"; + } + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysDeployFormServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysDeployFormServiceImpl.java new file mode 100644 index 0000000..31a2a0a --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysDeployFormServiceImpl.java @@ -0,0 +1,112 @@ +package com.dite.znpt.flowable.service.impl; + +import java.util.List; +import java.util.Objects; + +import com.dite.znpt.flowable.domain.entity.SysDeployForm; +import com.dite.znpt.flowable.domain.entity.SysForm; +import com.dite.znpt.flowable.service.ISysDeployFormService; +import com.dite.znpt.flowable.mapper.SysDeployFormMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 流程实例关联表单Service业务层处理 + * + * @author Tony + * @date 2021-04-03 + */ +@Service +public class SysDeployFormServiceImpl implements ISysDeployFormService { + + @Autowired + private SysDeployFormMapper sysDeployFormMapper; + + /** + * 查询流程实例关联表单 + * + * @param id 流程实例关联表单ID + * @return 流程实例关联表单 + */ + @Override + public SysDeployForm selectSysDeployFormById(Long id) + { + return sysDeployFormMapper.selectSysDeployFormById(id); + } + + /** + * 查询流程实例关联表单列表 + * + * @param sysDeployForm 流程实例关联表单 + * @return 流程实例关联表单 + */ + @Override + public List selectSysDeployFormList(SysDeployForm sysDeployForm) + { + return sysDeployFormMapper.selectSysDeployFormList(sysDeployForm); + } + + /** + * 新增流程实例关联表单 + * + * @param sysDeployForm 流程实例关联表单 + * @return 结果 + */ + @Override + public int insertSysDeployForm(SysDeployForm sysDeployForm) + { + SysForm sysForm = sysDeployFormMapper.selectSysDeployFormByDeployId(sysDeployForm.getDeployId()); + if (Objects.isNull(sysForm)) { + return sysDeployFormMapper.insertSysDeployForm(sysDeployForm); + }else { + return 1; + } + } + + /** + * 修改流程实例关联表单 + * + * @param sysDeployForm 流程实例关联表单 + * @return 结果 + */ + @Override + public int updateSysDeployForm(SysDeployForm sysDeployForm) + { + return sysDeployFormMapper.updateSysDeployForm(sysDeployForm); + } + + /** + * 批量删除流程实例关联表单 + * + * @param ids 需要删除的流程实例关联表单ID + * @return 结果 + */ + @Override + public int deleteSysDeployFormByIds(Long[] ids) + { + return sysDeployFormMapper.deleteSysDeployFormByIds(ids); + } + + /** + * 删除流程实例关联表单信息 + * + * @param id 流程实例关联表单ID + * @return 结果 + */ + @Override + public int deleteSysDeployFormById(Long id) + { + return sysDeployFormMapper.deleteSysDeployFormById(id); + } + + /** + * 查询流程挂着的表单 + * + * @param deployId + * @return + */ + @Override + public SysForm selectSysDeployFormByDeployId(String deployId) { + return sysDeployFormMapper.selectSysDeployFormByDeployId(deployId); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysExpressionServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysExpressionServiceImpl.java new file mode 100644 index 0000000..546081c --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysExpressionServiceImpl.java @@ -0,0 +1,97 @@ +package com.dite.znpt.flowable.service.impl; + +import com.dite.znpt.flowable.domain.entity.SysExpression; +import com.dite.znpt.flowable.mapper.SysExpressionMapper; +import com.dite.znpt.flowable.service.ISysExpressionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 流程达式Service业务层处理 + * + * @author ruoyi + * @date 2022-12-12 + */ +@Service +public class SysExpressionServiceImpl implements ISysExpressionService +{ + @Autowired + private SysExpressionMapper sysExpressionMapper; + + /** + * 查询流程达式 + * + * @param id 流程达式主键 + * @return 流程达式 + */ + @Override + public SysExpression selectSysExpressionById(Long id) + { + return sysExpressionMapper.selectSysExpressionById(id); + } + + /** + * 查询流程达式列表 + * + * @param sysExpression 流程达式 + * @return 流程达式 + */ + @Override + public List selectSysExpressionList(SysExpression sysExpression) + { + return sysExpressionMapper.selectSysExpressionList(sysExpression); + } + + /** + * 新增流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + @Override + public int insertSysExpression(SysExpression sysExpression) + { + sysExpression.setCreateTime(LocalDateTime.now()); + return sysExpressionMapper.insertSysExpression(sysExpression); + } + + /** + * 修改流程达式 + * + * @param sysExpression 流程达式 + * @return 结果 + */ + @Override + public int updateSysExpression(SysExpression sysExpression) + { + sysExpression.setUpdateTime(LocalDateTime.now()); + return sysExpressionMapper.updateSysExpression(sysExpression); + } + + /** + * 批量删除流程达式 + * + * @param ids 需要删除的流程达式主键 + * @return 结果 + */ + @Override + public int deleteSysExpressionByIds(Long[] ids) + { + return sysExpressionMapper.deleteSysExpressionByIds(ids); + } + + /** + * 删除流程达式信息 + * + * @param id 流程达式主键 + * @return 结果 + */ + @Override + public int deleteSysExpressionById(Long id) + { + return sysExpressionMapper.deleteSysExpressionById(id); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysFormServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysFormServiceImpl.java new file mode 100644 index 0000000..7a3f6ce --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysFormServiceImpl.java @@ -0,0 +1,97 @@ +package com.dite.znpt.flowable.service.impl; + +import java.time.LocalDateTime; +import java.util.List; + +import com.dite.znpt.flowable.domain.entity.SysForm; +import com.dite.znpt.flowable.service.ISysFormService; +import com.dite.znpt.flowable.mapper.SysFormMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 流程表单Service业务层处理 + * + * @author Tony + * @date 2021-04-03 + */ +@Service +public class SysFormServiceImpl implements ISysFormService +{ + @Autowired + private SysFormMapper sysFormMapper; + + /** + * 查询流程表单 + * + * @param formId 流程表单ID + * @return 流程表单 + */ + @Override + public SysForm selectSysFormById(Long formId) + { + return sysFormMapper.selectSysFormById(formId); + } + + /** + * 查询流程表单列表 + * + * @param sysForm 流程表单 + * @return 流程表单 + */ + @Override + public List selectSysFormList(SysForm sysForm) + { + return sysFormMapper.selectSysFormList(sysForm); + } + + /** + * 新增流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + @Override + public int insertSysForm(SysForm sysForm) + { + sysForm.setCreateTime(LocalDateTime.now()); + return sysFormMapper.insertSysForm(sysForm); + } + + /** + * 修改流程表单 + * + * @param sysForm 流程表单 + * @return 结果 + */ + @Override + public int updateSysForm(SysForm sysForm) + { + sysForm.setUpdateTime(LocalDateTime.now()); + return sysFormMapper.updateSysForm(sysForm); + } + + /** + * 批量删除流程表单 + * + * @param formIds 需要删除的流程表单ID + * @return 结果 + */ + @Override + public int deleteSysFormByIds(Long[] formIds) + { + return sysFormMapper.deleteSysFormByIds(formIds); + } + + /** + * 删除流程表单信息 + * + * @param formId 流程表单ID + * @return 结果 + */ + @Override + public int deleteSysFormById(Long formId) + { + return sysFormMapper.deleteSysFormById(formId); + } +} diff --git a/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysListenerServiceImpl.java b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysListenerServiceImpl.java new file mode 100644 index 0000000..d8de902 --- /dev/null +++ b/flowable/src/main/java/com/dite/znpt/flowable/service/impl/SysListenerServiceImpl.java @@ -0,0 +1,97 @@ +package com.dite.znpt.flowable.service.impl; + +import com.dite.znpt.flowable.domain.entity.SysListener; +import com.dite.znpt.flowable.mapper.SysListenerMapper; +import com.dite.znpt.flowable.service.ISysListenerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 流程监听Service业务层处理 + * + * @author Tony + * @date 2022-12-25 + */ +@Service +public class SysListenerServiceImpl implements ISysListenerService +{ + @Autowired + private SysListenerMapper sysListenerMapper; + + /** + * 查询流程监听 + * + * @param id 流程监听主键 + * @return 流程监听 + */ + @Override + public SysListener selectSysListenerById(Long id) + { + return sysListenerMapper.selectSysListenerById(id); + } + + /** + * 查询流程监听列表 + * + * @param sysListener 流程监听 + * @return 流程监听 + */ + @Override + public List selectSysListenerList(SysListener sysListener) + { + return sysListenerMapper.selectSysListenerList(sysListener); + } + + /** + * 新增流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + @Override + public int insertSysListener(SysListener sysListener) + { + sysListener.setCreateTime(LocalDateTime.now()); + return sysListenerMapper.insertSysListener(sysListener); + } + + /** + * 修改流程监听 + * + * @param sysListener 流程监听 + * @return 结果 + */ + @Override + public int updateSysListener(SysListener sysListener) + { + sysListener.setUpdateTime(LocalDateTime.now()); + return sysListenerMapper.updateSysListener(sysListener); + } + + /** + * 批量删除流程监听 + * + * @param ids 需要删除的流程监听主键 + * @return 结果 + */ + @Override + public int deleteSysListenerByIds(Long[] ids) + { + return sysListenerMapper.deleteSysListenerByIds(ids); + } + + /** + * 删除流程监听信息 + * + * @param id 流程监听主键 + * @return 结果 + */ + @Override + public int deleteSysListenerById(Long id) + { + return sysListenerMapper.deleteSysListenerById(id); + } +} diff --git a/flowable/src/main/resources/mapper/FlowDeployMapper.xml b/flowable/src/main/resources/mapper/FlowDeployMapper.xml new file mode 100644 index 0000000..e42c58e --- /dev/null +++ b/flowable/src/main/resources/mapper/FlowDeployMapper.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/flowable/src/main/resources/mapper/SysDeployFormMapper.xml b/flowable/src/main/resources/mapper/SysDeployFormMapper.xml new file mode 100644 index 0000000..9464e6f --- /dev/null +++ b/flowable/src/main/resources/mapper/SysDeployFormMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + select id, form_id, deploy_id from sys_deploy_form + + + + + + + + + + insert into sys_deploy_form + + form_id, + deploy_id, + + + #{formId}, + #{deployId}, + + + + + update sys_deploy_form + + form_id = #{formId}, + deploy_id = #{deployId}, + + where id = #{id} + + + + delete from sys_deploy_form where id = #{id} + + + + delete from sys_deploy_form where id in + + #{id} + + + \ No newline at end of file diff --git a/flowable/src/main/resources/mapper/SysExpressionMapper.xml b/flowable/src/main/resources/mapper/SysExpressionMapper.xml new file mode 100644 index 0000000..dc64db1 --- /dev/null +++ b/flowable/src/main/resources/mapper/SysExpressionMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + select id, name, expression, data_type,create_time, update_time, create_by, update_by, status, remark from sys_expression + + + + + + + + insert into sys_expression + + name, + expression, + data_type, + create_time, + update_time, + create_by, + update_by, + status, + remark, + + + #{name}, + #{expression}, + #{dataType}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{status}, + #{remark}, + + + + + update sys_expression + + name = #{name}, + expression = #{expression}, + data_type = #{dataType}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + status = #{status}, + remark = #{remark}, + + where id = #{id} + + + + delete from sys_expression where id = #{id} + + + + delete from sys_expression where id in + + #{id} + + + diff --git a/flowable/src/main/resources/mapper/SysFormMapper.xml b/flowable/src/main/resources/mapper/SysFormMapper.xml new file mode 100644 index 0000000..48d5024 --- /dev/null +++ b/flowable/src/main/resources/mapper/SysFormMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + select form_id, form_name, form_content, create_time, update_time, create_by, update_by, remark from sys_form + + + + + + + + insert into sys_form + + form_name, + form_content, + create_time, + update_time, + create_by, + update_by, + remark, + + + #{formName}, + #{formContent}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{remark}, + + + + + update sys_form + + form_name = #{formName}, + form_content = #{formContent}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + remark = #{remark}, + + where form_id = #{formId} + + + + delete from sys_form where form_id = #{formId} + + + + delete from sys_form where form_id in + + #{formId} + + + \ No newline at end of file diff --git a/flowable/src/main/resources/mapper/SysListenerMapper.xml b/flowable/src/main/resources/mapper/SysListenerMapper.xml new file mode 100644 index 0000000..f3c906a --- /dev/null +++ b/flowable/src/main/resources/mapper/SysListenerMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + select id, + name, + type, + event_type, + value_type, + value, + create_time, + update_time, + create_by, + update_by, + status, + remark + from sys_listener + + + + + + + + insert into sys_listener + + name, + type, + event_type, + value_type, + value, + create_time, + update_time, + create_by, + update_by, + status, + remark, + + + #{name}, + #{type}, + #{eventType}, + #{valueType}, + #{value}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{status}, + #{remark}, + + + + + update sys_listener + + name = #{name}, + type = #{type}, + event_type = #{eventType}, + value_type = #{valueType}, + value = #{value}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + status = #{status}, + remark = #{remark}, + + where id = #{id} + + + + delete + from sys_listener + where id = #{id} + + + + delete from sys_listener where id in + + #{id} + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index fc41a56..fcdc462 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ core sip web + flowable pom diff --git a/web/pom.xml b/web/pom.xml index 011cbcf..b0b4501 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -30,6 +30,11 @@ core 1.0.0-SNAPSHOT + + com.dite.znpt + flowable + 1.0.0-SNAPSHOT + diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 83993b1..e3bfcc2 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -20,4 +20,11 @@ spring: matching-strategy: ant_path_matcher main: allow-circular-references: true - allow-bean-definition-overriding: true \ No newline at end of file + allow-bean-definition-overriding: true + +# flowable相关表 +flowable: + # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) + database-schema-update: true + # 关闭定时任务JOB + async-executor-activate: false \ No newline at end of file From adff7de48d14cafc182c03b4b29c1c5b044a692e Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 16 Jul 2025 16:22:05 +0800 Subject: [PATCH 106/143] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/entity/ImageEntity.java | 5 ++++- .../com/dite/znpt/domain/vo/ImageListReq.java | 3 +++ .../java/com/dite/znpt/domain/vo/ImageResp.java | 7 +++---- .../java/com/dite/znpt/service/ImageService.java | 9 +++++++++ .../dite/znpt/service/impl/ImageServiceImpl.java | 15 +++++++++++++++ core/src/main/resources/mapper/ImageMapper.xml | 8 ++++++-- .../dite/znpt/web/controller/ImageController.java | 7 +++++++ 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 2955ab4..3b89da4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -12,7 +12,6 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -117,4 +116,8 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("image_path") private String imagePath; + @ApiModelProperty("是否已审核,0未审核,1已审核") + @TableField("review_state") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index e523da5..1809ea2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -30,4 +30,7 @@ public class ImageListReq implements Serializable { @ApiModelProperty("图像类型") private String[] imageTypes; + @ApiModelProperty("是否已审核,0未审核,1已审核") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 4105c44..d203632 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,15 +1,11 @@ package com.dite.znpt.domain.vo; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.domain.entity.AudioFileInfoEntity; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.List; /** @@ -47,4 +43,7 @@ public class ImageResp implements Serializable { @ApiModelProperty("关联图像的音频列表") private List audioList; + @ApiModelProperty("是否已审核,0未审核,1已审核") + private Boolean reviewState; + } diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index af583a7..01bb42d 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -42,4 +42,13 @@ public interface ImageService extends IService { * @date 2025/06/06 09:44 **/ void linkAppImagesToPart(AppImageToPartReq partReq); + + /** + * 功能描述:审核图片 + * + * @param imageIds 图片id列表 + * @author cuizhibin + * @date 2025/07/16 15:28 + **/ + void reviewImages(List imageIds); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index c47e9c2..ccb6c56 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -441,4 +441,19 @@ public class ImageServiceImpl extends ServiceImpl impl imageCollectService.save(BeanUtil.copyProperties(partReq, ImageCollectEntity.class)); baseMapper.insert(newImageList); } + + /** + * 功能描述:审核图片 + * + * @param imageIds 图片id列表 + * @author cuizhibin + * @date 2025/07/16 15:28 + **/ + @Override + public void reviewImages(List imageIds) { + if (CollUtil.isEmpty(imageIds)) { + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + lambdaUpdate().in(ImageEntity::getImageId, imageIds).set(ImageEntity::getReviewState, "1").update(); + } } diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 580bbd0..e47e4b9 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,7 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -22,6 +22,9 @@ AND i.image_type in #{imageType} + + and i.review_state = #{reviewState} + @@ -31,6 +34,7 @@ + @@ -64,7 +68,7 @@ SELECT i.image_id, i.image_name, i.image_path, i.image_height, i.image_resolution, i.image_width, i.image_height, i.focal_distance, i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, - ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source + ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId} diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 4c3ed4c..9ee105b 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -88,4 +88,11 @@ public class ImageController { imageService.linkAppImagesToPart(partReq); return Result.ok(); } + + @ApiOperation(value = "审核图片", httpMethod = "POST") + @PostMapping("/reviewImages") + public Result reviewImages(@RequestBody List imageIds) { + imageService.reviewImages(imageIds); + return Result.ok(); + } } From 7920080d0ac62c7a29e384ed68667e8ad3abd2e3 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 18 Jul 2025 10:23:56 +0800 Subject: [PATCH 107/143] =?UTF-8?q?=E6=9A=82=E6=97=B6=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/pom.xml b/web/pom.xml index b0b4501..c6d6423 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -30,11 +30,11 @@ core 1.0.0-SNAPSHOT - - com.dite.znpt - flowable - 1.0.0-SNAPSHOT - + + + + + From 45ac0c45ee95bde054db9d2a58c1f85be57fb3f0 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 18 Jul 2025 10:46:07 +0800 Subject: [PATCH 108/143] =?UTF-8?q?=E5=BA=9F=E5=BC=83=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/web/controller/CommonController.java | 4 ++-- .../com/dite/znpt/web/controller/ImageController.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 1edc6e8..75f14fe 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -105,7 +105,7 @@ public class CommonController { return Result.ok(GenderEnum.listAll()); } - @ApiOperation(value = "上传图片", httpMethod = "POST") + @ApiOperation(value = "上传图片-遥控器app使用,已废弃", httpMethod = "POST") @PostMapping("/upload-image/{imageSource}") public Result uploadImage(@PathVariable String imageSource, ImageWorkReq workReq, MultipartFile file) throws IOException { if(null == file){ @@ -114,7 +114,7 @@ public class CommonController { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, new MultipartFile[]{file}).get(0)); } - @ApiOperation(value = "批量上传图片", httpMethod = "POST") + @ApiOperation(value = "批量上传图片-遥控器app使用,已废弃", httpMethod = "POST") @PostMapping("/batch-upload-image/{imageSource}") public Result batchUploadImage(@PathVariable String imageSource, ImageWorkReq workReq, @RequestParam("file") MultipartFile[] files) throws IOException { diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 9ee105b..002a073 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -57,9 +57,9 @@ public class ImageController { @ApiOperation(value = "上传图像", httpMethod = "POST") @PostMapping("/{imageSource}/upload/{partId}") - public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { + public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { MultipartFile[] files = {file}; - return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files).get(0).getImagePath()); + return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files).get(0)); } @ApiOperation(value = "设置信息", httpMethod = "POST") @@ -76,13 +76,13 @@ public class ImageController { return Result.ok(); } - @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "GET") + @ApiOperation(value = "获取APP上传的图片列表-废弃", httpMethod = "GET") @GetMapping("/list/app-upload-images") public Result> listAppUploadImages() throws IOException { return Result.ok(imageService.listAppUploadImages()); } - @ApiOperation(value = "关联APP上传图片到机组", httpMethod = "POST") + @ApiOperation(value = "关联APP上传图片到机组-废弃", httpMethod = "POST") @PostMapping("/linkAppImagesToPart") public Result linkAppImagesToPart(@RequestBody AppImageToPartReq partReq) { imageService.linkAppImagesToPart(partReq); From 477be1154dbf5dce3b8795b496de54d833c32ef7 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 18 Jul 2025 19:59:05 +0800 Subject: [PATCH 109/143] =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/service/impl/ImageServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index ccb6c56..72fe852 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -161,6 +161,7 @@ public class ImageServiceImpl extends ServiceImpl impl String path = temPathPrefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); ImageReq imageReq = imageRespBuilder(path); + imageReq.setImageId(IdUtil.simpleUUID()); BeanUtil.copyProperties(imageReq, imageEntity); list.add(imageReq); imageEntity.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); From 054e30c1b8090f4f71ea6a3453348f35aa6d191b Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Sat, 19 Jul 2025 16:03:46 +0800 Subject: [PATCH 110/143] =?UTF-8?q?feature:1.=E6=96=B0=E5=A2=9E=E9=A2=84?= =?UTF-8?q?=E7=AE=97=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=88=97=E8=A1=A8=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=BC=BA=E5=A4=B1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ProjectBudgetInfoEntity.java | 61 ++++++++++++ .../domain/vo/ProjectBudgetInfoImportReq.java | 38 ++++++++ .../domain/vo/ProjectBudgetInfoListReq.java | 44 +++++++++ .../domain/vo/ProjectBudgetInfoListResp.java | 19 ++++ .../znpt/domain/vo/ProjectBudgetInfoReq.java | 41 +++++++++ .../znpt/domain/vo/ProjectBudgetInfoResp.java | 22 +++++ .../znpt/enums/AttachBusinessTypeEnum.java | 2 + .../com/dite/znpt/enums/BudgeTypeEnum.java | 52 +++++++++++ .../znpt/mapper/ProjectBudgetInfoMapper.java | 20 ++++ .../service/ProjectBudgetInfoService.java | 48 ++++++++++ .../impl/ProjectBudgetInfoServiceImpl.java | 92 +++++++++++++++++++ .../mapper/ProjectBudgetInfoMapper.xml | 49 ++++++++++ .../ProjectBudgetInfoController.java | 48 ++++++++++ 13 files changed, 536 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/BudgeTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectBudgetInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java create mode 100644 core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java new file mode 100644 index 0000000..7b5e4bb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java @@ -0,0 +1,61 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_budget_info") +@ApiModel(value="ProjectBudgetInfoEntity对象", description="项目预算信息表") +public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 514469235298737990L; + + @ExcelProperty("主键") + @ApiModelProperty("主键") + @TableId(value = "budget_id", type = IdType.ASSIGN_ID) + private String budgetId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("预算名称") + @ApiModelProperty("预算名称") + @TableField("budget_name") + private String budgetName; + + @ExcelProperty("预算类型") + @ApiModelProperty("预算类型") + @TableField("budget_type") + private String budgetType; + + @ExcelProperty("预算金额(万元)") + @ApiModelProperty("预算金额(万元)") + @TableField("budget_amount") + private Double budgetAmount; + + @ExcelProperty("预算说明") + @ApiModelProperty("预算说明") + @TableField("budget_desc") + private String budgetDesc; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java new file mode 100644 index 0000000..18d93a7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java @@ -0,0 +1,38 @@ +package com.dite.znpt.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表导入请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表") +public class ProjectBudgetInfoImportReq implements Serializable { + + @Serial + private static final long serialVersionUID = 580212651388155611L; + + + @ExcelProperty(value = "项目名称") + private String projectName; + + @ExcelProperty(value = "预算名称") + private String budgetName; + + @ExcelProperty(value = "预算类型") + private String budgetType; + + @ExcelProperty(value = "预算金额(万元)") + private Double budgetAmount; + + @ExcelProperty(value = "预算说明") + private String budgetDesc; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java new file mode 100644 index 0000000..047b5e9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java @@ -0,0 +1,44 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息请求实体 + */ +@Data +@ApiModel("项目预算信息列表请求实体") +public class ProjectBudgetInfoListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 539751666379021505L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目预算信息Id") + private String budgetId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("预算名称") + private String budgetName; + + @ApiModelProperty("预算类型") + private String budgetType; + + @ApiModelProperty("预算金额(万元)") + private Double budgetAmount; + + @ApiModelProperty("预算说明") + private String budgetDesc; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java new file mode 100644 index 0000000..af0e31b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java @@ -0,0 +1,19 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息列表响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目预算信息列表响应实体") +public class ProjectBudgetInfoListResp extends ProjectBudgetInfoEntity { + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java new file mode 100644 index 0000000..60caa06 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectBudgetInfo请求对象", description="项目预算信息表") +public class ProjectBudgetInfoReq implements Serializable { + + @Serial + private static final long serialVersionUID = 778519049897573879L; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("预算名称") + private String budgetName; + + @ApiModelProperty("预算类型") + private String budgetType; + + @ApiModelProperty("预算金额(万元)") + private Double budgetAmount; + + @ApiModelProperty("预算说明") + private String budgetDesc; + + @ApiModelProperty("附件id") + private String attachId; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java new file mode 100644 index 0000000..70b2d3f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java @@ -0,0 +1,22 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目预算信息响应实体") +public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity { + + @ApiModelProperty("预算类型描述") + private String budgetTypeDesc; +} + diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 096af63..4e008b3 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -17,6 +17,8 @@ public enum AttachBusinessTypeEnum { INSURANCE_FILE("insurance", "保险文件"), MODEL_FILE("model", "模型文件"), DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"), + REPORT("report", "报告"), + PROJECT_BUDGE("project_budge", "预算文件"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/enums/BudgeTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/BudgeTypeEnum.java new file mode 100644 index 0000000..8eeff96 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/BudgeTypeEnum.java @@ -0,0 +1,52 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/5/7 21:22 + * @Description: + */ +@Getter +public enum BudgeTypeEnum { + PROCUREMENT("procurement", "采购"), + ARTIFICIAL("artificial", "人工"), + MANAGEMENT_FEE("managementFee", "管理费"), + ; + + private final String code; + private final String desc; + + BudgeTypeEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static BudgeTypeEnum getByCode(String code){ + for (BudgeTypeEnum e : BudgeTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + BudgeTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(BudgeTypeEnum.values().length); + for (BudgeTypeEnum e : BudgeTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectBudgetInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectBudgetInfoMapper.java new file mode 100644 index 0000000..2dcb73d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectBudgetInfoMapper.java @@ -0,0 +1,20 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp; +import com.dite.znpt.domain.vo.ProjectBudgetInfoResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表数据库访问层 + */ +public interface ProjectBudgetInfoMapper extends BaseMapper { + List queryBySelective(ProjectBudgetInfoListReq projectBudgetInfoReq); + List detailByProjectId(String projectId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java b/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java new file mode 100644 index 0000000..72aa0f0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java @@ -0,0 +1,48 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp; +import com.dite.znpt.domain.vo.ProjectBudgetInfoReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表服务接口 + */ +public interface ProjectBudgetInfoService extends IService { + + /** + * 功能描述:查询项目预算信息列表 + * + * @param projectBudgetInfoReq 项目预算信息 + * @return {@link List }<{@link ProjectBudgetInfoListResp }> + * @author huise23 + * @date 2025/07/17 21:58 + **/ + List selectList(ProjectBudgetInfoListReq projectBudgetInfoReq); + + /** + * 功能描述:根据项目id获取项目预算信息列表 + * + * @param projectId 项目id + * @return {@link List }<{@link ProjectBudgetInfoListResp }> + * @author huise23 + * @date 2025/07/17 21:58 + **/ + List detailByProjectId(String projectId); + + /** + * 功能描述:新增项目预算信息 + * + * @param projectBudgetInfoReq 项目预算信息 + * @author huise23 + * @date 2025/07/17 21:58 + **/ + void saveData(List projectBudgetInfoReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java new file mode 100644 index 0000000..5380782 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java @@ -0,0 +1,92 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp; +import com.dite.znpt.domain.vo.ProjectBudgetInfoReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoResp; +import com.dite.znpt.enums.AttachBusinessTypeEnum; +import com.dite.znpt.enums.BudgeTypeEnum; +import com.dite.znpt.mapper.ProjectBudgetInfoMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.ProjectBudgetInfoService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/17 21:58 + * @Description: 项目预算信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectBudgetInfoServiceImpl extends ServiceImpl implements ProjectBudgetInfoService { + + private final AttachInfoService attachInfoService; + + /** + * 功能描述:查询项目预算信息列表 + * + * @param projectBudgetInfoReq 项目预算信息信息 + * @return {@link List }<{@link ProjectBudgetInfoResp }> + * @author huise23 + * @date 2025/07/17 21:58 + **/ + @Override + public List selectList(ProjectBudgetInfoListReq projectBudgetInfoReq) { + PageUtil.startPage(); + List projectBudgetInfoList= this.baseMapper.queryBySelective(projectBudgetInfoReq); + projectBudgetInfoList.forEach(resp -> { + + }); + return projectBudgetInfoList; + } + + /** + * 功能描述:根据项目id获取项目预算信息列表 + * + * @param projectId 项目id + * @return {@link List }<{@link ProjectBudgetInfoListResp }> + * @author huise23 + * @date 2025/07/17 21:58 + **/ + @Override + public List detailByProjectId(String projectId) { + List projectBudgetInfoList= this.baseMapper.detailByProjectId(projectId); + projectBudgetInfoList.forEach(resp -> { + resp.setBudgetTypeDesc(BudgeTypeEnum.getDescByCode(resp.getBudgetType())); + }); + return projectBudgetInfoList; + } + + /** + * 功能描述:新增项目预算信息 + * + * @param projectBudgetInfoReq 项目预算信息 + * @author huise23 + * @date 2025/07/17 21:58 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveData(List projectBudgetInfoReq) { + List list = new ArrayList<>(); + for (ProjectBudgetInfoReq req : projectBudgetInfoReq) { + ProjectBudgetInfoEntity info = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class); + info.setBudgetId(IdUtil.simpleUUID()); + attachInfoService.updateBusinessIdByAttachIds(info.getBudgetId(), ListUtil.of(req.getAttachId()), AttachBusinessTypeEnum.PROJECT_BUDGE); + list.add(info); + } + lambdaUpdate().eq(ProjectBudgetInfoEntity::getProjectId, list.get(0).getProjectId()).remove(); + baseMapper.insert(list); + } + +} diff --git a/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml new file mode 100644 index 0000000..5425a2b --- /dev/null +++ b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml @@ -0,0 +1,49 @@ + + + + + + a.budget_id, a.project_id, a.budget_name, a.budget_type, + a.budget_amount, a.budget_desc, a.update_by, a.create_time, + a.create_by, a.update_time + + + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java new file mode 100644 index 0000000..3771898 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java @@ -0,0 +1,48 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp; +import com.dite.znpt.domain.vo.ProjectBudgetInfoReq; +import com.dite.znpt.domain.vo.ProjectBudgetInfoResp; +import com.dite.znpt.service.ProjectBudgetInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/17 21:55 + */ +@Api(tags = "项目预算信息") +@RestController +@RequestMapping("/project-budget-info") +public class ProjectBudgetInfoController { + @Resource + private ProjectBudgetInfoService projectBudgetInfoService; + + @ApiOperation(value = "获取项目预算信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectBudgetInfoListReq projectBudgetInfoReq) { + return PageResult.ok(projectBudgetInfoService.selectList(projectBudgetInfoReq)); + } + + @ApiOperation(value = "根据项目id获取项目预算信息列表", httpMethod = "GET") + @GetMapping("/detail/{projectId}") + public PageResult detailByProjectId(@PathVariable String projectId) { + return PageResult.ok(projectBudgetInfoService.detailByProjectId(projectId)); + } + + @ApiOperation(value = "保存项目预算信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody List projectBudgetInfoReq) { + projectBudgetInfoService.saveData(projectBudgetInfoReq); + return Result.ok(); + } +} + From fad1ab81b55c7f4adea674ae617fb7db46ba8239 Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Mon, 21 Jul 2025 21:20:49 +0800 Subject: [PATCH 111/143] =?UTF-8?q?=E5=90=88=E5=90=8C=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=8C=E7=BC=BA=E5=86=85=E5=AE=B9=EF=BC=8C=E5=85=88=E4=B8=8A?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/ContractEntity.java | 110 ++++++++++++++++++ .../entity/ContractSettlementEntity.java | 105 +++++++++++++++++ .../znpt/domain/vo/ContractImportReq.java | 77 ++++++++++++ .../dite/znpt/domain/vo/ContractListReq.java | 76 ++++++++++++ .../com/dite/znpt/domain/vo/ContractReq.java | 80 +++++++++++++ .../com/dite/znpt/domain/vo/ContractResp.java | 39 +++++++ .../vo/ContractSettlementImportReq.java | 74 ++++++++++++ .../domain/vo/ContractSettlementListReq.java | 73 ++++++++++++ .../znpt/domain/vo/ContractSettlementReq.java | 79 +++++++++++++ .../domain/vo/ContractSettlementResp.java | 20 ++++ .../com/dite/znpt/mapper/ContractMapper.java | 19 +++ .../znpt/mapper/ContractSettlementMapper.java | 19 +++ .../dite/znpt/service/ContractService.java | 65 +++++++++++ .../service/ContractSettlementService.java | 47 ++++++++ .../service/impl/ContractServiceImpl.java | 103 ++++++++++++++++ .../impl/ContractSettlementServiceImpl.java | 76 ++++++++++++ .../main/resources/mapper/ContractMapper.xml | 74 ++++++++++++ .../mapper/ContractSettlementMapper.xml | 69 +++++++++++ .../web/controller/ContractController.java | 85 ++++++++++++++ .../ContractSettlementController.java | 42 +++++++ 20 files changed, 1332 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ContractSettlementEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ContractMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ContractSettlementMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ContractService.java create mode 100644 core/src/main/java/com/dite/znpt/service/ContractSettlementService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ContractSettlementServiceImpl.java create mode 100644 core/src/main/resources/mapper/ContractMapper.xml create mode 100644 core/src/main/resources/mapper/ContractSettlementMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ContractController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ContractSettlementController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java new file mode 100644 index 0000000..3f1627d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ContractEntity.java @@ -0,0 +1,110 @@ +package com.dite.znpt.domain.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("contract") +@ApiModel(value="ContractEntity对象", description="合同表") +public class ContractEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 782007452634989148L; + + @ExcelProperty("合同id") + @ApiModelProperty("合同id") + @TableId(value = "contract_id", type = IdType.ASSIGN_ID) + private String contractId; + + @ExcelProperty("客户名称") + @ApiModelProperty("客户名称") + @TableField("customer") + private String customer; + + @ExcelProperty("合同编号") + @ApiModelProperty("合同编号") + @TableField("code") + private String code; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("业务员id") + @ApiModelProperty("业务员id") + @TableField("salesperson_id") + private String salespersonId; + + @ExcelProperty("部门id") + @ApiModelProperty("部门id") + @TableField("department_id") + private String departmentId; + + @ExcelProperty("签订日期") + @ApiModelProperty("签订日期") + @TableField("sign_date") + private Date signDate; + + @ExcelProperty("期限") + @ApiModelProperty("期限") + @TableField("duration") + private String duration; + + @ExcelProperty("类型") + @ApiModelProperty("类型") + @TableField("type") + private String type; + + @ExcelProperty("产品或服务") + @ApiModelProperty("产品或服务") + @TableField("product_service") + private String productService; + + @ExcelProperty("付款日期/交付日期") + @ApiModelProperty("付款日期/交付日期") + @TableField("payment_date") + private Date paymentDate; + + @ExcelProperty("付款地址/交付地址") + @ApiModelProperty("付款地址/交付地址") + @TableField("payment_address") + private String paymentAddress; + + @ExcelProperty("金额") + @ApiModelProperty("金额") + @TableField("amount") + private BigDecimal amount; + + @ExcelProperty("收款账号") + @ApiModelProperty("收款账号") + @TableField("account_number") + private String accountNumber; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("notes") + private String notes; + + @ExcelProperty("合同状态") + @ApiModelProperty("合同状态") + @TableField("contract_status") + private String contractStatus; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ContractSettlementEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ContractSettlementEntity.java new file mode 100644 index 0000000..bd93291 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ContractSettlementEntity.java @@ -0,0 +1,105 @@ +package com.dite.znpt.domain.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同结算表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("contract_settlement") +@ApiModel(value="ContractSettlementEntity对象", description="合同结算表") +public class ContractSettlementEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -59751771276704650L; + + @ExcelProperty("合同结算id") + @ApiModelProperty("合同结算id") + @TableId(value = "settlement_id", type = IdType.ASSIGN_ID) + private String settlementId; + + @ExcelProperty("合同id") + @ApiModelProperty("合同id") + @TableField("contract_id") + private String contractId; + + @ExcelProperty("客户/供应商名称") + @ApiModelProperty("客户/供应商名称") + @TableField("customer") + private String customer; + + @ExcelProperty("合同结算编号") + @ApiModelProperty("合同结算编号") + @TableField("code") + private String code; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("业务员id") + @ApiModelProperty("业务员id") + @TableField("salesperson_id") + private String salespersonId; + + @ExcelProperty("部门id") + @ApiModelProperty("部门id") + @TableField("department_id") + private String departmentId; + + @ExcelProperty("账期") + @ApiModelProperty("账期") + @TableField("payment_period") + private Date paymentPeriod; + + @ExcelProperty("日期") + @ApiModelProperty("日期") + @TableField("payment_date") + private Date paymentDate; + + @ExcelProperty("期限") + @ApiModelProperty("期限") + @TableField("duration") + private String duration; + + @ExcelProperty("产品或服务") + @ApiModelProperty("产品或服务") + @TableField("product_service") + private String productService; + + @ExcelProperty("金额") + @ApiModelProperty("金额") + @TableField("amount") + private BigDecimal amount; + + @ExcelProperty("收款账号") + @ApiModelProperty("收款账号") + @TableField("account_number") + private String accountNumber; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("notes") + private String notes; + + @ExcelProperty("合同结算状态") + @ApiModelProperty("合同结算状态") + @TableField("settlement_status") + private String settlementStatus; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractImportReq.java new file mode 100644 index 0000000..e24ee4f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractImportReq.java @@ -0,0 +1,77 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import com.dite.znpt.util.ValidationGroup; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同表导入请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="Contract导入请求对象", description="合同表") +public class ContractImportReq implements Serializable { + + @Serial + private static final long serialVersionUID = 416194686656143643L; + + + @ExcelProperty(value = "客户名称") + private String customer; + + @ExcelProperty(value = "合同编号") + private String code; + + @ExcelProperty(value = "项目名称") + private String projectName; + + @ExcelProperty(value = "业务员名称") + private String salespersonName; + + @ExcelProperty(value = "部门名称") + private String departmentName; + + @ExcelProperty(value = "签订日期") + private Date signDate; + + @ExcelProperty(value = "期限") + private String duration; + + @ExcelProperty(value = "类型") + private String type; + + @ExcelProperty(value = "产品或服务") + private String productService; + + @ExcelProperty(value = "付款日期/交付日期") + private Date paymentDate; + + @ExcelProperty(value = "付款地址/交付地址") + private String paymentAddress; + + @ExcelProperty(value = "金额") + private BigDecimal amount; + + @ExcelProperty(value = "收款账号") + private String accountNumber; + + @ExcelProperty(value = "备注") + private String notes; + + @ExcelProperty(value = "合同状态") + private String contractStatus; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java new file mode 100644 index 0000000..9eb3e7a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java @@ -0,0 +1,76 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同请求实体 + */ +@Data +@ApiModel("合同列表请求实体") +public class ContractListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 188906332887614727L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("合同Id") + private String contractId; + + @ApiModelProperty("客户名称") + private String customer; + + @ApiModelProperty("合同编号") + private String code; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("业务员id") + private String salespersonId; + + @ApiModelProperty("部门id") + private String departmentId; + + @ApiModelProperty("签订日期") + private Date signDate; + + @ApiModelProperty("期限") + private String duration; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("产品或服务") + private String productService; + + @ApiModelProperty("付款日期/交付日期") + private Date paymentDate; + + @ApiModelProperty("付款地址/交付地址") + private String paymentAddress; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("收款账号") + private String accountNumber; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("合同状态") + private String contractStatus; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java new file mode 100644 index 0000000..ace5f90 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractReq.java @@ -0,0 +1,80 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import com.dite.znpt.util.ValidationGroup; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="Contract请求对象", description="合同表") +public class ContractReq implements Serializable { + + @Serial + private static final long serialVersionUID = -42338861509205617L; + + @ApiModelProperty("合同id") + private String contractId; + + @ApiModelProperty("客户名称") + private String customer; + + @ApiModelProperty("合同编号") + private String code; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("业务员id") + private String salespersonId; + + @ApiModelProperty("部门id") + private String departmentId; + + @ApiModelProperty("签订日期") + private Date signDate; + + @ApiModelProperty("期限") + private String duration; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("产品或服务") + private String productService; + + @ApiModelProperty("付款日期/交付日期") + private Date paymentDate; + + @ApiModelProperty("付款地址/交付地址") + private String paymentAddress; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("收款账号") + private String accountNumber; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("合同状态") + private String contractStatus; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java new file mode 100644 index 0000000..f21e2ca --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ContractEntity; + +/** + * @author huise23 + * @date 2025/07/21 20:29 + * @Description: 合同响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("合同响应实体") +public class ContractResp extends ContractEntity { + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("业务员姓名") + private String salespersonName; + + @ApiModelProperty("部门名称") + private String salespersonDeptName; + + @ApiModelProperty("已结算金额") + private BigDecimal settlementAmount; + + @ApiModelProperty("已收款金额") + private BigDecimal receivedAmount; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementImportReq.java new file mode 100644 index 0000000..6c51ead --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementImportReq.java @@ -0,0 +1,74 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import com.dite.znpt.util.ValidationGroup; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同结算表导入请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ContractSettlement导入请求对象", description="合同结算表") +public class ContractSettlementImportReq implements Serializable { + + @Serial + private static final long serialVersionUID = 148613402074177824L; + + + @ExcelProperty(value = "合同名称(不能为空,长度32以内)") + private String contractName; + + @ExcelProperty(value = "客户/供应商名称") + private String customer; + + @ExcelProperty(value = "合同结算编号") + private String code; + + @ExcelProperty(value = "项目名称") + private String projectName; + + @ExcelProperty(value = "业务员名称") + private String salespersonName; + + @ExcelProperty(value = "部门名称") + private String departmentName; + + @ExcelProperty(value = "账期") + private Date paymentPeriod; + + @ExcelProperty(value = "日期") + private Date paymentDate; + + @ExcelProperty(value = "期限") + private String duration; + + @ExcelProperty(value = "产品或服务") + private String productService; + + @ExcelProperty(value = "金额") + private BigDecimal amount; + + @ExcelProperty(value = "收款账号") + private String accountNumber; + + @ExcelProperty(value = "备注") + private String notes; + + @ExcelProperty(value = "合同结算状态") + private String settlementStatus; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementListReq.java new file mode 100644 index 0000000..063b96d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementListReq.java @@ -0,0 +1,73 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同结算请求实体 + */ +@Data +@ApiModel("合同结算列表请求实体") +public class ContractSettlementListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -36243842073737072L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("合同结算Id") + private String settlementId; + + @ApiModelProperty("合同id") + private String contractId; + + @ApiModelProperty("客户/供应商名称") + private String customer; + + @ApiModelProperty("合同结算编号") + private String code; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("业务员id") + private String salespersonId; + + @ApiModelProperty("部门id") + private String departmentId; + + @ApiModelProperty("账期") + private Date paymentPeriod; + + @ApiModelProperty("日期") + private Date paymentDate; + + @ApiModelProperty("期限") + private String duration; + + @ApiModelProperty("产品或服务") + private String productService; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("收款账号") + private String accountNumber; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("合同结算状态") + private String settlementStatus; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementReq.java new file mode 100644 index 0000000..440482a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementReq.java @@ -0,0 +1,79 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.io.Serial; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import com.dite.znpt.util.ValidationGroup; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +/** + * @author huise23 + * @date 2025/07/21 21:13 + * @Description: 合同结算表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ContractSettlement请求对象", description="合同结算表") +public class ContractSettlementReq implements Serializable { + + @Serial + private static final long serialVersionUID = -44768849127704946L; + + @ApiModelProperty("合同结算id") + private String settlementId; + + @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "合同id不能为空") + @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 32, message = "合同id长度不能超过32字符") + @ApiModelProperty("合同id") + private String contractId; + + @ApiModelProperty("客户/供应商名称") + private String customer; + + @ApiModelProperty("合同结算编号") + private String code; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("业务员id") + private String salespersonId; + + @ApiModelProperty("部门id") + private String departmentId; + + @ApiModelProperty("账期") + private Date paymentPeriod; + + @ApiModelProperty("日期") + private Date paymentDate; + + @ApiModelProperty("期限") + private String duration; + + @ApiModelProperty("产品或服务") + private String productService; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("收款账号") + private String accountNumber; + + @ApiModelProperty("备注") + private String notes; + + @ApiModelProperty("合同结算状态") + private String settlementStatus; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementResp.java new file mode 100644 index 0000000..fbd1f36 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractSettlementResp.java @@ -0,0 +1,20 @@ +package com.dite.znpt.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.dite.znpt.domain.entity.ContractSettlementEntity; + +/** + * @author huise23 + * @date 2025/07/21 21:10 + * @Description: 合同结算响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("合同结算响应实体") +public class ContractSettlementResp extends ContractSettlementEntity { +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/ContractMapper.java b/core/src/main/java/com/dite/znpt/mapper/ContractMapper.java new file mode 100644 index 0000000..dd7e123 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ContractMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ContractEntity; +import com.dite.znpt.domain.vo.ContractListReq; +import com.dite.znpt.domain.vo.ContractResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 20:29 + * @Description: 合同表数据库访问层 + */ +public interface ContractMapper extends BaseMapper { + List queryBySelective(ContractListReq contractReq); +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/ContractSettlementMapper.java b/core/src/main/java/com/dite/znpt/mapper/ContractSettlementMapper.java new file mode 100644 index 0000000..d114d52 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ContractSettlementMapper.java @@ -0,0 +1,19 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ContractSettlementEntity; +import com.dite.znpt.domain.vo.ContractSettlementListReq; +import com.dite.znpt.domain.vo.ContractSettlementResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 21:10 + * @Description: 合同结算表数据库访问层 + */ +public interface ContractSettlementMapper extends BaseMapper { + List queryBySelective(ContractSettlementListReq contractSettlementReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/ContractService.java b/core/src/main/java/com/dite/znpt/service/ContractService.java new file mode 100644 index 0000000..25c5464 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ContractService.java @@ -0,0 +1,65 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ContractEntity; +import com.dite.znpt.domain.vo.ContractListReq; +import com.dite.znpt.domain.vo.ContractResp; +import com.dite.znpt.domain.vo.ContractReq; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 20:29 + * @Description: 合同表服务接口 + */ +public interface ContractService extends IService { + + /** + * 功能描述:查询合同列表 + * + * @param contractReq 合同 + * @return {@link List }<{@link ContractResp }> + * @author huise23 + * @date 2025/07/21 20:29 + **/ + List selectList(ContractListReq contractReq); + + /** + * 功能描述:查询单条合同 + * + * @param contractId 合同Id + * @return {@link ContractResp } + * @author huise23 + * @date 2025/07/21 20:29 + **/ + ContractResp selectById(String contractId); + + /** + * 功能描述:新增合同 + * + * @param contractReq 合同 + * @author huise23 + * @date 2025/07/21 20:29 + **/ + void saveData(ContractReq contractReq); + + /** + * 功能描述:更新合同 + * + * @param contractReq 合同 + * @author huise23 + * @date 2025/07/21 20:29 + **/ + void updateData(ContractReq contractReq); + + /** + * 功能描述:删除合同 + * + * @param contractId 合同Id + * @author huise23 + * @date 2025/07/21 20:29 + **/ + void deleteById(String contractId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/ContractSettlementService.java b/core/src/main/java/com/dite/znpt/service/ContractSettlementService.java new file mode 100644 index 0000000..80fd55c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ContractSettlementService.java @@ -0,0 +1,47 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ContractSettlementEntity; +import com.dite.znpt.domain.vo.ContractSettlementListReq; +import com.dite.znpt.domain.vo.ContractSettlementResp; +import com.dite.znpt.domain.vo.ContractSettlementReq; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 21:10 + * @Description: 合同结算表服务接口 + */ +public interface ContractSettlementService extends IService { + + /** + * 功能描述:查询合同结算列表 + * + * @param contractSettlementReq 合同结算 + * @return {@link List }<{@link ContractSettlementResp }> + * @author huise23 + * @date 2025/07/21 21:10 + **/ + List selectList(ContractSettlementListReq contractSettlementReq); + + /** + * 功能描述:查询单条合同结算 + * + * @param settlementId 合同结算Id + * @return {@link ContractSettlementResp } + * @author huise23 + * @date 2025/07/21 21:10 + **/ + ContractSettlementResp selectById(String settlementId); + + /** + * 功能描述:新增合同结算 + * + * @param contractSettlementReq 合同结算 + * @author huise23 + * @date 2025/07/21 21:10 + **/ + void saveData(ContractSettlementReq contractSettlementReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java new file mode 100644 index 0000000..2f830c9 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java @@ -0,0 +1,103 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ContractEntity; +import com.dite.znpt.domain.vo.ContractListReq; +import com.dite.znpt.domain.vo.ContractResp; +import com.dite.znpt.domain.vo.ContractReq; +import com.dite.znpt.service.ContractService; +import com.dite.znpt.mapper.ContractMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 20:29 + * @Description: 合同表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ContractServiceImpl extends ServiceImpl implements ContractService { + + /** + * 功能描述:查询合同列表 + * + * @param contractReq 合同信息 + * @return {@link List }<{@link ContractResp }> + * @author huise23 + * @date 2025/07/21 20:29 + **/ + @Override + public List selectList(ContractListReq contractReq) { + PageUtil.startPage(); + List contractList= this.baseMapper.queryBySelective(contractReq); + contractList.forEach(resp -> { + + }); + return contractList; + } + + /** + * 功能描述:查询单条合同 + * + * @param contractId 合同Id + * @return {@link ContractResp } + * @author huise23 + * @date 2025/07/21 20:29 + **/ + @Override + public ContractResp selectById(String contractId) { + ContractListReq contractReq = new ContractListReq(); + contractReq.setContractId(contractId); + + List list = selectList(contractReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ContractResp(); + } + + /** + * 功能描述:新增合同 + * + * @param contractReq 合同 + * @author huise23 + * @date 2025/07/21 20:29 + **/ + @Override + public void saveData(ContractReq contractReq) { +// todo 校验 + ContractEntity entity = BeanUtil.copyProperties(contractReq, ContractEntity.class); + save(entity); + } + + /** + * 功能描述:更新合同 + * + * @param contractReq 合同 + * @author huise23 + * @date 2025/07/21 20:29 + **/ + @Override + public void updateData(ContractReq contractReq) { +// todo 校验 + ContractEntity entity = BeanUtil.copyProperties(contractReq, ContractEntity.class); + updateById(entity); + } + + /** + * 功能描述:删除合同 + * + * @param contractId 合同Id + * @author huise23 + * @date 2025/07/21 20:29 + **/ + @Override + public void deleteById(String contractId) { +// todo 校验 + removeById(contractId); + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ContractSettlementServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ContractSettlementServiceImpl.java new file mode 100644 index 0000000..6d44287 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ContractSettlementServiceImpl.java @@ -0,0 +1,76 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.ContractSettlementEntity; +import com.dite.znpt.domain.vo.ContractSettlementListReq; +import com.dite.znpt.domain.vo.ContractSettlementResp; +import com.dite.znpt.domain.vo.ContractSettlementReq; +import com.dite.znpt.service.ContractSettlementService; +import com.dite.znpt.mapper.ContractSettlementMapper; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import com.dite.znpt.util.PageUtil; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 21:10 + * @Description: 合同结算表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ContractSettlementServiceImpl extends ServiceImpl implements ContractSettlementService { + + /** + * 功能描述:查询合同结算列表 + * + * @param contractSettlementReq 合同结算信息 + * @return {@link List }<{@link ContractSettlementResp }> + * @author huise23 + * @date 2025/07/21 21:10 + **/ + @Override + public List selectList(ContractSettlementListReq contractSettlementReq) { + PageUtil.startPage(); + List contractSettlementList= this.baseMapper.queryBySelective(contractSettlementReq); + contractSettlementList.forEach(resp -> { + + }); + return contractSettlementList; + } + + /** + * 功能描述:查询单条合同结算 + * + * @param settlementId 合同结算Id + * @return {@link ContractSettlementResp } + * @author huise23 + * @date 2025/07/21 21:10 + **/ + @Override + public ContractSettlementResp selectById(String settlementId) { + ContractSettlementListReq contractSettlementReq = new ContractSettlementListReq(); + contractSettlementReq.setSettlementId(settlementId); + + List list = selectList(contractSettlementReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ContractSettlementResp(); + } + + /** + * 功能描述:新增合同结算 + * + * @param contractSettlementReq 合同结算 + * @author huise23 + * @date 2025/07/21 21:10 + **/ + @Override + public void saveData(ContractSettlementReq contractSettlementReq) { +// todo 校验 + ContractSettlementEntity entity = BeanUtil.copyProperties(contractSettlementReq, ContractSettlementEntity.class); + save(entity); + } + +} diff --git a/core/src/main/resources/mapper/ContractMapper.xml b/core/src/main/resources/mapper/ContractMapper.xml new file mode 100644 index 0000000..182e078 --- /dev/null +++ b/core/src/main/resources/mapper/ContractMapper.xml @@ -0,0 +1,74 @@ + + + + + + a.contract_id, a.customer, a.code, a.project_id, + a.salesperson_id, a.department_id, a.sign_date, a.duration, + a.type, a.product_service, a.payment_date, a.payment_address, + a.amount, a.account_number, a.notes, a.contract_status, + a.create_time, a.create_by, a.update_time, a.update_by + + + + + diff --git a/core/src/main/resources/mapper/ContractSettlementMapper.xml b/core/src/main/resources/mapper/ContractSettlementMapper.xml new file mode 100644 index 0000000..36761c6 --- /dev/null +++ b/core/src/main/resources/mapper/ContractSettlementMapper.xml @@ -0,0 +1,69 @@ + + + + + + a.settlement_id, a.contract_id, a.customer, a.code, + a.project_id, a.salesperson_id, a.department_id, a.payment_period, + a.payment_date, a.duration, a.product_service, a.amount, + a.account_number, a.notes, a.settlement_status, a.create_time, + a.create_by, a.update_time, a.update_by + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ContractController.java b/web/src/main/java/com/dite/znpt/web/controller/ContractController.java new file mode 100644 index 0000000..d62a82a --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ContractController.java @@ -0,0 +1,85 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.constant.Constants; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.ContractEntity; +import com.dite.znpt.domain.vo.ContractListReq; +import com.dite.znpt.domain.vo.ContractReq; +import com.dite.znpt.domain.vo.ContractResp; +import com.dite.znpt.service.ContractService; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 20:29 + */ +@Api(tags = "合同") +@RestController +@RequestMapping("/contract") +public class ContractController { + @Resource + private ContractService contractService; + + @ApiOperation(value = "获取合同列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ContractListReq contractReq) { + return PageResult.ok(contractService.selectList(contractReq)); + } + + @ApiOperation(value = "根据合同Id获取详细信息", httpMethod = "GET") + @GetMapping("/{contractId}") + public Result getInfo(@PathVariable String contractId) { + return Result.ok(contractService.selectById(contractId)); + } + + @ApiOperation(value = "新增合同", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody ContractReq contractReq) { + contractService.saveData(contractReq); + return Result.ok(); + } + + @ApiOperation(value = "修改合同", httpMethod = "PUT") + @PutMapping + public Result edit(@RequestBody ContractReq contractReq) { + contractService.updateData(contractReq); + return Result.ok(); + } + + @ApiOperation(value = "删除合同", httpMethod = "DELETE") + @DeleteMapping("/{contractId}") + public Result remove(@PathVariable String contractId) { + contractService.deleteById(contractId); + return Result.ok(); + } + + @ApiOperation(value = "导出合同", httpMethod = "GET") + @GetMapping("/export") + @ResponseExcel(name = "合同") + public List export(ContractListReq contractReq) { + return contractService.selectList(contractReq); + } + + @ApiOperation(value = "导入合同", httpMethod = "POST") + @PostMapping("/import") + public Result importData(@RequestExcel List dataList, BindingResult bindingResult) { + // JSR 303 校验通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + if (errorMessageList != null && !errorMessageList.isEmpty()) { + return Result.error(Constants.SERVICE_EXCEPTION, "导入失败"); + } + return Result.okM("导入"+dataList.size()+"条数据"); + } +} + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ContractSettlementController.java b/web/src/main/java/com/dite/znpt/web/controller/ContractSettlementController.java new file mode 100644 index 0000000..854895f --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ContractSettlementController.java @@ -0,0 +1,42 @@ +package com.dite.znpt.web.controller; + + +import com.dite.znpt.constant.Constants; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.ContractSettlementEntity; +import com.dite.znpt.domain.vo.ContractSettlementListReq; +import com.dite.znpt.domain.vo.ContractSettlementReq; +import com.dite.znpt.domain.vo.ContractSettlementResp; +import com.dite.znpt.service.ContractSettlementService; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/21 21:11 + */ +@Api(tags = "合同结算") +@RestController +@RequestMapping("/contract-settlement") +public class ContractSettlementController { + @Resource + private ContractSettlementService contractSettlementService; + + @ApiOperation(value = "新增合同结算", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody ContractSettlementReq contractSettlementReq) { + contractSettlementService.saveData(contractSettlementReq); + return Result.ok(); + } + +} + From 4ed5025a3a34b95897bdd19a63a3adc7889fe669 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 21 Jul 2025 22:46:42 +0800 Subject: [PATCH 112/143] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=89=93=E5=8D=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/converts/Converts.java | 4 + .../domain/entity/AttendanceRecordEntity.java | 54 +++++++++++ .../znpt/domain/vo/AttendanceRecordReq.java | 34 +++++++ .../znpt/domain/vo/AttendanceRecordResp.java | 54 +++++++++++ .../znpt/mapper/AttendanceRecordMapper.java | 12 +++ .../znpt/service/AttendanceRecordService.java | 23 +++++ .../impl/AttendanceRecordServiceImpl.java | 93 +++++++++++++++++++ .../AttendanceRecordController.java | 49 ++++++++++ web/src/main/resources/application.yml | 2 +- 9 files changed, 324 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/AttendanceRecordEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/AttendanceRecordMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/AttendanceRecordService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AttendanceRecordServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AttendanceRecordController.java diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index 7154245..9c20029 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -116,5 +116,9 @@ public interface Converts { InspectionReportReportInfo toInspectionReportReportInfo(InspectionReportEntity entity); List toInspectionReportSchemeInfo(List list); + + AttendanceRecordEntity toAttendanceRecordEntity(AttendanceRecordReq req); + + List toAttendanceRecordResp(List list); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttendanceRecordEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttendanceRecordEntity.java new file mode 100644 index 0000000..d6413ee --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttendanceRecordEntity.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 20:51 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("attendance_record") +@ApiModel(value="AttendanceRecordEntity对象", description="打卡记录表") +public class AttendanceRecordEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = 6186237408298557453L; + + @ApiModelProperty("考勤记录id") + @TableId(value = "record_id", type = IdType.ASSIGN_UUID) + private String recordId; + + @ApiModelProperty("考勤人员") + private String userId; + + @ApiModelProperty("记录类型,0-上班,1-下班,2-无效") + private String recordType; + + @ApiModelProperty("考勤日期") + private LocalDate attendanceDate; + + @ApiModelProperty("打卡时间") + private LocalDateTime recordTime; + + @ApiModelProperty("照片") + private String recordImage; + + @ApiModelProperty("打卡地点,经纬度") + private String recordPosition; + + @ApiModelProperty("打卡地点,中文描述") + private String recordPositionLabel; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordReq.java new file mode 100644 index 0000000..e9692f0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordReq.java @@ -0,0 +1,34 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:10 + * @Description: + */ +@Data +@ApiModel("考勤记录请求对象") +public class AttendanceRecordReq implements Serializable { + @Serial + private static final long serialVersionUID = 3567864990724491657L; + + @NotBlank(message = "打卡照片不能为空") + @ApiModelProperty("打卡照片") + private String recordImage; + + @NotBlank(message = "打卡地点不能为空") + @ApiModelProperty("打卡地点,经纬度") + private String recordPosition; + + @ApiModelProperty("打卡地点,中文描述") + private String recordPositionLabel; + + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordResp.java new file mode 100644 index 0000000..22d250a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttendanceRecordResp.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:11 + * @Description: + */ +@Data +@ApiModel("考勤记录响应对象") +public class AttendanceRecordResp implements Serializable { + @Serial + private static final long serialVersionUID = -4158464225924809958L; + + + @ApiModelProperty("考勤记录id") + private String recordId; + + @ApiModelProperty("考勤人员id") + private String userId; + + @ApiModelProperty("考勤人员") + private String name; + + @ApiModelProperty("记录类型, 0-上班,1-下班,2-无效") + private String recordType; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("考勤日期") + private LocalDate attendanceDate; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("打卡时间") + private LocalDateTime recordTime; + + @ApiModelProperty("打卡照片") + private String recordImage; + + @ApiModelProperty("打卡地点,经纬度") + private String recordPosition; + + @ApiModelProperty("打卡地点,中文描述") + private String recordPositionLabel; +} diff --git a/core/src/main/java/com/dite/znpt/mapper/AttendanceRecordMapper.java b/core/src/main/java/com/dite/znpt/mapper/AttendanceRecordMapper.java new file mode 100644 index 0000000..30a0de8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/AttendanceRecordMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.AttendanceRecordEntity; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:19 + * @Description: + */ +public interface AttendanceRecordMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/AttendanceRecordService.java b/core/src/main/java/com/dite/znpt/service/AttendanceRecordService.java new file mode 100644 index 0000000..99bb6eb --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/AttendanceRecordService.java @@ -0,0 +1,23 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.AttendanceRecordEntity; +import com.dite.znpt.domain.vo.AttendanceRecordReq; +import com.dite.znpt.domain.vo.AttendanceRecordResp; +import io.swagger.models.auth.In; + +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:20 + * @Description: + */ +public interface AttendanceRecordService extends IService { + + void save(AttendanceRecordReq req); + + List listToday(String userId); + + List listMonth(String userId, Integer year, Integer month); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttendanceRecordServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttendanceRecordServiceImpl.java new file mode 100644 index 0000000..9d9cc8f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/AttendanceRecordServiceImpl.java @@ -0,0 +1,93 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttendanceRecordEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.AttendanceRecordReq; +import com.dite.znpt.domain.vo.AttendanceRecordResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.AttendanceRecordMapper; +import com.dite.znpt.service.AttendanceRecordService; +import com.dite.znpt.service.UserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:20 + * @Description: + */ +@Service +public class AttendanceRecordServiceImpl extends ServiceImpl implements AttendanceRecordService { + + @Resource + private UserService userService; + @Transactional(rollbackFor = Exception.class) + @Override + public void save(AttendanceRecordReq req) { + AttendanceRecordEntity entity = Converts.INSTANCE.toAttendanceRecordEntity(req); + entity.setUserId(StpUtil.getLoginId().toString()); + List list = this.list(Wrappers.lambdaQuery() + .eq(AttendanceRecordEntity::getUserId, entity.getUserId()) + .eq(AttendanceRecordEntity::getAttendanceDate, LocalDate.now()) + .orderByAsc(AttendanceRecordEntity::getCreateTime) + ); + if(list.isEmpty()){ + entity.setRecordType("0"); + }else { + entity.setRecordType("1"); + List invalidRecordList = list.stream().filter(record -> "1".equals(record.getRecordType())).collect(Collectors.toList()); + invalidRecordList.forEach(record -> { + record.setRecordType("2"); + }); + this.updateBatchById(invalidRecordList); + } + this.save(entity); + } + + @Override + public List listToday(String userId) { + List list = Converts.INSTANCE.toAttendanceRecordResp( + this.list(Wrappers.lambdaQuery() + .eq(AttendanceRecordEntity::getUserId, userId) + .eq(AttendanceRecordEntity::getAttendanceDate, LocalDate.now()) + .orderByAsc(AttendanceRecordEntity::getCreateTime) + ) + ); + UserEntity user = userService.getById(userId); + list.forEach(resp -> { + resp.setName(user.getName()); + }); + return list; + } + + @Override + public List listMonth(String userId, Integer year, Integer month) { + LocalDate beginDate = LocalDate.of(year, month, 1); + LocalDate endDate = beginDate.plusMonths(1L); + List list = Converts.INSTANCE.toAttendanceRecordResp( + this.list(Wrappers.lambdaQuery() + .eq(AttendanceRecordEntity::getUserId, userId) + .ge(AttendanceRecordEntity::getAttendanceDate, beginDate) + .lt(AttendanceRecordEntity::getAttendanceDate, endDate) + .orderByAsc(AttendanceRecordEntity::getCreateTime) + ) + ); + UserEntity user = userService.getById(userId); + list.forEach(resp -> { + resp.setName(user.getName()); + }); + return list; + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/AttendanceRecordController.java b/web/src/main/java/com/dite/znpt/web/controller/AttendanceRecordController.java new file mode 100644 index 0000000..844c3bb --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AttendanceRecordController.java @@ -0,0 +1,49 @@ +package com.dite.znpt.web.controller; + +import cn.dev33.satoken.stp.StpUtil; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.AttendanceRecordReq; +import com.dite.znpt.domain.vo.AttendanceRecordResp; +import com.dite.znpt.service.AttendanceRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: gaoxiong + * @Date: 2025/7/21 21:21 + * @Description: + */ +@Api(tags = "考勤记录") +@RestController +@RequestMapping("/attendance-record") +public class AttendanceRecordController { + @Resource + private AttendanceRecordService attendanceRecordService; + + + @ApiOperation(value = "新增考勤记录", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody AttendanceRecordReq req){ + attendanceRecordService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "查询当天考勤记录", httpMethod = "GET") + @GetMapping("/list-today") + public Result> listToday(){ + String userId = StpUtil.getLoginId().toString(); + return Result.ok(attendanceRecordService.listToday(userId)); + } + + @ApiOperation(value = "按月份查询指定人员考勤记录", httpMethod = "GET") + @GetMapping("/list-month/{year}/{month}") + public Result> listMonth(@PathVariable Integer year, @PathVariable Integer month){ + String userId = StpUtil.getLoginId().toString(); + return Result.ok(attendanceRecordService.listMonth(userId, year, month)); + } +} diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index e3bfcc2..694c057 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -25,6 +25,6 @@ spring: # flowable相关表 flowable: # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) - database-schema-update: true + database-schema-update: false # 关闭定时任务JOB async-executor-activate: false \ No newline at end of file From 55ba50254a2f151ea62f132c368b95990763e2a5 Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Mon, 21 Jul 2025 23:15:03 +0800 Subject: [PATCH 113/143] =?UTF-8?q?1.=E8=BF=9B=E5=BA=A6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A1=B9=E7=9B=AEid=E5=AD=97=E6=AE=B5=202.=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E9=A6=96=E9=A1=B5=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=203.=E9=A1=B9=E7=9B=AE=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=95=B0=E7=BB=9F=E8=AE=A1=204.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=88=91=E7=9A=84=E9=A1=B9=E7=9B=AE=E3=80=81=E6=88=91?= =?UTF-8?q?=E7=9A=84=E4=BB=BB=E5=8A=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/config/YoloModelRegistry.java | 8 +-- .../dite/znpt/domain/entity/DefectEntity.java | 2 + .../znpt/domain/entity/ProjectTaskEntity.java | 4 ++ .../domain/entity/ProjectTaskGroupEntity.java | 4 ++ .../dite/znpt/domain/vo/ProjectListReq.java | 3 ++ .../dite/znpt/domain/vo/ProjectListResp.java | 12 +++++ .../domain/vo/ProjectTaskGroupListReq.java | 3 ++ .../znpt/domain/vo/ProjectTaskGroupReq.java | 5 ++ .../znpt/domain/vo/ProjectTaskGroupResp.java | 2 + .../znpt/domain/vo/ProjectTaskImportReq.java | 4 ++ .../znpt/domain/vo/ProjectTaskListReq.java | 6 +++ .../dite/znpt/domain/vo/ProjectTaskReq.java | 4 ++ .../dite/znpt/domain/vo/ProjectTaskResp.java | 2 + .../znpt/domain/vo/WorkbenchInfoResp.java | 28 ++++++++++ .../dite/znpt/service/WorkbenchService.java | 15 ++++++ .../service/impl/ProjectTaskServiceImpl.java | 1 - .../service/impl/WorkbenchServiceImpl.java | 53 +++++++++++++++++++ .../main/resources/mapper/ProjectMapper.xml | 20 ++++++- .../mapper/ProjectTaskGroupMapper.xml | 8 ++- .../resources/mapper/ProjectTaskMapper.xml | 9 +++- .../web/controller/ProjectController.java | 10 ++++ .../web/controller/ProjectTaskController.java | 10 ++++ .../web/controller/WorkbenchController.java | 34 ++++++++++++ 23 files changed, 237 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/WorkbenchInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/service/WorkbenchService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/WorkbenchServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/WorkbenchController.java diff --git a/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java index 8d3584c..d820dd0 100644 --- a/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java +++ b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java @@ -43,10 +43,10 @@ public class YoloModelRegistry { @PostConstruct public void loadModelsOnStartup() throws OrtException { - List configs = modelConfigMapper.selectList(Wrappers.emptyWrapper()); - for (ModelConfigEntity config : configs) { - loadModel(config); - } +// List configs = modelConfigMapper.selectList(Wrappers.emptyWrapper()); +// for (ModelConfigEntity config : configs) { +// loadModel(config); +// } } public void loadModel(ModelConfigEntity config) throws OrtException { diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java index a4d352a..1921e16 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DefectEntity.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.entity; +import java.io.Serial; import java.math.BigDecimal; import java.io.Serializable; import java.time.LocalDateTime; @@ -23,6 +24,7 @@ import com.alibaba.excel.annotation.ExcelProperty; @ApiModel(value="DefectEntity对象", description="缺陷记录表") public class DefectEntity extends AuditableEntity implements Serializable { + @Serial private static final long serialVersionUID = 721961595098309935L; @ExcelProperty("缺陷id") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java index 3c3560d..e2a25e8 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskEntity.java @@ -81,5 +81,9 @@ public class ProjectTaskEntity extends AuditableEntity implements Serializable { @ApiModelProperty("备注") @TableField("remark") private String remark; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java index 15f38a0..e46c2c7 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectTaskGroupEntity.java @@ -33,5 +33,9 @@ public class ProjectTaskGroupEntity extends AuditableEntity implements Serializa @ApiModelProperty("项目任务组名") @TableField("group_name") private String groupName; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java index 42f55e5..a285e33 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java @@ -41,5 +41,8 @@ public class ProjectListReq implements Serializable { @ApiModelProperty("项目结束日期") private LocalDate endDate; + @ApiModelProperty(value = "用户id", hidden = true) + private String userId; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java index 8947fcc..f0578ef 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java @@ -90,4 +90,16 @@ public class ProjectListResp implements Serializable { @ApiModelProperty(value = "结束时间") private LocalDate endDate; + + @ApiModelProperty(value = "未开始任务数") + private Integer taskPendingCount; + + @ApiModelProperty(value = "进行中任务数") + private Integer taskProgressCount; + + @ApiModelProperty(value = "已完成任务数") + private Integer taskCompleteCount; + + @ApiModelProperty(value = "总任务数") + private Integer taskCount; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java index 26d9076..c203b19 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupListReq.java @@ -29,5 +29,8 @@ public class ProjectTaskGroupListReq implements Serializable { @ApiModelProperty("任务名称/负责人") private String keyword; + @ApiModelProperty("项目id") + private String projectId; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java index 6d91415..c069967 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupReq.java @@ -11,6 +11,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -34,5 +35,9 @@ public class ProjectTaskGroupReq implements Serializable { @Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务组名长度不能超过100字符") @ApiModelProperty("项目任务组名") private String groupName; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目id不能为空") + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java index 14027da..3c1242a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskGroupResp.java @@ -21,5 +21,7 @@ public class ProjectTaskGroupResp extends ProjectTaskGroupEntity { @ApiModelProperty("任务列表") private List taskList; + @ApiModelProperty("项目名称") + private String projectName; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java index bc56499..f647f34 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskImportReq.java @@ -2,6 +2,7 @@ package com.dite.znpt.domain.vo; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -60,4 +61,7 @@ public class ProjectTaskImportReq implements Serializable { @ExcelProperty(value = "备注") private String remark; + + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java index ecca3b6..8e9ac9b 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskListReq.java @@ -65,5 +65,11 @@ public class ProjectTaskListReq implements Serializable { @ApiModelProperty(value = "导出?", hidden = true) private Boolean isExport; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty(value = "用户id", hidden = true) + private String userId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java index 14d6b97..cf66cad 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskReq.java @@ -80,5 +80,9 @@ public class ProjectTaskReq implements Serializable { @ApiModelProperty("备注") private String remark; + + @NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目id不能为空") + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java index 605b3c6..df9696a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectTaskResp.java @@ -23,5 +23,7 @@ public class ProjectTaskResp extends ProjectTaskEntity { @ApiModelProperty("附件列表") private List attachList; + @ApiModelProperty("项目名称") + private String projectName; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/WorkbenchInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/WorkbenchInfoResp.java new file mode 100644 index 0000000..197e778 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/WorkbenchInfoResp.java @@ -0,0 +1,28 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + * @Description: 工作台信息响应实体 + */ +@Data +@ApiModel("工作台信息响应实体") +public class WorkbenchInfoResp { + + @ApiModelProperty("项目数量") + private long projectCount; + + @ApiModelProperty("进行中任务") + private long progressTaskCount; + + @ApiModelProperty("待审核报告数") + private long approvalReportCount; + + @ApiModelProperty("发现缺陷数") + private long findDefectCount; +} + diff --git a/core/src/main/java/com/dite/znpt/service/WorkbenchService.java b/core/src/main/java/com/dite/znpt/service/WorkbenchService.java new file mode 100644 index 0000000..8426f83 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/WorkbenchService.java @@ -0,0 +1,15 @@ +package com.dite.znpt.service; + +import com.dite.znpt.domain.vo.WorkbenchInfoResp; + +public interface WorkbenchService { + + /** + * 功能描述:获取工作台信息 + * + * @return {@link WorkbenchInfoResp } + * @author cuizhibin + * @date 2025/07/21 21:27 + **/ + WorkbenchInfoResp getInfo(); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index 8c26691..16939d8 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -52,7 +52,6 @@ public class ProjectTaskServiceImpl extends ServiceImpl selectList(ProjectTaskListReq projectTaskReq) { - PageUtil.startPage(); List projectTaskList = this.baseMapper.queryBySelective(projectTaskReq); Map> attachMap; if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) { diff --git a/core/src/main/java/com/dite/znpt/service/impl/WorkbenchServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/WorkbenchServiceImpl.java new file mode 100644 index 0000000..75d6821 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/WorkbenchServiceImpl.java @@ -0,0 +1,53 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.dite.znpt.domain.entity.DefectEntity; +import com.dite.znpt.domain.entity.InspectionReportEntity; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.vo.WorkbenchInfoResp; +import com.dite.znpt.service.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class WorkbenchServiceImpl implements WorkbenchService { + private final ProjectService projectService; + private final ProjectTaskService projectTaskService; + private final InspectionReportService inspectionReportService; + private final DefectService defectService; + + @Override + public WorkbenchInfoResp getInfo() { + WorkbenchInfoResp resp = new WorkbenchInfoResp(); + String userId = StpUtil.getLoginIdAsString(); +// 项目数量 + Long projectCount = projectService.lambdaQuery() + .eq(ProjectEntity::getProjectManagerId, userId).or() + .eq(ProjectEntity::getAuditorId, userId).or() + .like(ProjectEntity::getConstructorIds, userId).or() + .eq(ProjectEntity::getQualityOfficerId, userId).or() + .eq(ProjectEntity::getConstructTeamLeaderId, userId) + .count(); + resp.setProjectCount(projectCount); + +// 进行中任务 + Long progressTaskCount = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getMainUserId, userId).or() + .like(ProjectTaskEntity::getUserIds, userId).count(); + resp.setProgressTaskCount(progressTaskCount); + +// 待审核报告数 + Long approvalReportCount = inspectionReportService.lambdaQuery().eq(InspectionReportEntity::getReportAuditor, userId).count(); + resp.setApprovalReportCount(approvalReportCount); + +// 发现缺陷数 + Long findDefectCount = defectService.lambdaQuery() + .eq(DefectEntity::getCreateBy, userId).count(); + resp.setFindDefectCount(findDefectCount); + return resp; + } +} diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 181fd5a..25aabf1 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -2,13 +2,24 @@ diff --git a/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml index e47a1b9..76c368b 100644 --- a/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml +++ b/core/src/main/resources/mapper/ProjectTaskGroupMapper.xml @@ -9,15 +9,19 @@ diff --git a/core/src/main/resources/mapper/ProjectTaskMapper.xml b/core/src/main/resources/mapper/ProjectTaskMapper.xml index a53848b..7b07675 100644 --- a/core/src/main/resources/mapper/ProjectTaskMapper.xml +++ b/core/src/main/resources/mapper/ProjectTaskMapper.xml @@ -11,9 +11,10 @@ diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java index b9068cc..88f58b4 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectController.java @@ -1,6 +1,7 @@ package com.dite.znpt.web.controller; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListResp; @@ -90,5 +91,14 @@ public class ProjectController { } return Result.okM("导入"+dataList.size()+"条数据"); } + + @ApiOperation(value = "查询我的项目", httpMethod = "GET") + @GetMapping("/my") + public Result> my() { + ProjectListReq req = new ProjectListReq(); + req.setUserId(StpUtil.getLoginIdAsString()); + return Result.ok(projectService.list(req)); + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java index cbf1788..b2cd6b3 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java @@ -1,12 +1,14 @@ package com.dite.znpt.web.controller; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.ProjectTaskEntity; import com.dite.znpt.domain.vo.*; import com.dite.znpt.service.ProjectTaskService; +import com.dite.znpt.util.PageUtil; import com.dite.znpt.util.ValidationGroup; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; @@ -34,6 +36,7 @@ public class ProjectTaskController { @ApiOperation(value = "获取项目任务信息列表", httpMethod = "GET") @GetMapping("/list") public PageResult list(ProjectTaskListReq projectTaskReq) { + PageUtil.startPage(); return PageResult.ok(projectTaskService.selectList(projectTaskReq)); } @@ -97,5 +100,12 @@ public class ProjectTaskController { return Result.ok(); } + @ApiOperation(value = "查询我的任务", httpMethod = "GET") + @GetMapping("/my") + public Result> my() { + ProjectTaskListReq req = new ProjectTaskListReq(); + req.setUserId(StpUtil.getLoginIdAsString()); + return Result.ok(projectTaskService.selectList(req)); + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/WorkbenchController.java b/web/src/main/java/com/dite/znpt/web/controller/WorkbenchController.java new file mode 100644 index 0000000..046cff6 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/WorkbenchController.java @@ -0,0 +1,34 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.WeatherTypeListReq; +import com.dite.znpt.domain.vo.WeatherTypeResp; +import com.dite.znpt.domain.vo.WorkbenchInfoResp; +import com.dite.znpt.service.WorkbenchService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author huise23 + * @date 2025/04/11 23:17 + */ +@Api(tags = "工作台") +@RestController +@RequestMapping("/workbench") +@RequiredArgsConstructor +public class WorkbenchController { + + private final WorkbenchService workbenchService; + + @ApiOperation(value = "获取工作台信息", httpMethod = "GET") + @GetMapping("/info") + public Result info() { + return Result.ok(workbenchService.getInfo()); + } + +} From 58ae758ece6510bbadd4eec41a1bb4310e0b5598 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Mon, 21 Jul 2025 23:17:49 +0800 Subject: [PATCH 114/143] =?UTF-8?q?1.=E6=A8=A1=E5=9E=8B=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/config/YoloModelRegistry.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java index d820dd0..8d3584c 100644 --- a/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java +++ b/core/src/main/java/com/dite/znpt/config/YoloModelRegistry.java @@ -43,10 +43,10 @@ public class YoloModelRegistry { @PostConstruct public void loadModelsOnStartup() throws OrtException { -// List configs = modelConfigMapper.selectList(Wrappers.emptyWrapper()); -// for (ModelConfigEntity config : configs) { -// loadModel(config); -// } + List configs = modelConfigMapper.selectList(Wrappers.emptyWrapper()); + for (ModelConfigEntity config : configs) { + loadModel(config); + } } public void loadModel(ModelConfigEntity config) throws OrtException { From 8a75441642a091c22a6515e059eacaeadc203e1f Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Jul 2025 09:25:20 +0800 Subject: [PATCH 115/143] =?UTF-8?q?=E6=96=B0=E5=A2=9Egitea=E9=83=A8?= =?UTF-8?q?=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/web/build/DeployController.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/web/src/main/java/com/dite/znpt/web/build/DeployController.java b/web/src/main/java/com/dite/znpt/web/build/DeployController.java index 193e3bb..fc20ca5 100644 --- a/web/src/main/java/com/dite/znpt/web/build/DeployController.java +++ b/web/src/main/java/com/dite/znpt/web/build/DeployController.java @@ -7,10 +7,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -51,6 +54,41 @@ public class DeployController { return ResponseEntity.ok("部署流程已启动"); } + @ApiOperation(value = "gitea自动部署", httpMethod = "POST") + @PostMapping("/gitea-webhook") + public ResponseEntity handleWebhook(@RequestHeader("X-Gitea-Signature") String signature, + @RequestBody(required = false) byte[] body) { + + // 1. 签名校验 + if (!validSignature(body, signature)) { + throw new RuntimeException("签名错误"); + } + + // 2. 启动部署流程 + startDeployment(); + + return ResponseEntity.ok("部署流程已启动"); + } + + private boolean validSignature(byte[] body, String sigHeader) { + if (sigHeader == null) return false; + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(webhookSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + byte[] hash = mac.doFinal(body); + String computed = "sha256=" + bytesToHex(hash); + return computed.equalsIgnoreCase(sigHeader); + } catch (Exception e) { + return false; + } + } + + private String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) sb.append(String.format("%02x", b)); + return sb.toString(); + } + @ApiOperation(value = "查询自动部署状态", httpMethod = "GET") @GetMapping("/deployment-status") public ResponseEntity getDeploymentStatus() { From b3d8e8dbbc87210b0f3fc849898d91058d7890f9 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Jul 2025 10:16:39 +0800 Subject: [PATCH 116/143] =?UTF-8?q?=E6=B5=8B=E8=AF=95gitea=E9=83=A8?= =?UTF-8?q?=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/main/java/com/dite/znpt/web/build/DeployController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/main/java/com/dite/znpt/web/build/DeployController.java b/web/src/main/java/com/dite/znpt/web/build/DeployController.java index fc20ca5..1d7b3a1 100644 --- a/web/src/main/java/com/dite/znpt/web/build/DeployController.java +++ b/web/src/main/java/com/dite/znpt/web/build/DeployController.java @@ -108,7 +108,7 @@ public class DeployController { @ApiOperation(value = "查询自动部署日志", httpMethod = "GET") @GetMapping("/deployment-log") public ResponseEntity getDeploymentLog( - @RequestParam(defaultValue = "20") int lines) { + @RequestParam(defaultValue = "100") int lines) { try { Path logFile = Path.of(buildDir, "deploy.log"); if (!Files.exists(logFile)) { From f82c9ceb32fcfb1f9b68b0725cec0df4d8ec8224 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Jul 2025 10:23:36 +0800 Subject: [PATCH 117/143] =?UTF-8?q?=E6=B5=8B=E8=AF=95gitea=E9=83=A8?= =?UTF-8?q?=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/web/build/DeployController.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/build/DeployController.java b/web/src/main/java/com/dite/znpt/web/build/DeployController.java index 1d7b3a1..d5b662a 100644 --- a/web/src/main/java/com/dite/znpt/web/build/DeployController.java +++ b/web/src/main/java/com/dite/znpt/web/build/DeployController.java @@ -61,7 +61,7 @@ public class DeployController { // 1. 签名校验 if (!validSignature(body, signature)) { - throw new RuntimeException("签名错误"); + return ResponseEntity.status(403).body("签名验证失败"); } // 2. 启动部署流程 @@ -75,9 +75,8 @@ public class DeployController { try { Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(webhookSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - byte[] hash = mac.doFinal(body); - String computed = "sha256=" + bytesToHex(hash); - return computed.equalsIgnoreCase(sigHeader); + String computed = bytesToHex(mac.doFinal(body)); + return computed.equalsIgnoreCase(sigHeader); // 不区分大小写 } catch (Exception e) { return false; } From 938218016faed0381164ed0d32f4bfddbaea5fab Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 22 Jul 2025 14:55:23 +0800 Subject: [PATCH 118/143] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java | 3 +++ core/src/main/resources/mapper/DefectMapper.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java index f002788..f7f4114 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/DefectListResp.java @@ -19,6 +19,9 @@ public class DefectListResp implements Serializable { @ApiModelProperty("缺陷id") private String defectId; + @ApiModelProperty("图片id") + private String imageId; + @ApiModelProperty("缺陷名称") private String defectName; diff --git a/core/src/main/resources/mapper/DefectMapper.xml b/core/src/main/resources/mapper/DefectMapper.xml index 48f0fdf..d79faf0 100644 --- a/core/src/main/resources/mapper/DefectMapper.xml +++ b/core/src/main/resources/mapper/DefectMapper.xml @@ -5,7 +5,7 @@ diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 75f14fe..62a9c8a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -163,5 +163,11 @@ public class CommonController { return Result.ok(CheckMethodEnum.listAll()); } + @ApiOperation(value = "查询报告状态", httpMethod = "GET") + @GetMapping("/list/report-status") + public Result listReportStatus(){ + return Result.ok(InspectionReportStatusEnum.listAll()); + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java index d43883c..de4906f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/InspectionReportController.java @@ -67,4 +67,11 @@ public class InspectionReportController { inspectionReportService.removeById(reportId); return Result.ok(); } + + @ApiOperation(value = "发布项目机组报告", httpMethod = "POST") + @PutMapping("/publish/{reportId}") + public Result publish(@PathVariable String reportId) { + inspectionReportService.publish(reportId); + return Result.ok(); + } } From a0fd37a74e1b5bbe59be634a5f3f6f6f636402bc Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 23 Jul 2025 14:45:33 +0800 Subject: [PATCH 121/143] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/DefectServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index a3dc96b..f20ee9f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -113,7 +113,7 @@ public class DefectServiceImpl extends ServiceImpl i throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); } image.setImageType(ImageTypeEnum.DEFECT.getCode()); - imageService.save(image); + imageService.updateById(image); DefectEntity defectEntity = Converts.INSTANCE.toDefectEntity(req); defectEntity.setImageId(imageId); defectEntity.setLabelInfo(JSONUtil.toJsonStr(req.getMarkInfo())); @@ -197,7 +197,7 @@ public class DefectServiceImpl extends ServiceImpl i throw new ServiceException(Message.IMAGE_ID_IS_NOT_EXIST); } image.setImageType(ImageTypeEnum.DEFECT.getCode()); - imageService.save(image); + imageService.updateById(image); FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath()); // 写入attach同层级文件夹下 From 02560bc4bf0e64d99c6332eb1460277fcaadc4e9 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 23 Jul 2025 17:27:08 +0800 Subject: [PATCH 122/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java b/core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java index b11acd8..1035ce5 100644 --- a/core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java +++ b/core/src/main/java/com/dite/znpt/aspect/HttpLogAspect.java @@ -31,7 +31,7 @@ public class HttpLogAspect { /** * 自定义切点 */ - @Pointcut("execution(* com.dite.*.controller.*.*(..)) ") + @Pointcut("execution(* com.dite.znpt.web..*(..)) ") public void log() { } From 3fde38da14d28352876e2684736740625b6ad447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Wed, 23 Jul 2025 18:10:22 +0800 Subject: [PATCH 123/143] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/entity/DeptEntity.java | 2 +- .../znpt/domain/entity/EquipmentEntity.java | 52 ++++++++++++++++ .../entity/EquipmentUseRecordEntity.java | 50 ++++++++++++++++ .../dite/znpt/domain/vo/EquipmentListReq.java | 32 ++++++++++ .../com/dite/znpt/domain/vo/EquipmentReq.java | 46 ++++++++++++++ .../dite/znpt/domain/vo/EquipmentResp.java | 41 +++++++++++++ .../domain/vo/EquipmentUseRecordListReq.java | 37 ++++++++++++ .../znpt/domain/vo/EquipmentUseRecordReq.java | 42 +++++++++++++ .../domain/vo/EquipmentUseRecordResp.java | 60 +++++++++++++++++++ .../com/dite/znpt/mapper/EquipmentMapper.java | 12 ++++ .../znpt/mapper/EquipmentUseRecordMapper.java | 12 ++++ .../dite/znpt/service/EquipmentService.java | 12 ++++ .../service/EquipmentUseRecordService.java | 12 ++++ .../service/impl/EquipmentServiceImpl.java | 16 +++++ .../impl/EquipmentUseRecordServiceImpl.java | 17 ++++++ .../web/controller/EquipmentController.java | 26 ++++++++ .../EquipmentUseRecordController.java | 17 ++++++ 17 files changed, 485 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/EquipmentUseRecordEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/EquipmentUseRecordMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/EquipmentService.java create mode 100644 core/src/main/java/com/dite/znpt/service/EquipmentUseRecordService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/EquipmentUseRecordServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java index f523db9..eed55cf 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/DeptEntity.java @@ -21,7 +21,7 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = false) @TableName("dept") -@ApiModel(value="DeptEntity对象", description="表") +@ApiModel(value="DeptEntity对象", description="部门信息表") public class DeptEntity extends AuditableEntity implements Serializable { @Serial private static final long serialVersionUID = -6471015140726790051L; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java new file mode 100644 index 0000000..3d1657d --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java @@ -0,0 +1,52 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:26 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("equipment") +@ApiModel(value="EquipmentEntity对象", description="设备信息表") +public class EquipmentEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = -6665040704562461286L; + + @ApiModelProperty("设备id") + @TableId(type = IdType.ASSIGN_ID) + private String equipmentId; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("设备编码") + private String equipmentCode; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废") + private String equipmentStatus; + + @ApiModelProperty("设备序列号") + private String equipmentSn; + + @ApiModelProperty("当前使用记录id") + private String useRecordId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentUseRecordEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentUseRecordEntity.java new file mode 100644 index 0000000..9611f0f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentUseRecordEntity.java @@ -0,0 +1,50 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:33 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("equipment_use_record") +@ApiModel(value="EquipmentUseRecordEntity对象", description="设备使用记录表") +public class EquipmentUseRecordEntity extends AuditableEntity implements Serializable { + @Serial + private static final long serialVersionUID = -812107257694322222L; + + @ApiModelProperty("设备使用记录id") + @TableId(type = IdType.ASSIGN_UUID) + private String recordId; + + @ApiModelProperty("设备id") + private String equipmentId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("操作类型:0-借用,1-归还") + private String operateType; + + @ApiModelProperty("操作时间") + private LocalDateTime operateTime; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java new file mode 100644 index 0000000..e5e1fe6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java @@ -0,0 +1,32 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:43 + * @description + */ +@Data +@ApiModel("设备信息列表请求") +public class EquipmentListReq implements Serializable { + @Serial + private static final long serialVersionUID = 2407208576252291143L; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备编码") + private String equipmentCode; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废") + private String equipmentStatus; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java new file mode 100644 index 0000000..2a742d6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:43 + * @description + */ +@Data +@ApiModel("设备信息请求对象") +public class EquipmentReq implements Serializable { + @Serial + private static final long serialVersionUID = -1065926558169771082L; + + @ApiModelProperty("设备名称") + @NotBlank(message = "设备名称不能为空") + @Size(max = 100, message = "设备名称长度不能超过100个字") + private String equipmentName; + + @ApiModelProperty("设备编码") + @NotBlank(message = "设备编码不能为空") + @Size(max = 50, message = "设备编码长度不能超过50个字") + private String equipmentCode; + + @ApiModelProperty("设备类型") + @NotBlank(message = "设备类型不能为空") + private String equipmentType; + + @ApiModelProperty("设备型号") + @NotBlank(message = "设备型号不能为空") + @Size(max = 50, message = "设备型号长度不能超过50个字") + private String equipmentModel; + + @ApiModelProperty("设备SN") + @NotBlank(message = "设备SN不能为空") + @Size(max = 50, message = "设备SN长度不能超过50个字") + private String equipmentSn; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java new file mode 100644 index 0000000..b113bb2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java @@ -0,0 +1,41 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:43 + * @description + */ +@Data +@ApiModel("设备信息响应") +public class EquipmentResp implements Serializable { + @Serial + private static final long serialVersionUID = 310447373498622767L; + + @ApiModelProperty("设备ID") + private String equipmentId; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备编码") + private String equipmentCode; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("设备SN") + private String equipmentSn; + + @ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废") + private String equipmentStatus; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordListReq.java new file mode 100644 index 0000000..4111a3a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordListReq.java @@ -0,0 +1,37 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:44 + * @description + */ +@Data +@ApiModel("设备使用记录列表请求") +public class EquipmentUseRecordListReq implements Serializable { + @Serial + private static final long serialVersionUID = -7403000780666506211L; + + @ApiModelProperty("设备ID") + private String equipmentId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("操作类型:0-借用,1-归还") + private String operateType; + + @ApiModelProperty("操作时间") + private LocalDateTime operateTime; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordReq.java new file mode 100644 index 0000000..a074095 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordReq.java @@ -0,0 +1,42 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:44 + * @description + */ +@Data +@ApiModel("设备使用记录请求") +public class EquipmentUseRecordReq implements Serializable { + @Serial + private static final long serialVersionUID = -6615316964696995428L; + + @ApiModelProperty("设备ID") + @NotBlank(message = "设备ID不能为空") + private String equipmentId; + + @ApiModelProperty("用户ID") + @NotBlank(message = "用户ID不能为空") + private String userId; + + @ApiModelProperty("项目ID") + @NotBlank(message = "项目ID不能为空") + private String projectId; + + @ApiModelProperty("操作类型:0-借用,1-归还") + @NotBlank(message = "操作类型不能为空") + private String operateType; + + @Size(max = 200, message = "备注长度不能超过200") + @ApiModelProperty("备注") + private String remark; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordResp.java new file mode 100644 index 0000000..63e1a6a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentUseRecordResp.java @@ -0,0 +1,60 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:44 + * @description + */ +@Data +@ApiModel("设备使用记录响应") +public class EquipmentUseRecordResp implements Serializable { + @Serial + private static final long serialVersionUID = -6673311877391209692L; + + @ApiModelProperty("记录ID") + private String recordId; + + @ApiModelProperty("设备ID") + private String equipmentId; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备编码") + private String equipmentCode; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("设备SN") + private String equipmentSn; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("用户姓名") + private String name; + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("操作类型:0-借用,1-归还") + private String operateType; + + @ApiModelProperty("操作时间") + private LocalDateTime operateTime; +} diff --git a/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java new file mode 100644 index 0000000..e3ca8fc --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.EquipmentEntity; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:38 + * @description + */ +public interface EquipmentMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/EquipmentUseRecordMapper.java b/core/src/main/java/com/dite/znpt/mapper/EquipmentUseRecordMapper.java new file mode 100644 index 0000000..d6f2bb8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/EquipmentUseRecordMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.EquipmentUseRecordEntity; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:38 + * @description + */ +public interface EquipmentUseRecordMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentService.java b/core/src/main/java/com/dite/znpt/service/EquipmentService.java new file mode 100644 index 0000000..7d37550 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/EquipmentService.java @@ -0,0 +1,12 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.EquipmentEntity; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:39 + * @description + */ +public interface EquipmentService extends IService { +} diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentUseRecordService.java b/core/src/main/java/com/dite/znpt/service/EquipmentUseRecordService.java new file mode 100644 index 0000000..2c59514 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/EquipmentUseRecordService.java @@ -0,0 +1,12 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.EquipmentUseRecordEntity; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:40 + * @description + */ +public interface EquipmentUseRecordService extends IService { +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java new file mode 100644 index 0000000..ef0b1a2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java @@ -0,0 +1,16 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.EquipmentEntity; +import com.dite.znpt.mapper.EquipmentMapper; +import com.dite.znpt.service.EquipmentService; +import org.springframework.stereotype.Service; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:39 + * @description + */ +@Service +public class EquipmentServiceImpl extends ServiceImpl implements EquipmentService { +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentUseRecordServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentUseRecordServiceImpl.java new file mode 100644 index 0000000..b2ce01f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentUseRecordServiceImpl.java @@ -0,0 +1,17 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.EquipmentUseRecordEntity; +import com.dite.znpt.mapper.EquipmentUseRecordMapper; +import com.dite.znpt.service.EquipmentUseRecordService; +import org.springframework.stereotype.Service; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:40 + * @description + */ +@Service +public class EquipmentUseRecordServiceImpl extends ServiceImpl implements EquipmentUseRecordService { + +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java new file mode 100644 index 0000000..3ea1abd --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -0,0 +1,26 @@ +package com.dite.znpt.web.controller; + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:41 + * @description + */ +@Api(tags = "设备信息") +@RestController +@RequestMapping("/equipment") +public class EquipmentController { + + @RequestMapping("/list") + public String list() { + return "equipment/list"; + } + + @RequestMapping("/detail") + public String detail() { + return "equipment/detail"; + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java new file mode 100644 index 0000000..c58c408 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java @@ -0,0 +1,17 @@ +package com.dite.znpt.web.controller; + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Bear.G + * @date 2025/7/23/周三 17:41 + * @description + */ +@Api(tags = "设备使用记录") +@RestController +@RequestMapping("/equipment-use-record") +public class EquipmentUseRecordController { + +} From 3c7f8a22d7d12f9a3a6bcb5545dd75ea0e4e08cc Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Jul 2025 09:33:05 +0800 Subject: [PATCH 124/143] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0=E5=BD=B1=E5=83=8F=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=8A=E5=BD=B1=E5=83=8F=E7=B1=BB=E5=9E=8B=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/entity/ImageEntity.java | 4 ++++ .../main/java/com/dite/znpt/domain/vo/ImageCollectReq.java | 6 ++++++ core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java | 6 ++++++ .../com/dite/znpt/service/impl/ImageCollectServiceImpl.java | 2 ++ .../java/com/dite/znpt/service/impl/ImageServiceImpl.java | 6 +++++- core/src/main/resources/mapper/ImageMapper.xml | 6 ++++-- 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 3b89da4..39f69a6 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -112,6 +112,10 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("image_type") private String imageType; + @ApiModelProperty("影像类型描述") + @TableField("image_type_label") + private String imageTypeLabel; + @ApiModelProperty("图片路径") @TableField("image_path") private String imagePath; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java index ec0dc60..68655bf 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageCollectReq.java @@ -63,6 +63,12 @@ public class ImageCollectReq implements Serializable { @ApiModelProperty("来源") private String imageSource; + @ApiModelProperty("图片类型") + private String imageType; + + @ApiModelProperty("图片类型描述") + private String imageTypeLabel; + @ApiModelProperty("图像信息") private List imageList; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index d203632..9c9b376 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -46,4 +46,10 @@ public class ImageResp implements Serializable { @ApiModelProperty("是否已审核,0未审核,1已审核") private Boolean reviewState; + @ApiModelProperty("影像类型,枚举ImageTypeEnum") + private String imageType; + + @ApiModelProperty("影像类型描述") + private String imageTypeLabel; + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index d786566..39871f2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -57,6 +57,8 @@ public class ImageCollectServiceImpl extends ServiceImpl { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); + image.setImageType(req.getImageType()); + image.setImageTypeLabel(req.getImageTypeLabel()); String path = permPathPrefix + image.getImageName(); File file = new File(temPathPrefix.concat(image.getImageName())); if (file.exists()) { diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 72fe852..00467e8 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -77,7 +77,9 @@ public class ImageServiceImpl extends ServiceImpl impl resp.setAudioList(BeanUtil.copyToList(audioMap.get(resp.getImageId()), AudioFileInfoResp.class)); resp.setWeatherLabel(WeatherEnum.getDescByCode(resp.getWeather())); resp.setShootingMethodLabel(ShootingMethodEnum.getDescByCode(resp.getShootingMethod())); - resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); + if (StrUtil.isEmpty(resp.getImageTypeLabel())) { + resp.setImageTypeLabel(ImageTypeEnum.getDescByCode(resp.getImageType())); + } resp.setImageSourceLabel(ImageSourceEnum.getDescByCode(resp.getImageSource())); }); } @@ -167,6 +169,8 @@ public class ImageServiceImpl extends ServiceImpl impl imageEntity.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); imageEntity.setPartId(partId); imageEntity.setCollectId(imageCollect.getCollectId()); + imageEntity.setImageType(collectReq.getImageType()); + imageEntity.setImageTypeLabel(collectReq.getImageTypeLabel()); imageList.add(imageEntity); } catch (Exception e) { e.printStackTrace(); diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index e47e4b9..f90cd53 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,7 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state, i.image_type_label FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -35,6 +35,8 @@ + + @@ -68,7 +70,7 @@ SELECT i.image_id, i.image_name, i.image_path, i.image_height, i.image_resolution, i.image_width, i.image_height, i.focal_distance, i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, - ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state + ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state, i.image_type, i.image_type_label FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId} From 55238c157c676233370ea4904bc4ef342ac45ad2 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Jul 2025 14:57:21 +0800 Subject: [PATCH 125/143] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=84=E5=A4=84=E7=90=86=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E3=80=81=E9=A2=84=E5=A4=84=E7=90=86=E7=8A=B6=E6=80=81=E3=80=81?= =?UTF-8?q?=E9=A1=B9=E7=9B=AEid=202.=E5=A2=9E=E5=8A=A0=E9=A2=84=E5=A4=84?= =?UTF-8?q?=E7=90=86job=EF=BC=8C=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=A6=81=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/config/ExtUtilConfig.java | 2 + .../java/com/dite/znpt/config/Schedule.java | 68 +++++++++++++++++++ .../dite/znpt/domain/bo/PartFullInfoBo.java | 23 ------- .../dite/znpt/domain/entity/ImageEntity.java | 12 ++++ .../dite/znpt/domain/vo/ImageListResp.java | 9 +++ .../com/dite/znpt/domain/vo/ImageResp.java | 8 +++ .../com/dite/znpt/service/PartService.java | 5 +- .../znpt/service/impl/ImageServiceImpl.java | 29 ++++---- .../znpt/service/impl/PartServiceImpl.java | 17 +++-- .../src/main/resources/mapper/ImageMapper.xml | 11 ++- .../com/dite/znpt/web/DiteApplication.java | 2 + web/src/main/resources/application-dev.yml | 6 ++ 12 files changed, 139 insertions(+), 53 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/config/Schedule.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java diff --git a/core/src/main/java/com/dite/znpt/config/ExtUtilConfig.java b/core/src/main/java/com/dite/znpt/config/ExtUtilConfig.java index bef6847..88a5465 100644 --- a/core/src/main/java/com/dite/znpt/config/ExtUtilConfig.java +++ b/core/src/main/java/com/dite/znpt/config/ExtUtilConfig.java @@ -14,6 +14,8 @@ import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "util") public class ExtUtilConfig { + @ApiModelProperty("是否开启预处理job") + private Boolean enableImagePreTreatment; @ApiModelProperty("图片预处理工具路径") private String imagePreTreatmentPath; @ApiModelProperty("报告生成工具路径") diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java new file mode 100644 index 0000000..d3ab3a3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -0,0 +1,68 @@ +package com.dite.znpt.config; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.BooleanUtil; +import com.dite.znpt.domain.entity.ImageEntity; +import com.dite.znpt.domain.vo.PartResp; +import com.dite.znpt.enums.FilePathEnum; +import com.dite.znpt.service.ImageService; +import com.dite.znpt.service.PartService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class Schedule { + + private final ImageService imageService; + private final PartService partService; + private final ExtUtilConfig extUtilConfig; + + /** + * 功能描述:图像预处理,持续运行 + * + * @author cuizhibin + * @date 2025/07/24 14:23 + **/ + @Scheduled(fixedRate = 10_000) + public void imagePreTreatment() { + if (BooleanUtil.isFalse(extUtilConfig.getEnableImagePreTreatment())) { + return; + } + List list = imageService.lambdaQuery().eq(ImageEntity::getPreTreatment, "0") + .isNotNull(ImageEntity::getPartId) + .isNotNull(ImageEntity::getProjectId).list(); + List partIds = list.stream().map(ImageEntity::getPartId).toList(); + Map partRespMap = partService.listInfos(partIds).stream().collect(Collectors.toMap(PartResp::getPartId, Function.identity())); +// 预处理 + List successList = new ArrayList<>(); + for (ImageEntity image : list) { + PartResp partResp = partRespMap.get(image.getPartId()); + FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + String inputFile = pathEnum.getFileAbsolutePath(image.getImagePath()); + String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(partResp.getProjectName()) + .concat(FileUtil.FILE_SEPARATOR).concat(partResp.getTurbineName()) + .concat(FileUtil.FILE_SEPARATOR).concat(partResp.getPartName()); + extUtilConfig.imagePreTreatment(inputFile, outputDir); + String outputFile = outputDir.concat(FileUtil.FILE_SEPARATOR).concat(FileUtil.getName(inputFile)); + boolean preSuccess = FileUtil.exist(outputFile); + if(!preSuccess) { + log.warn("图片预处理失败,图片id:{},路径:{}", image.getImageId(), inputFile); + continue; + } + image.setPreTreatment(true); + image.setPreImagePath(FilePathEnum.IMAGE.getFileDownPath(outputFile)); + successList.add(image); + } + imageService.updateBatchById(successList); + } +} diff --git a/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java b/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java deleted file mode 100644 index e9c3103..0000000 --- a/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.domain.bo; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.domain.entity.PartEntity; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -public class PartFullInfoBo extends PartEntity { - - @ApiModelProperty("机组名称") - private String turbineName; - - @ApiModelProperty("项目id") - private String projectId; - - @ApiModelProperty("机组名称") - private String projectName; - -} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java index 39f69a6..b2108da 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ImageEntity.java @@ -120,8 +120,20 @@ public class ImageEntity extends AuditableEntity implements Serializable { @TableField("image_path") private String imagePath; + @ApiModelProperty("预处理后的图片路径") + @TableField("pre_image_path") + private String preImagePath; + @ApiModelProperty("是否已审核,0未审核,1已审核") @TableField("review_state") private Boolean reviewState; + @ApiModelProperty("是否已预处理,0未审核,1已审核") + @TableField("pre_treatment") + private Boolean preTreatment; + + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index 771dd3a..cadbfbf 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -97,4 +97,13 @@ public class ImageListResp implements Serializable { @ApiModelProperty("关联图像的音频列表") private List audioList; + + @ApiModelProperty("预处理后的图片路径") + private String preImagePath; + + @ApiModelProperty("是否已预处理,0未审核,1已审核") + private Boolean preTreatment; + + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 9c9b376..3b628f1 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -52,4 +52,12 @@ public class ImageResp implements Serializable { @ApiModelProperty("影像类型描述") private String imageTypeLabel; + @ApiModelProperty("预处理后的图片路径") + private String preImagePath; + + @ApiModelProperty("是否已预处理,0未审核,1已审核") + private Boolean preTreatment; + + @ApiModelProperty("项目id") + private String projectId; } diff --git a/core/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java index 1901493..b4db7bd 100644 --- a/core/src/main/java/com/dite/znpt/service/PartService.java +++ b/core/src/main/java/com/dite/znpt/service/PartService.java @@ -1,7 +1,6 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.vo.PartListReq; import com.dite.znpt.domain.vo.PartListResp; @@ -86,8 +85,8 @@ public interface PartService extends IService { /** * 查询完整部件信息,包含机组、项目 * @param partIds - * @return {@link List }<{@link PartFullInfoBo }> + * @return {@link List }<{@link PartResp }> */ - List listInfos(List partIds); + List listInfos(List partIds); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 00467e8..66e0cb3 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -12,7 +12,6 @@ import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; -import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.PartEntity; @@ -114,7 +113,7 @@ public class ImageServiceImpl extends ServiceImpl impl } } }); - this.saveBatch(imageList); + baseMapper.insert(imageList); return imageList; } @@ -139,9 +138,7 @@ public class ImageServiceImpl extends ServiceImpl impl if (StrUtil.isEmpty(imageSource) || Objects.isNull(ImageSourceEnum.getByCode(imageSource))) { throw new ServiceException(Message.IMAGE_SOURCE_IS_NOT_EXIST); } - if(null == partService.getById(partId)){ - throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); - } + PartResp partResp = partService.detail(partId); if(null == files || files.length == 0){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } @@ -168,6 +165,7 @@ public class ImageServiceImpl extends ServiceImpl impl list.add(imageReq); imageEntity.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); imageEntity.setPartId(partId); + imageEntity.setProjectId(partResp.getProjectId()); imageEntity.setCollectId(imageCollect.getCollectId()); imageEntity.setImageType(collectReq.getImageType()); imageEntity.setImageTypeLabel(collectReq.getImageTypeLabel()); @@ -211,10 +209,7 @@ public class ImageServiceImpl extends ServiceImpl impl ImageCollectEntity imageCollect = new ImageCollectEntity(); imageCollect.setCollectId(IdUtil.simpleUUID()); imageCollect.setCollectorName(imageWorkReq.getUploadUser()); - PartEntity part = partService.getById(partId); - if (Objects.isNull(part)) { - throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); - } + PartResp part = partService.detail(partId); List imageList = new ArrayList<>(); result.forEach(path -> { ImageEntity imageEntity = new ImageEntity(); @@ -233,6 +228,7 @@ public class ImageServiceImpl extends ServiceImpl impl imageEntity.setAltitude(imageWorkReq.getAltitude()); imageEntity.setImagePath(path); imageEntity.setPartId(partId); + imageEntity.setProjectId(part.getProjectId()); imageEntity.setCollectId(imageCollect.getCollectId()); imageList.add(imageEntity); }); @@ -254,10 +250,9 @@ public class ImageServiceImpl extends ServiceImpl impl if(CollUtil.isEmpty(imageList)){ imageCollectService.removeById(image.getCollectId()); } - File file = new File(image.getImagePath()); - if (file.exists()) { - FileUtil.del(file); - } + FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + FileUtil.del(pathEnum.getFileAbsolutePath(image.getImagePath())); + FileUtil.del(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath())); } private ImageReq imageRespBuilder(String path) throws Exception { @@ -349,11 +344,11 @@ public class ImageServiceImpl extends ServiceImpl impl .collect(Collectors.toMap(ImageEntity::getImagePath, Function.identity(), (a, b) -> a)); // 查询部件信息 - Map partInfoMap = new HashMap<>(); + Map partInfoMap = new HashMap<>(); CollUtil.split(imageList, 1000).forEach(images -> { List partIds = images.stream().map(ImageEntity::getPartId).collect(Collectors.toList()); - List partList = partService.listInfos(partIds); - partInfoMap.putAll(partList.stream().collect(Collectors.toMap(PartFullInfoBo::getPartId, Function.identity()))); + List partList = partService.listInfos(partIds); + partInfoMap.putAll(partList.stream().collect(Collectors.toMap(PartResp::getPartId, Function.identity()))); }); // 将信息写入返回实体 @@ -367,7 +362,7 @@ public class ImageServiceImpl extends ServiceImpl impl ImageEntity image = imageMap.get(filePath); if (image != null) { BeanUtil.copyProperties(image, resp); - PartFullInfoBo part = partInfoMap.get(image.getPartId()); + PartResp part = partInfoMap.get(image.getPartId()); if (part != null) { resp.setPartId(part.getPartId()); resp.setPartName(part.getPartName()); diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index 1e5ba8c..43e9b92 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.bo.PartFullInfoBo; import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.TurbineEntity; @@ -89,6 +88,9 @@ public class PartServiceImpl extends ServiceImpl impleme @Override public PartResp detail(String partId) { PartEntity entity = this.baseMapper.selectById(partId); + if(null == entity){ + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } PartResp resp = Converts.INSTANCE.toPartResp(entity); if(StrUtil.isNotEmpty(resp.getTurbineId())){ TurbineEntity turbine = turbineService.getById(resp.getTurbineId()); @@ -97,6 +99,7 @@ public class PartServiceImpl extends ServiceImpl impleme if(StrUtil.isNotEmpty(turbine.getProjectId())){ ProjectEntity project = projectService.getById(turbine.getProjectId()); if(null != project){ + resp.setProjectId(resp.getProjectId()); resp.setProjectName(project.getProjectName()); } } @@ -166,18 +169,18 @@ public class PartServiceImpl extends ServiceImpl impleme } @Override - public List listInfos(List partIds) { + public List listInfos(List partIds) { List list = lambdaQuery().in(PartEntity::getPartId, partIds).list(); List turbineList = turbineService.lambdaQuery().in(TurbineEntity::getTurbineId, list.stream().map(PartEntity::getTurbineId).collect(Collectors.toList())).list(); Map turbineMap = turbineList.stream().collect(Collectors.toMap(TurbineEntity::getTurbineId, Function.identity())); Map projectMap = projectService.lambdaQuery().in(ProjectEntity::getProjectId, turbineList.stream().map(TurbineEntity::getProjectId).collect(Collectors.toList())).list() .stream().collect(Collectors.toMap(ProjectEntity::getProjectId, Function.identity())); - return BeanUtil.copyToList(list, PartFullInfoBo.class).stream().peek(partBo -> { - TurbineEntity turbineEntity = turbineMap.get(partBo.getTurbineId()); + return BeanUtil.copyToList(list, PartResp.class).stream().peek(resp -> { + TurbineEntity turbineEntity = turbineMap.get(resp.getTurbineId()); ProjectEntity projectEntity = projectMap.get(turbineEntity.getProjectId()); - partBo.setTurbineName(turbineEntity.getTurbineName()); - partBo.setProjectId(projectEntity.getProjectId()); - partBo.setProjectName(projectEntity.getProjectName()); + resp.setTurbineName(turbineEntity.getTurbineName()); + resp.setProjectId(projectEntity.getProjectId()); + resp.setProjectName(projectEntity.getProjectName()); }).collect(Collectors.toList()); } } diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index f90cd53..f072bb6 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -5,7 +5,8 @@ SELECT i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, - ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state, i.image_type_label + ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state, i.image_type_label, + i.pre_image_path, i.project_id, i.pre_treatment FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id @@ -32,6 +33,9 @@ + + + @@ -67,10 +71,11 @@ + SELECT eq.equipment_id, eq.equipment_name, eq.equipment_type, eq.equipment_model, eq.equipment_sn, eq.equipment_status, eq.use_status, + equr.user_id, u.`name`, equr.project_id, p.project_name + FROM equipment eq + LEFT JOIN equipment_use_record equr ON eq.use_record_id = equr.use_record_id + LEFT JOIN project p ON p.project_id = equr.project_id + LEFT JOIN user u ON u.user_id = equr.user_id + WHERE eq.del_flag = '0' + + AND eq.equipment_name LIKE CONCAT('%', #{req.equipmentName}, '%') + + + AND eq.equipment_type = #{req.equipmentType} + + + AND eq.req.equipment_status = #{req.equipmentStatus} + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/EquipmentUseRecordMapper.xml b/core/src/main/resources/mapper/EquipmentUseRecordMapper.xml new file mode 100644 index 0000000..5cdca38 --- /dev/null +++ b/core/src/main/resources/mapper/EquipmentUseRecordMapper.xml @@ -0,0 +1,34 @@ + + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 62a9c8a..5371ed3 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -169,5 +169,11 @@ public class CommonController { return Result.ok(InspectionReportStatusEnum.listAll()); } + @ApiOperation(value = "查询设备类型", httpMethod = "GET") + @GetMapping("/list/equipment-type") + public Result listEquipmentType(){ + return Result.ok(EquipmentTypeEnum.listAll()); + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java index 3ea1abd..b3318b5 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -1,8 +1,18 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.EquipmentListReq; +import com.dite.znpt.domain.vo.EquipmentReq; +import com.dite.znpt.domain.vo.EquipmentResp; +import com.dite.znpt.service.EquipmentService; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; /** * @author Bear.G @@ -14,13 +24,45 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/equipment") public class EquipmentController { - @RequestMapping("/list") - public String list() { - return "equipment/list"; + @Resource + private EquipmentService equipmentService; + + @ApiOperation(value = "分页查询设备信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(EquipmentListReq req) { + return PageResult.ok(equipmentService.page(req)); } - @RequestMapping("/detail") - public String detail() { - return "equipment/detail"; + @ApiOperation(value = "查询设备信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(EquipmentListReq req) { + return Result.ok(equipmentService.list(req)); + } + + @ApiOperation(value = "查询设备信息详情", httpMethod = "GET") + @GetMapping("/detail/{equipmentId}") + public Result detail(@PathVariable String equipmentId) { + return Result.ok(equipmentService.detail(equipmentId)); + } + + @ApiOperation(value = "新增设备信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody EquipmentReq req){ + equipmentService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改设备信息", httpMethod = "PUT") + @PutMapping("/{equipmentId}") + public Result edit(@PathVariable String equipmentId, @Validated @RequestBody EquipmentReq req){ + equipmentService.update(equipmentId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除设备信息", httpMethod = "DELETE") + @DeleteMapping("/{equipmentId}") + public Result remove(@PathVariable String equipmentId){ + equipmentService.deleteById(equipmentId); + return Result.ok(); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java index c58c408..1fb1774 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentUseRecordController.java @@ -1,8 +1,18 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.EquipmentUseRecordListReq; +import com.dite.znpt.domain.vo.EquipmentUseRecordReq; +import com.dite.znpt.domain.vo.EquipmentUseRecordResp; +import com.dite.znpt.service.EquipmentUseRecordService; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; /** * @author Bear.G @@ -13,5 +23,40 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/equipment-use-record") public class EquipmentUseRecordController { + + @Resource + private EquipmentUseRecordService equipmentUseRecordService; + + @ApiOperation(value = "分页查询设备使用记录列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(EquipmentUseRecordListReq req) { + return PageResult.ok(equipmentUseRecordService.page(req)); + } + + @ApiOperation(value = "查询设备使用记录列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(EquipmentUseRecordListReq req) { + return Result.ok(equipmentUseRecordService.list(req)); + } + + @ApiOperation(value = "查询设备使用记录详情", httpMethod = "GET") + @GetMapping("/detail/{equipmentId}") + public Result> detail(@PathVariable String equipmentId) { + return Result.ok(equipmentUseRecordService.detail(equipmentId)); + } + + @ApiOperation(value = "借用设备", httpMethod = "PUT") + @PutMapping("/borrow/{equipmentId}") + public Result borrowEquipment(@PathVariable String equipmentId, @Validated @RequestBody EquipmentUseRecordReq req){ + equipmentUseRecordService.borrowEquipment(equipmentId,req); + return Result.ok(); + } + + @ApiOperation(value = "归还设备", httpMethod = "PUT") + @PutMapping("/return/{userRecordId}") + public Result returnEquipment(@PathVariable String userRecordId, @Validated @RequestBody EquipmentUseRecordReq req){ + equipmentUseRecordService.returnEquipment(userRecordId, req); + return Result.ok(); + } } From d1603d5b1489d9a5c293683bb45334a66a9a5568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Thu, 24 Jul 2025 17:43:35 +0800 Subject: [PATCH 127/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/service/impl/CertificationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java index f7d57a0..0e99937 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java @@ -66,7 +66,7 @@ public class CertificationServiceImpl extends ServiceImpl Date: Thu, 24 Jul 2025 15:06:43 +0800 Subject: [PATCH 128/143] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=A2=84=E5=A4=84=E7=90=86=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/config/Schedule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index d3ab3a3..8d5d41d 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -49,7 +49,9 @@ public class Schedule { PartResp partResp = partRespMap.get(image.getPartId()); FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; String inputFile = pathEnum.getFileAbsolutePath(image.getImagePath()); - String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(partResp.getProjectName()) + String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() + .concat("已调整") + .concat(FileUtil.FILE_SEPARATOR).concat(partResp.getProjectName()) .concat(FileUtil.FILE_SEPARATOR).concat(partResp.getTurbineName()) .concat(FileUtil.FILE_SEPARATOR).concat(partResp.getPartName()); extUtilConfig.imagePreTreatment(inputFile, outputDir); From 695a32f5ce17ff55ffc650e60e20371d4c6edd85 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Thu, 24 Jul 2025 19:58:01 +0800 Subject: [PATCH 129/143] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87=E5=88=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=8B=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/service/ImageService.java | 2 + .../znpt/service/impl/ImageServiceImpl.java | 72 +++++++++++++++---- .../znpt/web/controller/ImageController.java | 6 ++ 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 01bb42d..4bab57b 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -25,6 +25,8 @@ public interface ImageService extends IService { List batchUploadDefectImage(String partId, String imageSource, ImageCollectReq collectReq, MultipartFile[] files); + List uploadProjectBatch(String projectId, String imageSource, MultipartFile[] files); + List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; void delete(String imageId); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 66e0cb3..347f678 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; @@ -19,12 +20,10 @@ import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageMapper; -import com.dite.znpt.service.AudioFileInfoService; -import com.dite.znpt.service.ImageCollectService; -import com.dite.znpt.service.ImageService; -import com.dite.znpt.service.PartService; +import com.dite.znpt.service.*; import com.dite.znpt.util.EXIFUtil; import com.dite.znpt.util.PageUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,6 +64,9 @@ public class ImageServiceImpl extends ServiceImpl impl private PartService partService; @Autowired private AudioFileInfoService audioFileInfoService; + private ProjectService projectService; + @Autowired + private UserService userService; @Override public List list(ImageListReq req) { @@ -159,11 +161,11 @@ public class ImageServiceImpl extends ServiceImpl impl try { String path = temPathPrefix + file.getOriginalFilename(); FileUtil.writeBytes(file.getBytes(),path); - ImageReq imageReq = imageRespBuilder(path); + String fileDownPath = FilePathEnum.IMAGE_TEMP.getFileDownPath(path); + ImageReq imageReq = imageRespBuilder(path, fileDownPath); imageReq.setImageId(IdUtil.simpleUUID()); BeanUtil.copyProperties(imageReq, imageEntity); list.add(imageReq); - imageEntity.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); imageEntity.setPartId(partId); imageEntity.setProjectId(partResp.getProjectId()); imageEntity.setCollectId(imageCollect.getCollectId()); @@ -180,6 +182,50 @@ public class ImageServiceImpl extends ServiceImpl impl return list; } + @SneakyThrows + @Override + public List uploadProjectBatch(String projectId, String imageSource, MultipartFile[] files) { + if (Objects.isNull(projectService.getById(projectId))) { + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + if(null == files || files.length == 0){ + throw new ServiceException(Message.IMAGE_IS_EMPTY); + } + String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String path_prefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(imageSource).concat(FileUtil.FILE_SEPARATOR) + .concat(projectId).concat(FileUtil.FILE_SEPARATOR) + .concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + if (!FileUtil.exist(path_prefix)) { + FileUtil.mkdir(path_prefix); + } + List list = new ArrayList<>(files.length); + List imageList = new ArrayList<>(); + + ImageCollectEntity imageCollect = new ImageCollectEntity(); + imageCollect.setCollectId(IdUtil.simpleUUID()); + imageCollect.setCollectorId(StpUtil.getLoginIdAsString()); + imageCollect.setCollectorName(userService.getById(StpUtil.getLoginIdAsString()).getName()); + for (MultipartFile multipartFile : files) { + String absolutePath = path_prefix + multipartFile.getOriginalFilename(); + FileUtil.writeBytes(multipartFile.getBytes(),absolutePath); + String fileDownPath = FilePathEnum.IMAGE.getFileDownPath(absolutePath); + ImageEntity imageEntity = new ImageEntity(); + try { + ImageReq imageReq = imageRespBuilder(absolutePath, fileDownPath); + BeanUtil.copyProperties(imageReq, imageEntity); + list.add(imageReq); + imageEntity.setProjectId(projectId); + imageEntity.setCollectId(imageCollect.getCollectId()); + imageList.add(imageEntity); + } catch (Exception e) { + e.printStackTrace(); + } + } + imageCollectService.save(imageCollect); + baseMapper.insert(imageList); + return list; + } + @Override @Transactional(rollbackFor = Exception.class) public List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] files) throws IOException { @@ -213,9 +259,9 @@ public class ImageServiceImpl extends ServiceImpl impl List imageList = new ArrayList<>(); result.forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath(path); try { - ImageReq imageReq = imageRespBuilder(absolutePath); + ImageReq imageReq = imageRespBuilder(absolutePath, path); BeanUtil.copyProperties(imageReq, imageEntity); } catch (Exception e) { log.debug("读取文件信息失败:{}", path); @@ -255,14 +301,14 @@ public class ImageServiceImpl extends ServiceImpl impl FileUtil.del(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath())); } - private ImageReq imageRespBuilder(String path) throws Exception { + private ImageReq imageRespBuilder(String absolutePath, String downloadPath) throws Exception { ImageReq req = new ImageReq(); - File file = new File(path); + File file = new File(absolutePath); JSONObject obj = EXIFUtil.printImageTags(file); req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); req.setImageName(obj.getStr("File Name")); - req.setImagePath(FilePathEnum.IMAGE_TEMP.getFileDownPath(path)); + req.setImagePath(downloadPath); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); req.setImageSize(imageSize.toString().concat("M")); req.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -416,9 +462,9 @@ public class ImageServiceImpl extends ServiceImpl impl List newImageList = new ArrayList<>(); partReq.getImagePaths().forEach(path -> { ImageEntity imageEntity = new ImageEntity(); - String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() + StrUtil.removePrefix(path, FilePathEnum.IMAGE.getUrlPath()); + String absolutePath = FilePathEnum.IMAGE.getFileAbsolutePath(path); try { - ImageReq imageReq = imageRespBuilder(absolutePath); + ImageReq imageReq = imageRespBuilder(absolutePath, path); BeanUtil.copyProperties(imageReq, imageEntity); } catch (Exception e) { log.debug("读取文件信息失败:{}", path); diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 002a073..518b177 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -55,6 +55,12 @@ public class ImageController { return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files)); } + @ApiOperation(value = "手动批量上传文件夹图像到项目", httpMethod = "POST") + @PostMapping("/{projectId}/{imageSource}/upload-batch") + public Result> uploadProjectBatch(@PathVariable String projectId, @PathVariable String imageSource, @RequestParam("files") MultipartFile[] files) { + return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, files)); + } + @ApiOperation(value = "上传图像", httpMethod = "POST") @PostMapping("/{imageSource}/upload/{partId}") public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { From 916d3dd04eae828f820117d38e2181b5eada60e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Fri, 25 Jul 2025 10:50:45 +0800 Subject: [PATCH 130/143] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/service/impl/PostServiceImpl.java | 12 ------------ .../com/dite/znpt/web/controller/PostController.java | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java index 6e321df..b735355 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PostServiceImpl.java @@ -1,28 +1,20 @@ package com.dite.znpt.service.impl; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.constant.Constants; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.PostEntity; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.entity.UserPostEntity; import com.dite.znpt.domain.vo.PostReq; import com.dite.znpt.domain.vo.PostResp; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.PostMapper; -import com.dite.znpt.mapper.UserPostMapper; import com.dite.znpt.service.PostService; -import com.dite.znpt.service.UserService; import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import java.util.ArrayList; import java.util.List; /** @@ -32,10 +24,6 @@ import java.util.List; */ @Service public class PostServiceImpl extends ServiceImpl implements PostService { - @Resource - private UserService userService; - @Resource - private UserPostMapper userPostMapper; @Override public List page(String postName) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/PostController.java b/web/src/main/java/com/dite/znpt/web/controller/PostController.java index 840addf..f5e0945 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/PostController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/PostController.java @@ -34,7 +34,7 @@ public class PostController { @ApiOperation(value = "查询岗位信息列表", httpMethod = "GET") @GetMapping("/list") - private Result> list(@RequestParam(value = "postName", required = false) String postName){ + public Result> list(@RequestParam(value = "postName", required = false) String postName){ return Result.ok(postService.list(postName)); } From 1805dfc0d86c6f0d767519bc2beb01b528f21790 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Fri, 25 Jul 2025 11:19:33 +0800 Subject: [PATCH 131/143] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=E9=9B=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BF=A1=E6=81=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ImageCollectServiceImpl.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 39871f2..1aac248 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -2,7 +2,6 @@ package com.dite.znpt.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; @@ -53,27 +52,20 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); - String temPathPrefix = FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR); imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); image.setImageType(req.getImageType()); image.setImageTypeLabel(req.getImageTypeLabel()); String path = permPathPrefix + image.getImageName(); - File file = new File(temPathPrefix.concat(image.getImageName())); + String fileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath()); + File file = FileUtil.file(fileAbsolutePath); if (file.exists()) { - byte[] bytes = FileUtil.readBytes(file); - FileUtil.writeBytes(bytes, path); - String url = FilePathEnum.IMAGE.getUrlPath().concat(StrUtil.removePrefix(path,FilePathEnum.IMAGE.getFileAbsolutePathPrefix()).replace(FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); - image.setImagePath(url); + FileUtil.copy(file, FileUtil.file(path), true); + image.setImagePath(FilePathEnum.IMAGE.getFileDownPath(path)); FileUtil.del(file); - }else { - imageList.remove(image); } }); - if(CollUtil.isEmpty(imageList)){ - throw new ServiceException(Message.IMAGE_PATH_IS_NOT_EXIST); - } imageService.saveOrUpdateBatch(imageList); } } From 0f971f46894d27c38c65326b214b10d6d79f448c Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 27 Jul 2025 16:21:30 +0800 Subject: [PATCH 132/143] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=E9=9B=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BF=A1=E6=81=AF=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= =?UTF-8?q?=E3=80=81=E4=BC=98=E5=8C=96=202.=E6=88=91=E7=9A=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BB=BB=E5=8A=A1=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=203.=E9=A1=B9=E7=9B=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2sql=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/config/Schedule.java | 2 +- .../com/dite/znpt/enums/FilePathEnum.java | 19 ++++++++++++ .../znpt/service/impl/DefectServiceImpl.java | 2 +- .../service/impl/ImageCollectServiceImpl.java | 27 ++++++++--------- .../znpt/service/impl/ImageServiceImpl.java | 2 +- .../main/resources/mapper/ProjectMapper.xml | 29 ++++++++++--------- .../web/controller/ProjectTaskController.java | 4 +-- 7 files changed, 52 insertions(+), 33 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index 8d5d41d..6e38623 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -47,7 +47,7 @@ public class Schedule { List successList = new ArrayList<>(); for (ImageEntity image : list) { PartResp partResp = partRespMap.get(image.getPartId()); - FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath()); String inputFile = pathEnum.getFileAbsolutePath(image.getImagePath()); String outputDir = FilePathEnum.IMAGE.getFileAbsolutePathPrefix() .concat("已调整") diff --git a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java index 3c522a7..46760f8 100644 --- a/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/FilePathEnum.java @@ -55,4 +55,23 @@ public enum FilePathEnum { return StrUtil.replace(urlPath.concat(relativePath), FileUtil.FILE_SEPARATOR, StrUtil.SLASH); } + /** + * 功能描述:根据文件路径前缀获取文件路径ENUM + * + * @param fileDownPath 文件路径 + * @return {@link FilePathEnum } + * @author cuizhibin + * @date 2025/07/27 16:00 + **/ + public static FilePathEnum getFilePathEnum(String fileDownPath) { + if (StrUtil.startWith(fileDownPath, FilePathEnum.IMAGE_TEMP.getUrlPath())) { + return FilePathEnum.IMAGE_TEMP; + } + for (FilePathEnum pathEnum : FilePathEnum.values()) { + if (StrUtil.startWith(fileDownPath, FilePathEnum.IMAGE_TEMP.getUrlPath())) { + return pathEnum; + } + } + return FilePathEnum.ATTACH; + } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java index f20ee9f..33b0407 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/DefectServiceImpl.java @@ -198,7 +198,7 @@ public class DefectServiceImpl extends ServiceImpl i } image.setImageType(ImageTypeEnum.DEFECT.getCode()); imageService.updateById(image); - FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath()); String inputPath = pathEnum.getFileAbsolutePath(image.getImagePath()); // 写入attach同层级文件夹下 String attachPath = FilePathEnum.ATTACH.getUrlPath() + StrUtil.removePrefix(image.getImagePath(), pathEnum.getUrlPath()); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java index 1aac248..0c6496f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageCollectServiceImpl.java @@ -8,8 +8,8 @@ import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.ImageCollectEntity; import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.vo.ImageCollectReq; +import com.dite.znpt.domain.vo.ImageReq; import com.dite.znpt.enums.FilePathEnum; -import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ImageCollectMapper; import com.dite.znpt.service.ImageCollectService; @@ -20,9 +20,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.File; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Author: gaoxiong @@ -49,21 +50,21 @@ public class ImageCollectServiceImpl extends ServiceImpl imageList = Converts.INSTANCE.toImageEntity(req.getImageList()); - String permPathPrefix = FilePathEnum.IMAGE.getFileAbsolutePathPrefix().concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR).concat(dateStr).concat(FileUtil.FILE_SEPARATOR); + Map imageMap = req.getImageList().stream().collect(Collectors.toMap(ImageReq::getImageId, Function.identity(), (a,b) -> b)); + List imageList = imageService.listByIds(imageMap.keySet()); imageList.forEach(image -> { image.setPartId(partId); image.setCollectId(imageCollect.getCollectId()); image.setImageType(req.getImageType()); image.setImageTypeLabel(req.getImageTypeLabel()); - String path = permPathPrefix + image.getImageName(); - String fileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath()); - File file = FileUtil.file(fileAbsolutePath); - if (file.exists()) { - FileUtil.copy(file, FileUtil.file(path), true); - image.setImagePath(FilePathEnum.IMAGE.getFileDownPath(path)); - FileUtil.del(file); + if (FilePathEnum.getFilePathEnum(image.getImagePath()).equals(FilePathEnum.IMAGE_TEMP)) { + String newImagePath = image.getImagePath().replace(FilePathEnum.IMAGE_TEMP.getUrlPath(), FilePathEnum.IMAGE.getUrlPath()); + String oldFileAbsolutePath = FilePathEnum.IMAGE_TEMP.getFileAbsolutePath(image.getImagePath()); + File oldFile = FileUtil.file(oldFileAbsolutePath); + if (oldFile.exists()) { + FileUtil.move(oldFile, FileUtil.file(newImagePath), true); + image.setImagePath(newImagePath); + } } }); imageService.saveOrUpdateBatch(imageList); diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 347f678..a9fd844 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -296,7 +296,7 @@ public class ImageServiceImpl extends ServiceImpl impl if(CollUtil.isEmpty(imageList)){ imageCollectService.removeById(image.getCollectId()); } - FilePathEnum pathEnum = image.getImagePath().contains("temp") ? FilePathEnum.IMAGE_TEMP : FilePathEnum.IMAGE; + FilePathEnum pathEnum = FilePathEnum.getFilePathEnum(image.getImagePath()); FileUtil.del(pathEnum.getFileAbsolutePath(image.getImagePath())); FileUtil.del(FilePathEnum.IMAGE.getFileAbsolutePath(image.getPreImagePath())); } diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml index 25aabf1..a603780 100644 --- a/core/src/main/resources/mapper/ProjectMapper.xml +++ b/core/src/main/resources/mapper/ProjectMapper.xml @@ -2,23 +2,27 @@ diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java index b2cd6b3..dd59781 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectTaskController.java @@ -5,7 +5,6 @@ import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.constant.Constants; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.ProjectTaskEntity; import com.dite.znpt.domain.vo.*; import com.dite.znpt.service.ProjectTaskService; import com.dite.znpt.util.PageUtil; @@ -102,8 +101,7 @@ public class ProjectTaskController { @ApiOperation(value = "查询我的任务", httpMethod = "GET") @GetMapping("/my") - public Result> my() { - ProjectTaskListReq req = new ProjectTaskListReq(); + public Result> my(ProjectTaskListReq req) { req.setUserId(StpUtil.getLoginIdAsString()); return Result.ok(projectTaskService.selectList(req)); } From 14b0b60562a59e15bfa95beb22a162385e171ff5 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 27 Jul 2025 16:30:21 +0800 Subject: [PATCH 133/143] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/service/impl/ImageServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index a9fd844..9db73da 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -64,6 +64,7 @@ public class ImageServiceImpl extends ServiceImpl impl private PartService partService; @Autowired private AudioFileInfoService audioFileInfoService; + @Autowired private ProjectService projectService; @Autowired private UserService userService; From ea1e7576dae6fd3a644b4aeca5d481426d795b37 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 27 Jul 2025 16:31:28 +0800 Subject: [PATCH 134/143] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AEid?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java | 3 +++ core/src/main/resources/mapper/ImageMapper.xml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java index 1809ea2..95d3a4d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListReq.java @@ -27,6 +27,9 @@ public class ImageListReq implements Serializable { @ApiModelProperty("部件id") private String partId; + @ApiModelProperty("项目id") + private String projectId; + @ApiModelProperty("图像类型") private String[] imageTypes; diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index f072bb6..b46c08c 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -20,6 +20,9 @@ AND p.part_id = #{partId} + + AND i.project_id = #{projectId} + AND i.image_type in #{imageType} From 3d7263248c9e6cbcfed91a1e1974b442b72623ea Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 27 Jul 2025 20:12:57 +0800 Subject: [PATCH 135/143] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=97=A5=E6=8A=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 1 + .../com/dite/znpt/domain/AuditableEntity.java | 9 -- .../entity/ProjectDailyReportEntity.java | 52 +++++++ .../znpt/domain/entity/ProjectEntity.java | 17 ++- .../domain/vo/ProjectBudgetInfoImportReq.java | 38 ----- .../domain/vo/ProjectDailyReportListReq.java | 39 +++++ .../znpt/domain/vo/ProjectDailyReportReq.java | 47 ++++++ .../domain/vo/ProjectDailyReportResp.java | 23 +++ .../znpt/enums/AttachBusinessTypeEnum.java | 1 + .../znpt/mapper/ProjectDailyReportMapper.java | 18 +++ .../dite/znpt/service/AttachInfoService.java | 2 +- .../service/ProjectDailyReportService.java | 74 ++++++++++ .../service/impl/AttachInfoServiceImpl.java | 5 +- .../impl/ProjectDailyReportServiceImpl.java | 138 ++++++++++++++++++ .../znpt/service/impl/ProjectServiceImpl.java | 11 +- .../service/impl/ProjectTaskServiceImpl.java | 3 +- .../mapper/ProjectDailyReportMapper.xml | 30 ++++ .../ProjectDailyReportController.java | 66 +++++++++ 18 files changed, 509 insertions(+), 65 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java create mode 100644 core/src/main/resources/mapper/ProjectDailyReportMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 842c55e..e2fafa6 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -79,4 +79,5 @@ public class Message implements Serializable { public static final String EQUIPMENT_USE_RECORD_STATUS_ERROR = "设备使用记录状态不合法"; public static final String EQUIPMENT_IS_USED = "设备已被使用"; public static final String EQUIPMENT_IS_RETURN = "设备已归还"; + public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; } diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index 0eb68a1..094855a 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,20 +1,16 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; -import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.List; /** * @description: 统一定义顶层Entity实体审计 基类 @@ -41,11 +37,6 @@ public class AuditableEntity implements Serializable { @ApiModelProperty(value = "修改人id", hidden = true) private LocalDateTime updateTime; - @ExcelIgnore - @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") - @TableField(exist = false) - private List idList; - @ExcelIgnore @ApiModelProperty(value = "当前页", example = "1", notes = "0") @TableField(exist = false) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java new file mode 100644 index 0000000..f995b26 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java @@ -0,0 +1,52 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_daily_report") +@ApiModel(value="ProjectDailyReportEntity对象", description="项目日报信息表") +public class ProjectDailyReportEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -88597301057742621L; + + @ExcelProperty("主键") + @ApiModelProperty("主键") + @TableId(value = "report_id", type = IdType.ASSIGN_ID) + private String reportId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("日报日期") + @ApiModelProperty("日报日期") + @TableField("report_date") + private LocalDate reportDate; + + @ExcelProperty("日报提交人") + @ApiModelProperty("日报提交人") + @TableField("submit_user") + private String submitUser; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index c044195..0060dc2 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -1,18 +1,19 @@ package com.dite.znpt.domain.entity; -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; - -import com.baomidou.mybatisplus.annotation.*; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.domain.AuditableEntity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDate; /** * @author huise23 @@ -158,7 +159,7 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty(value = "开始时间") private LocalDate startDate; - +// 施工人员,安全经理,项目经理,商务,财务,高级管理员,项目远程顾问外部协作者,质量经理、现场经理及工作组长。 @ApiModelProperty(value = "结束时间") private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java deleted file mode 100644 index 18d93a7..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.domain.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; -/** - * @author huise23 - * @date 2025/07/17 21:58 - * @Description: 项目预算信息表导入请求类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表") -public class ProjectBudgetInfoImportReq implements Serializable { - - @Serial - private static final long serialVersionUID = 580212651388155611L; - - - @ExcelProperty(value = "项目名称") - private String projectName; - - @ExcelProperty(value = "预算名称") - private String budgetName; - - @ExcelProperty(value = "预算类型") - private String budgetType; - - @ExcelProperty(value = "预算金额(万元)") - private Double budgetAmount; - - @ExcelProperty(value = "预算说明") - private String budgetDesc; -} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java new file mode 100644 index 0000000..17aff44 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息请求实体 + */ +@Data +@ApiModel("项目日报信息列表请求实体") +public class ProjectDailyReportListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 913060537944500760L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目日报信息Id") + private String reportId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @ApiModelProperty("日报提交人") + private String submitUser; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java new file mode 100644 index 0000000..53b2aad --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java @@ -0,0 +1,47 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectDailyReport请求对象", description="项目日报信息表") +public class ProjectDailyReportReq implements Serializable { + + @Serial + private static final long serialVersionUID = -35936236241363317L; + + @ApiModelProperty("主键") + private String reportId; + + @NotNull(message = "项目id不能为空") + @ApiModelProperty("项目id") + private String projectId; + + @NotNull(message = "日报日期不能为空") + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @NotBlank(message = "日报提交人不能为空") + @Size(max = 32, message = "日报提交人长度不能超过32字符") + @ApiModelProperty("日报提交人") + private String submitUser; + + @NotBlank(message = "日报附件id不能为空") + @ApiModelProperty("日报附件id") + private String reportAttachId; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java new file mode 100644 index 0000000..c41bdff --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java @@ -0,0 +1,23 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目日报信息响应实体") +public class ProjectDailyReportResp extends ProjectDailyReportEntity { + + @ApiModelProperty("日报附件") + private AttachInfoEntity reportAttach; +} + diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 4e008b3..ac53840 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -19,6 +19,7 @@ public enum AttachBusinessTypeEnum { DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"), REPORT("report", "报告"), PROJECT_BUDGE("project_budge", "预算文件"), + PROJECT_DAILY_REPORT("project_daily_report", "项目日报文件"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java new file mode 100644 index 0000000..be32858 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java @@ -0,0 +1,18 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表数据库访问层 + */ +public interface ProjectDailyReportMapper extends BaseMapper { + List queryBySelective(ProjectDailyReportListReq projectDailyReportReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index 3c4987f..d8cdeb6 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -23,7 +23,7 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List listByBusinessIds(List businessIds, String businessType); + List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType); /** * 功能描述:新增附件信息 diff --git a/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java new file mode 100644 index 0000000..e11a964 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java @@ -0,0 +1,74 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表服务接口 + */ +public interface ProjectDailyReportService extends IService { + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + List selectList(ProjectDailyReportListReq projectDailyReportReq); + + /** + * 功能描述:查询单条项目日报信息 + * + * @param reportId 项目日报信息Id + * @return {@link ProjectDailyReportResp } + * @author huise23 + * @date 2025/07/27 19:51 + **/ + ProjectDailyReportResp selectById(String reportId); + + /** + * 功能描述:新增项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void saveData(ProjectDailyReportReq projectDailyReportReq); + + /** + * 功能描述:更新项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void updateData(ProjectDailyReportReq projectDailyReportReq); + + /** + * 功能描述:删除项目日报信息 + * + * @param reportId 项目日报信息Id + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void deleteById(String reportId); + + /** + * 功能描述:我今天 + * + * @return {@link ProjectDailyReportResp } + * @author cuizhibin + * @date 2025/07/27 19:53 + **/ + ProjectDailyReportResp myToday(String projectId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 93c77dd..f95311f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -30,6 +30,7 @@ import java.net.URLEncoder; import java.rmi.ServerException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,9 +52,9 @@ public class AttachInfoServiceImpl extends ServiceImpl listByBusinessIds(List businessIds, String businessType) { + public List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType) { return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds) - .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType) + .eq(Objects.nonNull(businessType), AttachInfoEntity::getBusinessType, businessType.getCode()) .list(); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java new file mode 100644 index 0000000..f04dfca --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java @@ -0,0 +1,138 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; +import com.dite.znpt.enums.AttachBusinessTypeEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.ProjectDailyReportMapper; +import com.dite.znpt.service.AttachInfoService; +import com.dite.znpt.service.ProjectDailyReportService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectDailyReportServiceImpl extends ServiceImpl implements ProjectDailyReportService { + + private final AttachInfoService attachInfoService; + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public List selectList(ProjectDailyReportListReq projectDailyReportReq) { + PageUtil.startPage(); + List respList= this.baseMapper.queryBySelective(projectDailyReportReq); + if (CollUtil.isNotEmpty(respList)) { + List reportIds = respList.stream().map(ProjectDailyReportResp::getReportId).toList(); + Map attachMap = attachInfoService.listByBusinessIds(reportIds, AttachBusinessTypeEnum.PROJECT_DAILY_REPORT) + .stream().collect(Collectors.toMap(AttachInfoEntity::getBusinessId, Function.identity())); + respList.forEach(resp -> { + resp.setReportAttach(attachMap.get(resp.getReportId())); + }); + } + return respList; + } + + /** + * 功能描述:查询单条项目日报信息 + * + * @param reportId 项目日报信息Id + * @return {@link ProjectDailyReportResp } + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public ProjectDailyReportResp selectById(String reportId) { + ProjectDailyReportListReq projectDailyReportReq = new ProjectDailyReportListReq(); + projectDailyReportReq.setReportId(reportId); + + List list = selectList(projectDailyReportReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ProjectDailyReportResp(); + } + + /** + * 功能描述:新增项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void saveData(ProjectDailyReportReq projectDailyReportReq) { + ProjectDailyReportResp myToday = myToday(projectDailyReportReq.getProjectId()); + if (Objects.nonNull(myToday)) { + throw new ServiceException(Message.DAILY_REPORT_EXISTS); + } + ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class); + save(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT); + } + + /** + * 功能描述:更新项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void updateData(ProjectDailyReportReq projectDailyReportReq) { + ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class); + updateById(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT); + } + + /** + * 功能描述:删除项目日报信息 + * + * @param reportId 项目日报信息Id + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void deleteById(String reportId) { + removeById(reportId); + } + + @Override + public ProjectDailyReportResp myToday(String projectId) { + ProjectDailyReportListReq req = new ProjectDailyReportListReq(); + req.setProjectId(projectId); + req.setSubmitUser(StpUtil.getLoginIdAsString()); + req.setReportDate(LocalDate.now()); + List list = selectList(req); + if (CollUtil.isNotEmpty(list)){ + return CollUtil.getFirst(list); + } + return null; + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java index faf5a4a..c7b3038 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -5,20 +5,20 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectResp; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.service.UserService; -import com.dite.znpt.service.ProjectService; import com.dite.znpt.mapper.ProjectMapper; -import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.UserService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -59,6 +59,7 @@ public class ProjectServiceImpl extends ServiceImpl list= this.baseMapper.queryBySelective(req); list.forEach(resp -> { resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); +// 判断人员类型 }); return list; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index 16939d8..1bc85e5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -20,7 +20,6 @@ import com.dite.znpt.mapper.ProjectTaskGroupMapper; import com.dite.znpt.mapper.ProjectTaskMapper; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.ProjectTaskService; -import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,7 +54,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl projectTaskList = this.baseMapper.queryBySelective(projectTaskReq); Map> attachMap; if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) { - attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), null) + attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), AttachBusinessTypeEnum.PROJECT_TASK) .stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId)); } else { attachMap = new HashMap<>(); diff --git a/core/src/main/resources/mapper/ProjectDailyReportMapper.xml b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml new file mode 100644 index 0000000..3102523 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml @@ -0,0 +1,30 @@ + + + + + + a.report_id, a.project_id, a.report_date, a.submit_user, + a.update_by, a.create_time, a.create_by, a.update_time + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java new file mode 100644 index 0000000..b49bf8f --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java @@ -0,0 +1,66 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; +import com.dite.znpt.service.ProjectDailyReportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + */ +@Api(tags = "项目日报信息") +@RestController +@RequestMapping("/project-daily-report") +public class ProjectDailyReportController { + @Resource + private ProjectDailyReportService projectDailyReportService; + + @ApiOperation(value = "获取项目日报信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectDailyReportListReq projectDailyReportReq) { + return PageResult.ok(projectDailyReportService.selectList(projectDailyReportReq)); + } + + @ApiOperation(value = "根据项目日报信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{reportId}") + public Result getInfo(@PathVariable String reportId) { + return Result.ok(projectDailyReportService.selectById(reportId)); + } + + @ApiOperation(value = "获取登录人当日日报", httpMethod = "GET") + @GetMapping("/my-today/{projectId}") + public Result myToday(@PathVariable String projectId) { + return Result.ok(projectDailyReportService.myToday(projectId)); + } + + @ApiOperation(value = "新增项目日报信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.saveData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "修改项目日报信息", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.updateData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "删除项目日报信息", httpMethod = "DELETE") + @DeleteMapping("/{reportId}") + public Result remove(@PathVariable String reportId) { + projectDailyReportService.deleteById(reportId); + return Result.ok(); + } +} + From be162220324b5d724c07d185bdebf090c510fb6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 28 Jul 2025 18:19:42 +0800 Subject: [PATCH 136/143] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/BiddingInfoEntity.java | 62 ++++++++++++++ .../znpt/domain/entity/OutbidInfoEntity.java | 54 +++++++++++++ .../znpt/domain/entity/TenderInfoEntity.java | 63 +++++++++++++++ .../dite/znpt/domain/vo/BiddingInfoReq.java | 55 +++++++++++++ .../dite/znpt/domain/vo/BiddingInfoResp.java | 23 ++++++ .../dite/znpt/domain/vo/OutbidInfoReq.java | 46 +++++++++++ .../dite/znpt/domain/vo/OutbidInfoResp.java | 29 +++++++ .../dite/znpt/domain/vo/TenderInfoReq.java | 54 +++++++++++++ .../dite/znpt/domain/vo/TenderInfoResp.java | 36 +++++++++ .../com/dite/znpt/enums/ProjectTypeEnum.java | 49 +++++++++++ .../dite/znpt/mapper/BiddingInfoMapper.java | 12 +++ .../dite/znpt/mapper/OutbidInfoMapper.java | 12 +++ .../dite/znpt/mapper/TenderInfoMapper.java | 12 +++ .../dite/znpt/service/BiddingInfoService.java | 24 ++++++ .../dite/znpt/service/OutbidInfoService.java | 27 +++++++ .../dite/znpt/service/TenderInfoService.java | 25 ++++++ .../service/impl/BiddingInfoServiceImpl.java | 51 ++++++++++++ .../service/impl/OutbidInfoServiceImpl.java | 61 ++++++++++++++ .../service/impl/TenderInfoServiceImpl.java | 55 +++++++++++++ .../resources/mapper/BiddingInfoMapper.xml | 5 ++ .../resources/mapper/OutbidInfoMapper.xml | 5 ++ core/src/main/resources/mapper/UserMapper.xml | 3 +- .../resources/mapper/tenderInfoMapper.xml | 5 ++ .../web/controller/BiddingInfoController.java | 68 ++++++++++++++++ .../web/controller/OutbidInfoController.java | 81 +++++++++++++++++++ .../web/controller/TenderInfoController.java | 75 +++++++++++++++++ 26 files changed, 990 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/BiddingInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/OutbidInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/TenderInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java create mode 100644 core/src/main/resources/mapper/BiddingInfoMapper.xml create mode 100644 core/src/main/resources/mapper/OutbidInfoMapper.xml create mode 100644 core/src/main/resources/mapper/tenderInfoMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java new file mode 100644 index 0000000..126f8df --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:42 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("bidding_info") +@ApiModel(value="BiddingInfoEntity对象", description="招标信息表") +public class BiddingInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -2451841606051749490L; + + @ApiModelProperty("招标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String biddingInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @ApiModelProperty("招标截止时间") + private String biddingDeadline; + + @ApiModelProperty("招标信息录入时间") + private LocalDateTime infoEntryTime; + + @ApiModelProperty("招标信息来源") + private String source; + + @ApiModelProperty("招标信息来源网址") + private String sourceWebsite; + + @ApiModelProperty("招标文件") + private String biddingFile; + + @ApiModelProperty("状态:0-待报名,1-已报名") + private String status; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java new file mode 100644 index 0000000..b36f8b2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:44 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("outbid_info") +@ApiModel(value="OutbidInfoEntity对象", description="中标通知信息表") +public class OutbidInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 6941283868242292970L; + + @ApiModelProperty("中标通知信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String outbidId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("中标金额,单位元,精确到分") + private BigDecimal outbidAmount; + + @ApiModelProperty("工期,单位天") + private Integer duration; + + @ApiModelProperty("中标通知日期") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + private String outbidFile; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java new file mode 100644 index 0000000..d7b9dd4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:47 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tender_info") +@ApiModel(value="TenderInfoEntity对象", description="投标信息表") +public class TenderInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5677009089047831619L; + + @ApiModelProperty("投标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String tenderInfoId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + private String projectAddress; + + @ApiModelProperty("项目类型") + private String projectType; + + @ApiModelProperty("项目描述") + private String projectDescription; + + @ApiModelProperty("投标负责人") + private String tenderManager; + + @ApiModelProperty("投标负责人手机号") + private String tenderManagerPhone; + + @ApiModelProperty("投标文件") + private String tenderFile; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java new file mode 100644 index 0000000..6d428e1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:18 + * @description + */ +@Data +@ApiModel("招标信息请求实体") +public class BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 6967025339487392364L; + + @ApiModelProperty("招标项目") + @Size(max = 50, message = "招标项目不能超过50个字符") + private String biddingProject; + + @ApiModelProperty("招标公司") + @Size(max = 50, message = "招标公司不能超过50个字符") + private String biddingCompany; + + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("招标截止时间") + private LocalDateTime biddingDeadline; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("信息录入时间") + private LocalDateTime infoEntryTime; + + @ApiModelProperty("信息来源") + @Size(max = 50, message = "信息来源不能超过50个字符") + private String source; + + @ApiModelProperty("信息来源网址") + @Size(max = 500, message = "信息来源网址不能超过500个字符") + private String sourceWebsite; + + @ApiModelProperty("招标文件") + @Size(max = 200, message = "招标文件不能超过200个字符") + private String biddingFile; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java new file mode 100644 index 0000000..5419c65 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -0,0 +1,23 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:17 + * @description + */ +@Data +@ApiModel("招标信息响应实体") +public class BiddingInfoResp extends BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 2750666223381829115L; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java new file mode 100644 index 0000000..dba74e2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:05 + * @description + */ +@Data +@ApiModel("中标信息请求实体") +public class OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -1781661335173747275L; + + @ApiModelProperty("中标信息ID") + @NotBlank(message = "中标信息ID不能为空") + private String biddingInfoId; + + @ApiModelProperty("中标金额") + private BigDecimal outBidAmount; + + @ApiModelProperty("工期") + private Integer duration; + + @ApiModelProperty("中标通知日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + @Size(max = 200, message = "中标通知文件长度不能超过200") + private String outbidNoticeFile; + + @ApiModelProperty("状态:0-已通知,1-已签约") + private String status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java new file mode 100644 index 0000000..bfc0710 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:36 + * @description + */ +@Data +@ApiModel("中标信息响应实体") +public class OutbidInfoResp extends OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -718886028432322862L; + + @ApiModelProperty("中标信息ID") + private String outbidInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java new file mode 100644 index 0000000..a65a217 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:23 + * @description + */ +@Data +@ApiModel("投标信息请求实体") +public class TenderInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -5653933337345116548L; + + @ApiModelProperty("招标信息id") + @NotBlank(message = "招标信息id不能为空") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + @Size(max = 500, message = "项目地址不能超过500个字符") + private String projectAddress; + + @ApiModelProperty("项目类型,枚举:ProjectTypeEnum") + private String projectType; + + @ApiModelProperty("招标负责人") + @Size(min = 32, max = 32, message = "招标负责人长度必须为32个字符") + private String tenderManager; + + @Size(min = 11, max = 11, message = "招标负责人联系方式长度必须为11个字符") + @ApiModelProperty("招标负责人联系方式") + private String tenderManagerPhone; + + @Size(max = 100, message = "投标文件不能超过100个字符") + @ApiModelProperty("投标文件") + private String tenderFile; + + @Size(max = 500, message = "项目描述不能超过500个字符") + @ApiModelProperty("项目描述") + private String projectDescription; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java new file mode 100644 index 0000000..0c37898 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:50 + * @description + */ + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:49 + * @description + */ +@Data +@ApiModel("投标信息响应实体") +public class TenderInfoResp extends BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -8445413467535624096L; + + @ApiModelProperty("投标标信息ID") + private String tenderInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java new file mode 100644 index 0000000..c5e19b4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java @@ -0,0 +1,49 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:35 + * @description + */ +@Getter +@AllArgsConstructor +public enum ProjectTypeEnum { + BLADE_CHECK("blade_check", "风电叶片检查"), + OPERATION("operation", "风电运维"), + INSTALL("install", "风电安装"), + OTHER("other", "其他"); + + private final String code; + private final String desc; + + public static ProjectTypeEnum getByCode(String code){ + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectTypeEnum.values().length); + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(String.valueOf(e.code), e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java new file mode 100644 index 0000000..3bd2a4c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.BiddingInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java new file mode 100644 index 0000000..3448a05 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.OutbidInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java new file mode 100644 index 0000000..86dc3f5 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TenderInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:08 + * @description + */ +public interface TenderInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java new file mode 100644 index 0000000..5084b09 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -0,0 +1,24 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoService extends IService { + + List page(String projectName); + List list(String projectName); + void save(BiddingInfoReq req); + void update(String biddingInfoId, BiddingInfoReq req); + void apply(String biddingInfoId); + void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file); +} diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java new file mode 100644 index 0000000..9044ee4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -0,0 +1,27 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoService extends IService { + + List page(String projectName); + List list(String projectName); + OutbidInfoResp detail(String outbidInfoId); + void save(OutbidInfoReq req); + void update(String outbidInfoId, OutbidInfoReq req); + void deleteById(String outbidInfoId); + void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file); + void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response); +} diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java new file mode 100644 index 0000000..0a2c539 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -0,0 +1,25 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +public interface TenderInfoService extends IService { + List page(String projectName); + List list(String projectName); + TenderInfoResp detail(String tenderInfoId); + void save(TenderInfoReq req); + void update(String tenderInfoId, TenderInfoReq req); + void deleteById(String tenderInfoId); + void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file); + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java new file mode 100644 index 0000000..95cddfe --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.mapper.BiddingInfoMapper; +import com.dite.znpt.service.BiddingInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Service +public class BiddingInfoServiceImpl extends ServiceImpl implements BiddingInfoService { + + @Override + public List page(String projectName) { + return List.of(); + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public void save(BiddingInfoReq req) { + + } + + @Override + public void update(String biddingInfoId, BiddingInfoReq req) { + + } + + @Override + public void apply(String biddingInfoId) { + + } + + @Override + public void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file) { + + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java new file mode 100644 index 0000000..2cff12f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java @@ -0,0 +1,61 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.mapper.OutbidInfoMapper; +import com.dite.znpt.service.OutbidInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:12 + * @description + */ +@Service +public class OutbidInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + @Override + public List page(String projectName) { + return List.of(); + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public OutbidInfoResp detail(String outbidInfoId) { + return null; + } + + @Override + public void save(OutbidInfoReq req) { + + } + + @Override + public void update(String outbidInfoId, OutbidInfoReq req) { + + } + + @Override + public void deleteById(String outbidInfoId) { + + } + + @Override + public void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file) { + + } + + @Override + public void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response) { + + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java new file mode 100644 index 0000000..c98302f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java @@ -0,0 +1,55 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.mapper.TenderInfoMapper; +import com.dite.znpt.service.TenderInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +@Service +public class TenderInfoServiceImpl extends ServiceImpl implements TenderInfoService { + @Override + public List page(String projectName) { + return null; + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public TenderInfoResp detail(String tenderInfoId) { + return null; + } + + @Override + public void save(TenderInfoReq req) { + + } + + @Override + public void update(String tenderInfoId, TenderInfoReq req) { + + } + + @Override + public void deleteById(String tenderInfoId) { + + } + + @Override + public void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file) { + + } +} diff --git a/core/src/main/resources/mapper/BiddingInfoMapper.xml b/core/src/main/resources/mapper/BiddingInfoMapper.xml new file mode 100644 index 0000000..4133f08 --- /dev/null +++ b/core/src/main/resources/mapper/BiddingInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/OutbidInfoMapper.xml b/core/src/main/resources/mapper/OutbidInfoMapper.xml new file mode 100644 index 0000000..8620795 --- /dev/null +++ b/core/src/main/resources/mapper/OutbidInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index d61f50d..36b314a 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -16,7 +16,7 @@ LEFT JOIN role r ON ur.role_id = r.role_id LEFT JOIN user_post up ON up.user_id = u.user_id LEFT JOIN post p ON p.post_id = up.post_id - + WHERE u.del_flag = '0' AND u.user_code LIKE concat ('%', #{userCode}, '%') @@ -38,7 +38,6 @@ AND u.user_Type = #{userType} - GROUP BY u.user_id, u.account, u.status, u.name, u.user_code, u.user_type, u.user_status, d.dept_name, u.mobile, u.create_time diff --git a/core/src/main/resources/mapper/tenderInfoMapper.xml b/core/src/main/resources/mapper/tenderInfoMapper.xml new file mode 100644 index 0000000..5d8a983 --- /dev/null +++ b/core/src/main/resources/mapper/tenderInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java new file mode 100644 index 0000000..03160c6 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.service.BiddingInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Api(tags = "招标信息") +@RestController +@RequestMapping("/bidding-info") +public class BiddingInfoController { + + @Resource + private BiddingInfoService biddingInfoService; + + @ApiOperation(value = "分页查询招标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName) { + return PageResult.ok(biddingInfoService.page(projectName)); + } + + @ApiOperation(value = "查询招标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName) { + return Result.ok(biddingInfoService.list(projectName)); + } + + @ApiOperation(value = "新增招标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "编辑招标小心", httpMethod = "POST") + @PutMapping + public Result edit(@PathVariable String biddingInfoId, @Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.update(biddingInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "报名", httpMethod = "PUT") + public Result apply(@PathVariable String biddingInfoId){ + biddingInfoService.apply(biddingInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传招标信息文件", httpMethod = "POST") + @PostMapping("/upload-bidding-info-file/{biddingInfoId}") + public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @RequestParam("file") MultipartFile file) { + biddingInfoService.uploadBiddingInfoFile(biddingInfoId, file); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java new file mode 100644 index 0000000..b450d5e --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java @@ -0,0 +1,81 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.service.OutbidInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:13 + * @description + */ +@Api(tags = "中标通知信息") +@RestController +@RequestMapping("/outbid-info") +public class OutbidInfoController { + @Resource + private OutbidInfoService outbidInfoService; + + @ApiOperation(value = "分页查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(outbidInfoService.page(projectName)); + } + + @ApiOperation(value = "查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result list(String projectName){ + return Result.ok(outbidInfoService.list(projectName)); + } + + @ApiOperation(value = "根据中标通知信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{outbidInfoId}") + public Result detail(@PathVariable String outbidInfoId){ + return Result.ok(outbidInfoService.detail(outbidInfoId)); + } + + @ApiOperation(value = "新增中标通知信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody OutbidInfoReq req){ + outbidInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT") + @PutMapping("/{outbidInfoId}") + public Result update(@PathVariable String outbidInfoId, @RequestBody OutbidInfoReq req){ + outbidInfoService.update(outbidInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id删除信息", httpMethod = "DELETE") + @DeleteMapping("/{outbidInfoId}") + public Result delete(@PathVariable String outbidInfoId){ + outbidInfoService.deleteById(outbidInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传中标通知信息文件", httpMethod = "POST") + @PostMapping("/upload-outbid-info-file/{outBidInfoId}") + public Result uploadTenderInfoFile(@PathVariable String outBidInfoId, @RequestParam("file") MultipartFile file) { + outbidInfoService.uploadOutbidInfoFile(outBidInfoId, file); + return Result.ok(); + } + + @ApiOperation(value = "下载中标通知信息文件", httpMethod = "POST") + @PostMapping("/download-outbid-info-file/{outBidInfoId}") + public Result downLoadTenderInfoFile(@PathVariable String outBidInfoId, HttpServletResponse response) { + outbidInfoService.downLoadTenderInfoFile(outBidInfoId, response); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java new file mode 100644 index 0000000..63adfea --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java @@ -0,0 +1,75 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.service.TenderInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:10 + * @description + */ +@Api(tags = "投标信息") +@RestController +@RequestMapping("/tender-info") +public class TenderInfoController { + + @Resource + private TenderInfoService tenderInfoService; + + @ApiOperation(value = "分页查询投标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(tenderInfoService.page(projectName)); + } + + @ApiOperation(value = "查询投标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName){ + return Result.ok(tenderInfoService.list(projectName)); + } + + @ApiOperation(value = "根据投标信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{tenderInfoId}") + public Result detail(@PathVariable String tenderInfoId){ + return Result.ok(tenderInfoService.detail(tenderInfoId)); + } + + @ApiOperation(value = "新增投标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody TenderInfoReq req) { + tenderInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改投标信息", httpMethod = "PUT") + @PutMapping("/{tenderInfoId}") + public Result edit(@PathVariable String tenderInfoId, @Validated @RequestBody TenderInfoReq req) { + tenderInfoService.update(tenderInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除投标信息", httpMethod = "DELETE") + @DeleteMapping("/{tenderInfoId}") + public Result delete(@PathVariable String tenderInfoId) { + tenderInfoService.deleteById(tenderInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传投标信息文件", httpMethod = "POST") + @PostMapping("/upload-tender-info-file/{tenderInfoId}") + public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @RequestParam("file") MultipartFile file) { + tenderInfoService.uploadBiddingInfoFile(tenderInfoId, file); + return Result.ok(); + } +} From b0f8e7264af2789849df7e0dd416ba8d5f86ff73 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 28 Jul 2025 23:35:44 +0800 Subject: [PATCH 137/143] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 3 + .../java/com/dite/znpt/converts/Converts.java | 3 + .../znpt/domain/entity/BiddingInfoEntity.java | 4 +- .../znpt/domain/entity/OutbidInfoEntity.java | 2 +- .../znpt/domain/entity/TenderInfoEntity.java | 2 +- .../dite/znpt/domain/vo/BiddingInfoReq.java | 2 +- .../dite/znpt/domain/vo/BiddingInfoResp.java | 5 ++ .../dite/znpt/domain/vo/OutbidInfoReq.java | 3 +- .../dite/znpt/domain/vo/OutbidInfoResp.java | 3 + .../dite/znpt/domain/vo/TenderInfoReq.java | 3 +- .../dite/znpt/domain/vo/TenderInfoResp.java | 8 ++- .../dite/znpt/mapper/BiddingInfoMapper.java | 6 ++ .../dite/znpt/mapper/OutbidInfoMapper.java | 7 +++ .../dite/znpt/mapper/TenderInfoMapper.java | 8 +++ .../dite/znpt/service/BiddingInfoService.java | 2 +- .../dite/znpt/service/OutbidInfoService.java | 5 +- .../dite/znpt/service/TenderInfoService.java | 2 +- .../service/impl/BiddingInfoServiceImpl.java | 58 +++++++++++++++---- .../service/impl/OutbidInfoServiceImpl.java | 57 ++++++++++++++---- .../service/impl/TenderInfoServiceImpl.java | 54 ++++++++++++++--- .../resources/mapper/BiddingInfoMapper.xml | 10 ++++ .../resources/mapper/OutbidInfoMapper.xml | 19 ++++++ .../resources/mapper/TenderInfoMapper.xml | 28 +++++++++ .../resources/mapper/tenderInfoMapper.xml | 5 -- .../web/controller/BiddingInfoController.java | 16 ++--- .../web/controller/OutbidInfoController.java | 18 +++--- .../web/controller/TenderInfoController.java | 8 +-- 27 files changed, 270 insertions(+), 71 deletions(-) create mode 100644 core/src/main/resources/mapper/TenderInfoMapper.xml delete mode 100644 core/src/main/resources/mapper/tenderInfoMapper.xml diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index e2fafa6..6380daa 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -80,4 +80,7 @@ public class Message implements Serializable { public static final String EQUIPMENT_IS_USED = "设备已被使用"; public static final String EQUIPMENT_IS_RETURN = "设备已归还"; public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; + public static final String BIDDING_INFO_ID_IS_NOT_EXIST = "招标信息id不存在"; + public static final String TENDER_INFO_ID_IS_NOT_EXIST = "投标信息id不存在"; + public static final String OUTBID_INFO_ID_IS_NOT_EXIST = "中标信息id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index b373e0f..8d0f2d0 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -124,5 +124,8 @@ public interface Converts { EquipmentEntity toEquipmentUseRecordEntity(EquipmentReq req); EquipmentUseRecordEntity toEquipmentUseRecordEntity(EquipmentUseRecordReq req); + BiddingInfoEntity toBiddingInfoReq (BiddingInfoReq req); + TenderInfoEntity toTenderInfoEntity (TenderInfoReq req); + OutbidInfoEntity toOutbidInfoEntity (OutbidInfoReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java index 126f8df..acfd702 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java @@ -53,8 +53,8 @@ public class BiddingInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("招标信息来源网址") private String sourceWebsite; - @ApiModelProperty("招标文件") - private String biddingFile; + @ApiModelProperty("招标文件id") + private String biddingFileId; @ApiModelProperty("状态:0-待报名,1-已报名") private String status; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java index b36f8b2..43b359a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -46,7 +46,7 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { private LocalDateTime outbidNotifyDate; @ApiModelProperty("中标通知文件") - private String outbidFile; + private String outbidNoticeFileId; @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java index d7b9dd4..29ad3e4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java @@ -55,7 +55,7 @@ public class TenderInfoEntity extends AuditableEntity implements Serializable { private String tenderManagerPhone; @ApiModelProperty("投标文件") - private String tenderFile; + private String tenderFileId; @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java index 6d428e1..45a399c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -51,5 +51,5 @@ public class BiddingInfoReq implements Serializable { @ApiModelProperty("招标文件") @Size(max = 200, message = "招标文件不能超过200个字符") - private String biddingFile; + private String biddingFileId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java index 5419c65..6c5f44a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -20,4 +20,9 @@ public class BiddingInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标信息id") private String biddingInfoId; + + @ApiModelProperty("招标文件地址") + private String attachPath; + + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java index dba74e2..619e0c2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -38,8 +38,7 @@ public class OutbidInfoReq implements Serializable { private LocalDateTime outbidNotifyDate; @ApiModelProperty("中标通知文件") - @Size(max = 200, message = "中标通知文件长度不能超过200") - private String outbidNoticeFile; + private String outbidNoticeFileId; @ApiModelProperty("状态:0-已通知,1-已签约") private String status; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java index bfc0710..8669008 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -26,4 +26,7 @@ public class OutbidInfoResp extends OutbidInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + + @ApiModelProperty("中标通知文件地址") + private String attachPath; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java index a65a217..30f7f53 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java @@ -43,9 +43,8 @@ public class TenderInfoReq implements Serializable { @ApiModelProperty("招标负责人联系方式") private String tenderManagerPhone; - @Size(max = 100, message = "投标文件不能超过100个字符") @ApiModelProperty("投标文件") - private String tenderFile; + private String tenderFileId; @Size(max = 500, message = "项目描述不能超过500个字符") @ApiModelProperty("项目描述") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 0c37898..6f6c1a5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -20,7 +20,7 @@ import java.io.Serializable; */ @Data @ApiModel("投标信息响应实体") -public class TenderInfoResp extends BiddingInfoReq implements Serializable { +public class TenderInfoResp extends TenderInfoReq implements Serializable { @Serial private static final long serialVersionUID = -8445413467535624096L; @@ -33,4 +33,10 @@ public class TenderInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + @ApiModelProperty("投标文件地址") + private String attachPath; + + @ApiModelProperty("投标负责人姓名") + private String tenderManagerName; + } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java index 3bd2a4c..58e377f 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java @@ -2,6 +2,10 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G @@ -9,4 +13,6 @@ import com.dite.znpt.domain.entity.BiddingInfoEntity; * @description */ public interface BiddingInfoMapper extends BaseMapper { + + List listBiddingInfoResp(@Param("projectName") String projectName); } diff --git a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java index 3448a05..4c51729 100644 --- a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java @@ -2,6 +2,10 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G @@ -9,4 +13,7 @@ import com.dite.znpt.domain.entity.OutbidInfoEntity; * @description */ public interface OutbidInfoMapper extends BaseMapper { + List listOutbidInfoResp(@Param("projectName") String projectName); + + OutbidInfoResp getOutbidInfoResp(@Param("outbidInfoId") String outbidInfoId); } diff --git a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java index 86dc3f5..a3f004c 100644 --- a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java @@ -2,6 +2,11 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoResp; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; /** * @author Bear.G @@ -9,4 +14,7 @@ import com.dite.znpt.domain.entity.TenderInfoEntity; * @description */ public interface TenderInfoMapper extends BaseMapper { + List listTenderInfoResp(@Param("projectName") String projectName); + + TenderInfoResp getTenderInfoResp(@Param("tenderInfoId") String tenderInfoId); } diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java index 5084b09..9ede904 100644 --- a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -19,6 +19,6 @@ public interface BiddingInfoService extends IService { List list(String projectName); void save(BiddingInfoReq req); void update(String biddingInfoId, BiddingInfoReq req); + void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId); void apply(String biddingInfoId); - void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file); } diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java index 9044ee4..4aa02b4 100644 --- a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.OutbidInfoEntity; import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -22,6 +21,6 @@ public interface OutbidInfoService extends IService { void save(OutbidInfoReq req); void update(String outbidInfoId, OutbidInfoReq req); void deleteById(String outbidInfoId); - void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file); - void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response); + void uploadOutbidNoticeFile(String outBidInfoId, String outbidFileId); + void downLoadOutbidNoticeFile(String outbidFileId, HttpServletResponse response) throws Exception; } diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java index 0a2c539..dc185ce 100644 --- a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -20,6 +20,6 @@ public interface TenderInfoService extends IService { void save(TenderInfoReq req); void update(String tenderInfoId, TenderInfoReq req); void deleteById(String tenderInfoId); - void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file); + void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java index 95cddfe..43f9498 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java @@ -1,14 +1,22 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.BiddingInfoEntity; import com.dite.znpt.domain.vo.BiddingInfoReq; import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.BiddingInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.BiddingInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** @@ -19,33 +27,61 @@ import java.util.List; @Service public class BiddingInfoServiceImpl extends ServiceImpl implements BiddingInfoService { + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return List.of(); + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listBiddingInfoResp(projectName); } + @Transactional(rollbackFor = Exception.class) @Override public void save(BiddingInfoReq req) { - + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String biddingInfoId, BiddingInfoReq req) { - + BiddingInfoEntity biddingInfo = this.getById(biddingInfoId); + if(null ==biddingInfo){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + entity.setBiddingInfoId(biddingInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) + @Override + public void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId) { + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(biddingFileId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + entity.setBiddingFileId(biddingFileId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) @Override public void apply(String biddingInfoId) { - - } - - @Override - public void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file) { - + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + entity.setStatus("1"); + this.updateById(entity); } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java index 2cff12f..1dea161 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java @@ -1,14 +1,23 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.OutbidInfoEntity; import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.OutbidInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.OutbidInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -19,43 +28,71 @@ import java.util.List; */ @Service public class OutbidInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return List.of(); + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listOutbidInfoResp(projectName); } @Override public OutbidInfoResp detail(String outbidInfoId) { - return null; + return this.baseMapper.getOutbidInfoResp(outbidInfoId); } + @Transactional(rollbackFor = Exception.class) @Override public void save(OutbidInfoReq req) { - + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String outbidInfoId, OutbidInfoReq req) { - + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + entity.setOutbidId(outbidInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String outbidInfoId) { - + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + this.removeById(outbidInfoId); } @Override - public void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file) { - + public void uploadOutbidNoticeFile(String outbidInfoId, String outbidNoticeFileId) { + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(outbidNoticeFileId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + outbidInfo.setOutbidNoticeFileId(outbidNoticeFileId); + this.updateById(outbidInfo); } @Override - public void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response) { - + public void downLoadOutbidNoticeFile(String outbidNoticeFileId, HttpServletResponse response) throws Exception { + attachInfoService.download(outbidNoticeFileId, response); } + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java index c98302f..948bef1 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java @@ -1,14 +1,23 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.TenderInfoEntity; import com.dite.znpt.domain.vo.TenderInfoReq; import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.TenderInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.TenderInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import java.util.List; /** @@ -18,38 +27,67 @@ import java.util.List; */ @Service public class TenderInfoServiceImpl extends ServiceImpl implements TenderInfoService { + + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return null; + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listTenderInfoResp(projectName); } @Override public TenderInfoResp detail(String tenderInfoId) { - return null; + return this.baseMapper.getTenderInfoResp(tenderInfoId); } + @Transactional(rollbackFor = Exception.class) @Override public void save(TenderInfoReq req) { - + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String tenderInfoId, TenderInfoReq req) { - + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null ==tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + entity.setTenderInfoId(tenderInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String tenderInfoId) { - + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null ==tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + this.removeById(tenderInfoId); } - @Override - public void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file) { + @Transactional(rollbackFor = Exception.class) + @Override + public void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId) { + TenderInfoEntity entity = this.getById(tenderInfoId); + if(null == entity){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(tenderInfoId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + entity.setTenderFileId(tenderFileId); + this.updateById(entity); } } diff --git a/core/src/main/resources/mapper/BiddingInfoMapper.xml b/core/src/main/resources/mapper/BiddingInfoMapper.xml index 4133f08..9672a96 100644 --- a/core/src/main/resources/mapper/BiddingInfoMapper.xml +++ b/core/src/main/resources/mapper/BiddingInfoMapper.xml @@ -2,4 +2,14 @@ + \ No newline at end of file diff --git a/core/src/main/resources/mapper/OutbidInfoMapper.xml b/core/src/main/resources/mapper/OutbidInfoMapper.xml index 8620795..5cccaa5 100644 --- a/core/src/main/resources/mapper/OutbidInfoMapper.xml +++ b/core/src/main/resources/mapper/OutbidInfoMapper.xml @@ -2,4 +2,23 @@ + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/TenderInfoMapper.xml b/core/src/main/resources/mapper/TenderInfoMapper.xml new file mode 100644 index 0000000..6f83a25 --- /dev/null +++ b/core/src/main/resources/mapper/TenderInfoMapper.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/tenderInfoMapper.xml b/core/src/main/resources/mapper/tenderInfoMapper.xml deleted file mode 100644 index 5d8a983..0000000 --- a/core/src/main/resources/mapper/tenderInfoMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java index 03160c6..b3d5d7f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java @@ -46,23 +46,23 @@ public class BiddingInfoController { return Result.ok(); } - @ApiOperation(value = "编辑招标小心", httpMethod = "POST") + @ApiOperation(value = "编辑招标消息",httpMethod = "POST") @PutMapping public Result edit(@PathVariable String biddingInfoId, @Validated @RequestBody BiddingInfoReq req){ biddingInfoService.update(biddingInfoId, req); return Result.ok(); } + @ApiOperation(value = "上传招标文件",httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/biddingInfo,userDefinedPath = {biddingInfoId}") + @PutMapping("/{biddingInfoId}/upload-bidding-info_file/{biddingFileId}") + public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @PathVariable String biddingFileId){ + biddingInfoService.uploadBiddingInfoFile(biddingInfoId, biddingFileId); + return Result.ok(); + } @ApiOperation(value = "报名", httpMethod = "PUT") + @PutMapping("/apply/{biddingInfoId}") public Result apply(@PathVariable String biddingInfoId){ biddingInfoService.apply(biddingInfoId); return Result.ok(); } - - @ApiOperation(value = "上传招标信息文件", httpMethod = "POST") - @PostMapping("/upload-bidding-info-file/{biddingInfoId}") - public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @RequestParam("file") MultipartFile file) { - biddingInfoService.uploadBiddingInfoFile(biddingInfoId, file); - return Result.ok(); - } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java index b450d5e..95896bc 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java @@ -6,10 +6,8 @@ import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; import com.dite.znpt.service.OutbidInfoService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -44,14 +42,14 @@ public class OutbidInfoController { return Result.ok(outbidInfoService.detail(outbidInfoId)); } - @ApiOperation(value = "新增中标通知信息", httpMethod = "POST") + @ApiOperation(value = "新增中标通知信息", httpMethod = "POST", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") @PostMapping public Result add(@RequestBody OutbidInfoReq req){ outbidInfoService.save(req); return Result.ok(); } - @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT") + @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") @PutMapping("/{outbidInfoId}") public Result update(@PathVariable String outbidInfoId, @RequestBody OutbidInfoReq req){ outbidInfoService.update(outbidInfoId, req); @@ -66,16 +64,16 @@ public class OutbidInfoController { } @ApiOperation(value = "上传中标通知信息文件", httpMethod = "POST") - @PostMapping("/upload-outbid-info-file/{outBidInfoId}") - public Result uploadTenderInfoFile(@PathVariable String outBidInfoId, @RequestParam("file") MultipartFile file) { - outbidInfoService.uploadOutbidInfoFile(outBidInfoId, file); + @PostMapping("/{outBidInfoId}/upload-outbid-info-file/{outbidNoticeFileId}") + public Result uploadOutbidNoticeFile(@PathVariable String outBidInfoId, @PathVariable String outbidNoticeFileId) { + outbidInfoService.uploadOutbidNoticeFile(outBidInfoId, outbidNoticeFileId); return Result.ok(); } @ApiOperation(value = "下载中标通知信息文件", httpMethod = "POST") - @PostMapping("/download-outbid-info-file/{outBidInfoId}") - public Result downLoadTenderInfoFile(@PathVariable String outBidInfoId, HttpServletResponse response) { - outbidInfoService.downLoadTenderInfoFile(outBidInfoId, response); + @PostMapping("/download-outbid-info-file/{outbidNoticeFileId}") + public Result downLoadOutbidNoticeFile(@PathVariable String outbidNoticeFileId, HttpServletResponse response) throws Exception { + outbidInfoService.downLoadOutbidNoticeFile(outbidNoticeFileId, response); return Result.ok(); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java index 63adfea..5f8ea3a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java @@ -66,10 +66,10 @@ public class TenderInfoController { return Result.ok(); } - @ApiOperation(value = "上传投标信息文件", httpMethod = "POST") - @PostMapping("/upload-tender-info-file/{tenderInfoId}") - public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @RequestParam("file") MultipartFile file) { - tenderInfoService.uploadBiddingInfoFile(tenderInfoId, file); + @ApiOperation(value = "上传投标信息文件", httpMethod = "POST", notes = "上传附件调用新增附件信息接口:/attach-info/tenderInfo,userDefinedPath = {tenderInfoId}") + @PostMapping("/{tenderInfoId}/upload-tender-info-file/{tenderFileId}") + public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @PathVariable String tenderFileId) { + tenderInfoService.uploadBiddingInfoFile(tenderInfoId, tenderFileId); return Result.ok(); } } From 096151403a6dd6645d0c392599d7415f4d84ba66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Tue, 29 Jul 2025 15:41:04 +0800 Subject: [PATCH 138/143] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 2 + .../znpt/domain/entity/AttachInfoEntity.java | 4 + .../znpt/domain/entity/OutbidInfoEntity.java | 5 +- .../dite/znpt/domain/vo/AttachInfoReq.java | 3 + .../dite/znpt/domain/vo/AttachInfoResp.java | 3 + .../dite/znpt/domain/vo/BiddingInfoReq.java | 6 +- .../dite/znpt/domain/vo/BiddingInfoResp.java | 3 + .../dite/znpt/domain/vo/OutbidInfoReq.java | 2 +- .../dite/znpt/domain/vo/OutbidInfoResp.java | 3 + .../dite/znpt/domain/vo/TenderInfoResp.java | 3 + .../znpt/enums/AttachBusinessTypeEnum.java | 3 + .../dite/znpt/service/BiddingInfoService.java | 1 - .../dite/znpt/service/OutbidInfoService.java | 1 - .../dite/znpt/service/TenderInfoService.java | 2 - .../service/impl/AttachInfoServiceImpl.java | 2 + .../service/impl/BiddingInfoServiceImpl.java | 3 + .../service/impl/OutbidInfoServiceImpl.java | 57 ++++++++++---- .../service/impl/TenderInfoServiceImpl.java | 76 ++++++++++++++----- .../resources/mapper/BiddingInfoMapper.xml | 2 +- .../resources/mapper/OutbidInfoMapper.xml | 4 +- .../resources/mapper/TenderInfoMapper.xml | 4 +- .../web/controller/BiddingInfoController.java | 3 +- .../web/controller/OutbidInfoController.java | 7 -- .../web/controller/TenderInfoController.java | 12 +-- 24 files changed, 145 insertions(+), 66 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 6380daa..8e6398a 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -82,5 +82,7 @@ public class Message implements Serializable { public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; public static final String BIDDING_INFO_ID_IS_NOT_EXIST = "招标信息id不存在"; public static final String TENDER_INFO_ID_IS_NOT_EXIST = "投标信息id不存在"; + public static final String TENDER_INFO_IS_EXIST = "招标[{}]已存中投信息存在"; public static final String OUTBID_INFO_ID_IS_NOT_EXIST = "中标信息id不存在"; + public static final String OUTBID_INFO_IS_EXIST = "招标[{}]已存中标信息存在"; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java index 5e1fb8c..ad09e56 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -43,6 +43,10 @@ public class AttachInfoEntity extends AuditableEntity implements Serializable { @TableField("business_type") private String businessType; + @ApiModelProperty("文件名") + @TableField("file_name") + private String fileName; + @ApiModelProperty("文件类型") @TableField("file_type") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java index 43b359a..61230b8 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -31,7 +31,7 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("中标通知信息id") @TableId(type = IdType.ASSIGN_UUID) - private String outbidId; + private String outbidInfoId; @ApiModelProperty("招标信息id") private String biddingInfoId; @@ -48,6 +48,9 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("中标通知文件") private String outbidNoticeFileId; + @ApiModelProperty("状态") + private String status; + @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") private String delFlag; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java index 11d8200..be5ce0d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -24,6 +24,9 @@ public class AttachInfoReq implements Serializable { @ApiModelProperty("自定义路径") private String userDefinedPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java index 027fea6..b56a7f7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java @@ -32,6 +32,9 @@ public class AttachInfoResp implements Serializable { @ApiModelProperty("附件路径") private String attachPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java index 45a399c..25e17fe 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -46,10 +46,6 @@ public class BiddingInfoReq implements Serializable { private String source; @ApiModelProperty("信息来源网址") - @Size(max = 500, message = "信息来源网址不能超过500个字符") + @Size(max = 100, message = "信息来源网址不能超过100个字符") private String sourceWebsite; - - @ApiModelProperty("招标文件") - @Size(max = 200, message = "招标文件不能超过200个字符") - private String biddingFileId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java index 6c5f44a..64a1797 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -21,6 +21,9 @@ public class BiddingInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标信息id") private String biddingInfoId; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("招标文件地址") private String attachPath; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java index 619e0c2..16386fa 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -28,7 +28,7 @@ public class OutbidInfoReq implements Serializable { private String biddingInfoId; @ApiModelProperty("中标金额") - private BigDecimal outBidAmount; + private BigDecimal outbidAmount; @ApiModelProperty("工期") private Integer duration; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java index 8669008..bfac3a3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -27,6 +27,9 @@ public class OutbidInfoResp extends OutbidInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("中标通知文件地址") private String attachPath; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 6f6c1a5..97e8028 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -32,6 +32,9 @@ public class TenderInfoResp extends TenderInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + + @ApiModelProperty("文件名称") + private String fileName; @ApiModelProperty("投标文件地址") private String attachPath; diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index ac53840..1be8f4b 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -20,6 +20,9 @@ public enum AttachBusinessTypeEnum { REPORT("report", "报告"), PROJECT_BUDGE("project_budge", "预算文件"), PROJECT_DAILY_REPORT("project_daily_report", "项目日报文件"), + BIDDING_INFO("bidding_info", "招标信息"), + TENDER_INFO("tender_info", "投标信息"), + OUTBID_INFO("outbid_info", "中标信息"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java index 9ede904..b7dc2e3 100644 --- a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.BiddingInfoEntity; import com.dite.znpt.domain.vo.BiddingInfoReq; import com.dite.znpt.domain.vo.BiddingInfoResp; -import org.springframework.web.multipart.MultipartFile; import java.util.List; diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java index 4aa02b4..0325149 100644 --- a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -21,6 +21,5 @@ public interface OutbidInfoService extends IService { void save(OutbidInfoReq req); void update(String outbidInfoId, OutbidInfoReq req); void deleteById(String outbidInfoId); - void uploadOutbidNoticeFile(String outBidInfoId, String outbidFileId); void downLoadOutbidNoticeFile(String outbidFileId, HttpServletResponse response) throws Exception; } diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java index dc185ce..a767f49 100644 --- a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TenderInfoEntity; import com.dite.znpt.domain.vo.TenderInfoReq; import com.dite.znpt.domain.vo.TenderInfoResp; -import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -20,6 +19,5 @@ public interface TenderInfoService extends IService { void save(TenderInfoReq req); void update(String tenderInfoId, TenderInfoReq req); void deleteById(String tenderInfoId); - void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index f95311f..7236292 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -82,9 +82,11 @@ public class AttachInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + @Resource + private BiddingInfoService biddingInfoService; + @Resource private AttachInfoService attachInfoService; + @Override public List page(String projectName) { PageUtil.startPage(); @@ -51,7 +57,22 @@ public class OutbidInfoServiceImpl extends ServiceImpl listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(OutbidInfoEntity::getBiddingInfoId, biddingInfoId)); } @Transactional(rollbackFor = Exception.class) @@ -61,9 +82,26 @@ public class OutbidInfoServiceImpl extends ServiceImpl implements TenderInfoService { + @Resource + private UserService userService; + @Resource private AttachInfoService attachInfoService; + @Override public List page(String projectName) { PageUtil.startPage(); @@ -50,19 +59,64 @@ public class TenderInfoServiceImpl extends ServiceImpl listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(TenderInfoEntity::getBiddingInfoId, biddingInfoId)); } @Transactional(rollbackFor = Exception.class) @@ -73,21 +127,9 @@ public class TenderInfoServiceImpl extends ServiceImpl - SELECT oi.outbid_info_id, oi.bidding_info_id, bi.bidding_project, bi.bidding_company, oi.outbid_amount, oi.outbid_notify_date, oi.outbid_notice_file_id, oi.status, ai.attach_path + SELECT oi.outbid_info_id, oi.bidding_info_id, bi.bidding_project, bi.bidding_company, oi.outbid_amount, oi.outbid_notify_date, oi.outbid_notice_file_id, oi.status, ai.file_name, ai.attach_path FROM outbid_info oi LEFT JOIN bidding_info bi ON oi.bidding_info_id = bi.bidding_info_id LEFT JOIN attach_info ai ON oi.outbid_notice_file_id = ai.attach_id @@ -15,7 +15,7 @@ SELECT ti.tender_info_id, ti.bidding_info_id, bi.bidding_project, bi.bidding_company, ti.tender_amount, ti.project_address,ti.project_type, ti.tender_manager, u.name AS 'tenderManagerName', - ti.tender_manager_phone, ti.project_description, ti.tender_file_id, ai.attach_path + ti.tender_manager_phone, ti.project_description, ti.tender_file_id, ai.file_name, ai.attach_path FROM tender_info ti LEFT JOIN bidding_info bi ON ti.bidding_info_id = bi.bidding_info_id LEFT JOIN user u ON ti.tender_manager = u.user_id @@ -18,7 +18,7 @@