Browse Source

贵阳抄表

lin 4 years ago
parent
commit
518e4fcdd6
35 changed files with 2650 additions and 0 deletions
  1. 310 0
      meter-reading-guiyang/mvnw
  2. 182 0
      meter-reading-guiyang/mvnw.cmd
  3. 108 0
      meter-reading-guiyang/pom.xml
  4. 13 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/MeterReadingGuiyangApplication.java
  5. 72 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/config/SwaggerConfig.java
  6. 78 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/config/XxlJobConfig.java
  7. 148 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/controller/TestController.java
  8. 19 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/ConcentratorMapper.java
  9. 15 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/DeviceMapper.java
  10. 12 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/WaterMeterReplaceLogMapper.java
  11. 9 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/dto/DeviceDto.java
  12. 11 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/dto/WaterMeterReplaceLogDto.java
  13. 89 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/Concentrator.java
  14. 120 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/Device.java
  15. 90 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/WaterMeterReplaceLog.java
  16. 93 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/job/DataJob.java
  17. 19 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ConcentratorData.java
  18. 28 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/model/FileData.java
  19. 13 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ReadData.java
  20. 16 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ReadItem.java
  21. 195 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/repository/MeterReadRecord.java
  22. 11 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/repository/MeterReadRecordRepository.java
  23. 73 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/AccessTokenService.java
  24. 80 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/ConcentratorService.java
  25. 72 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DataService.java
  26. 116 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DeviceReplaceService.java
  27. 153 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DeviceService.java
  28. 89 0
      meter-reading-guiyang/src/main/java/com/zoniot/meter/service/MeterReadRecordService.java
  29. 52 0
      meter-reading-guiyang/src/main/resources/application-dev.properties
  30. 50 0
      meter-reading-guiyang/src/main/resources/application-sit.properties
  31. 1 0
      meter-reading-guiyang/src/main/resources/application.properties
  32. 259 0
      meter-reading-guiyang/src/main/resources/mapper/ConcentratorMapper.xml
  33. 24 0
      meter-reading-guiyang/src/main/resources/mapper/DeviceMapper.xml
  34. 17 0
      meter-reading-guiyang/src/main/resources/mapper/WaterMeterReplaceLogMapper.xml
  35. 13 0
      meter-reading-guiyang/src/test/java/com/zoniot/meter/MeterReadingGuiyangApplicationTests.java

+ 310 - 0
meter-reading-guiyang/mvnw

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

+ 182 - 0
meter-reading-guiyang/mvnw.cmd

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

+ 108 - 0
meter-reading-guiyang/pom.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.6.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.zoniot</groupId>
+    <artifactId>meter-reading-guiyang</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>meter-reading-guiyang</name>
+    <description>贵阳抄表</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <skipTests>true</skipTests>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <!-- xxl-job -->
+        <dependency>
+            <groupId>com.xuxueli</groupId>
+            <artifactId>xxl-job-core</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+        <!-- mongodb -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
+        <!--数据库连接池-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.23</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- mybatis -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.3</version>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/MeterReadingGuiyangApplication.java

@@ -0,0 +1,13 @@
+package com.zoniot.meter;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MeterReadingGuiyangApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MeterReadingGuiyangApplication.class, args);
+    }
+
+}

+ 72 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/config/SwaggerConfig.java

@@ -0,0 +1,72 @@
+package com.zoniot.meter.config;
+
+import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+    @Bean
+    public Docket api() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .ignoredParameterTypes(BasicErrorController.class)
+                .groupName("web")
+                .select()
+                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build()
+                .apiInfo(apiInfo())
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts());
+    }
+
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("智慧城市Api")
+                .description("智慧城市")
+                .version("1.0")
+                .termsOfServiceUrl("Terms of service")
+                .license("测试")
+                .build();
+    }
+
+    private List<ApiKey> securitySchemes() {
+        return newArrayList(
+                new ApiKey("Authorization", "Authorization", "header"));
+    }
+
+    private List<SecurityContext> securityContexts() {
+        return newArrayList(
+                SecurityContext.builder()
+                        .securityReferences(defaultAuth())
+                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
+                        .build()
+        );
+    }
+
+    List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        return newArrayList(
+                new SecurityReference("Authorization", authorizationScopes));
+    }
+
+}

+ 78 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/config/XxlJobConfig.java

@@ -0,0 +1,78 @@
+package com.zoniot.meter.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * xxl-job config
+ *
+ * @author xuxueli 2017-04-28
+ */
+@Configuration
+public class XxlJobConfig {
+    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
+
+    @Value("${xxl.job.admin.addresses}")
+    private String adminAddresses;
+
+    @Value("${xxl.job.accessToken}")
+    private String accessToken;
+
+    @Value("${xxl.job.executor.appname}")
+    private String appname;
+
+    @Value("${xxl.job.executor.address}")
+    private String address;
+
+    @Value("${xxl.job.executor.ip}")
+    private String ip;
+
+    @Value("${xxl.job.executor.port}")
+    private int port;
+
+    @Value("${xxl.job.executor.logpath}")
+    private String logPath;
+
+    @Value("${xxl.job.executor.logretentiondays}")
+    private int logRetentionDays;
+
+
+    @Bean
+    public XxlJobSpringExecutor xxlJobExecutor() {
+        logger.info(">>>>>>>>>>> xxl-job config init.");
+        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+        xxlJobSpringExecutor.setAppname(appname);
+        xxlJobSpringExecutor.setAddress(address);
+        xxlJobSpringExecutor.setIp(ip);
+        xxlJobSpringExecutor.setPort(port);
+        xxlJobSpringExecutor.setAccessToken(accessToken);
+        xxlJobSpringExecutor.setLogPath(logPath);
+        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+
+        return xxlJobSpringExecutor;
+    }
+
+    /**
+     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+     *
+     *      1、引入依赖:
+     *          <dependency>
+     *             <groupId>org.springframework.cloud</groupId>
+     *             <artifactId>spring-cloud-commons</artifactId>
+     *             <version>${version}</version>
+     *         </dependency>
+     *
+     *      2、配置文件,或者容器启动变量
+     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+     *
+     *      3、获取IP
+     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+     */
+
+
+}

+ 148 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/controller/TestController.java

@@ -0,0 +1,148 @@
+package com.zoniot.meter.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.zoniot.meter.job.DataJob;
+import com.zoniot.meter.model.ConcentratorData;
+import com.zoniot.meter.model.FileData;
+import com.zoniot.meter.model.ReadData;
+import com.zoniot.meter.model.ReadItem;
+import com.zoniot.meter.service.AccessTokenService;
+import com.zoniot.meter.service.DataService;
+import io.swagger.annotations.Api;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Slf4j
+@Controller
+@ResponseBody
+@RequestMapping("test")
+@Api(tags = "测试")
+public class TestController {
+    @Autowired
+    private AccessTokenService accessTokenService;
+    @Autowired
+    private DataService dataService;
+    @Autowired
+    private DataJob dataJob;
+
+    @GetMapping("test")
+    public void test(){
+        String token = accessTokenService.getAccessToken();
+        System.out.println(token);
+    }
+
+    @GetMapping("file")
+    public void file(){
+        FileData fileData = new FileData();
+        fileData.setMeterSiteNum("87654321");
+        fileData.setUserNum("12345678");
+        fileData.setCommunicationMode("");
+        fileData.setConcentratorCode("200123456");
+        fileData.setFmaddress("87654321");
+        fileData.setInstallAddress("测试");
+        fileData.setInstallDate(new Date());
+        fileData.setInstallLatitude("");
+        fileData.setInstallLongitude("");
+        fileData.setMeterCalibre("01");
+        fileData.setMeterCode("12345678");
+        fileData.setMeterPurposes("");
+        fileData.setMeterStatus("01");
+        fileData.setOperateType("01");
+        fileData.setOutFactoryNum("87654321");
+        fileData.setSealNum("87654321");
+        fileData.setSteelSealNum("87654321");
+
+        List<FileData> list = new ArrayList<>();
+        list.add(fileData);
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        dataService.fasttasks("10001",json);
+    }
+
+    @GetMapping("Concentrator")
+    public void concentrator(){
+        ConcentratorData concentratorData = new ConcentratorData();
+        concentratorData.setConcentratorName("测试");
+        concentratorData.setConcentratorCode("200123456");
+        concentratorData.setSim("123");
+        concentratorData.setInstallAddress("测试");
+        concentratorData.setInstallDate(new Date());
+        concentratorData.setInstallLatitude("");
+        concentratorData.setInstallLongitude("");
+        concentratorData.setMeterQuantity(2);
+        concentratorData.setConcentratorStatus("01");
+        concentratorData.setOperateType("01");
+        List<ConcentratorData> list = new ArrayList<>();
+        list.add(concentratorData);
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        dataService.fasttasks("10002",json);
+    }
+
+    @SneakyThrows
+    @GetMapping("read")
+    public void read(){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM
+        Date date = simpleDateFormat.parse("2019-09-02");
+
+        ReadItem readItem = new ReadItem();
+        readItem.setDataType("20");
+        readItem.setCollectTime(date);
+        readItem.setReceiveTime(new Date());
+        readItem.setValue("100");
+
+
+        ReadData readData = new ReadData();
+        readData.setFmaddress("87654321");
+        readData.setUserNum("12345678");
+        readData.setData(newArrayList(readItem));
+
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",newArrayList(readData));
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        dataService.fasttasks("10201",json);
+    }
+
+    @GetMapping("readJob")
+    public void readJob() throws Exception {
+        dataJob.meterReadJobHandler(null);
+    }
+
+    @GetMapping("concentratorJob")
+    public void concentratorJob() throws Exception {
+        dataJob.addConcentratorJobHandler(null);
+    }
+
+    @GetMapping("addDeviceJob")
+    public void addDeviceJob() throws Exception {
+        dataJob.addDeviceJobHandler(null);
+    }
+    @GetMapping("updateDeviceJob")
+    public void updateDeviceJob() throws Exception {
+        dataJob.updateDeviceJobHandler(null);
+    }
+    @GetMapping("addReplaceJob")
+    public void addReplaceJob() throws Exception {
+        dataJob.addReplaceJobHandler(null);
+    }
+
+}

+ 19 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/ConcentratorMapper.java

@@ -0,0 +1,19 @@
+package com.zoniot.meter.dao;
+
+
+import com.zoniot.meter.entity.Concentrator;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ConcentratorMapper {
+    int insertSelective(Concentrator record);
+
+    int updateByPrimaryKeySelective(Concentrator record);
+
+    int batchInsert(@Param("list") List<Concentrator> list);
+
+    List<Concentrator> findAdd();
+}

+ 15 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/DeviceMapper.java

@@ -0,0 +1,15 @@
+package com.zoniot.meter.dao;
+
+import com.zoniot.meter.dto.DeviceDto;
+import com.zoniot.meter.entity.Device;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DeviceMapper {
+
+    List<DeviceDto> findAddDevice();
+
+    List<DeviceDto> findUpdateDevice();
+}

+ 12 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/dao/WaterMeterReplaceLogMapper.java

@@ -0,0 +1,12 @@
+package com.zoniot.meter.dao;
+
+import com.zoniot.meter.dto.WaterMeterReplaceLogDto;
+import com.zoniot.meter.entity.WaterMeterReplaceLog;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WaterMeterReplaceLogMapper {
+    List<WaterMeterReplaceLogDto> findAdd();
+}

+ 9 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/dto/DeviceDto.java

@@ -0,0 +1,9 @@
+package com.zoniot.meter.dto;
+
+import com.zoniot.meter.entity.Device;
+import lombok.Data;
+
+@Data
+public class DeviceDto extends Device {
+    private String concentratorCode;
+}

+ 11 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/dto/WaterMeterReplaceLogDto.java

@@ -0,0 +1,11 @@
+package com.zoniot.meter.dto;
+
+import com.zoniot.meter.entity.WaterMeterReplaceLog;
+import lombok.Data;
+
+@Data
+public class WaterMeterReplaceLogDto extends WaterMeterReplaceLog {
+    private String fileNo;
+    private String locDesc;
+    private String concentratorCode;
+}

+ 89 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/Concentrator.java

@@ -0,0 +1,89 @@
+package com.zoniot.meter.entity;
+
+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 java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+    * 水务行业专用,一个集中器下有多个水表或者采集器
+    */
+@ApiModel(value="com-bz-smart_city-entity-Concentrator")
+@Data
+public class Concentrator {
+
+    @ApiModelProperty(value="主键")
+    private Integer id;
+
+    @ApiModelProperty(value="站点,参考sc_site主键",hidden = true)
+    private Integer siteId;
+
+    @ApiModelProperty(value="客户")
+    private Integer customerId;
+
+    @ApiModelProperty(value="集中器编码")
+    private String serialNumber;
+
+    @ApiModelProperty(value="集中器名称")
+    private String name;
+
+    @ApiModelProperty(value="集中器类型,参考sc_w_meter_type主键",hidden = true)
+    private Integer type;
+
+    @ApiModelProperty(value="省,参考sc_area",hidden = true)
+    private Integer province;
+
+    @ApiModelProperty(value="市,参考sc_area",hidden = true)
+    private Integer city;
+
+    @ApiModelProperty(value="区,参考sc_area",hidden = true)
+    private Integer region;
+
+    @ApiModelProperty(value="建筑,参考sc_building")
+    private Integer buildingId;
+
+    @ApiModelProperty(value="安装地址")
+    private String address;
+
+    @ApiModelProperty(value="设备状态 0:离线 1:在线")
+    private Integer deviceStatus;
+
+    @ApiModelProperty(value="设备类型")
+    private Integer deviceType;
+
+    @ApiModelProperty(value="波特率 1:1200 b/s 2:2400 b/s 3:9600 b/s")
+    private Integer baudRate;
+
+    @ApiModelProperty(value="IP地址")
+    private String ip;
+
+    @ApiModelProperty(value="端口")
+    private Integer port;
+
+    @ApiModelProperty(value="sim卡号")
+    private String simNo;
+
+    @JsonIgnore
+    @ApiModelProperty(value="创建时间")
+    private Date dateCreate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value="更新时间")
+    private Date dateUpdate;
+
+    @JsonIgnore
+    @ApiModelProperty(value="创建人",hidden = true)
+    private String createBy;
+
+    @JsonIgnore
+    @ApiModelProperty(value="更新人",hidden = true)
+    private String updateBy;
+
+    @JsonIgnore
+    @ApiModelProperty(value="状态",hidden = true)
+    private Integer status;
+}

+ 120 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/Device.java

@@ -0,0 +1,120 @@
+package com.zoniot.meter.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel("设备")
+public class Device {
+    @ApiModelProperty(value = "编号", position = 1)
+    private Long id;
+
+    @ApiModelProperty(value = "设备编号", position = 2)
+    private String deviceNo;
+
+    @ApiModelProperty(value = "设备类型", position = 3)
+    private Integer deviceType;
+
+    @ApiModelProperty(value = "系统id", position = 4)
+    private Integer sysId;
+
+    @ApiModelProperty(value = "系统id数组", position = 4)
+    private List<Integer> sysIds ; 
+    
+    @ApiModelProperty(value = "站点id", position = 4, hidden = true)
+    private Integer siteId;
+
+    @ApiModelProperty(value = "建筑id", position = 5)
+    private Integer buildingId;
+
+    @ApiModelProperty(value = "楼层", position = 6)
+    private Integer floor;
+
+    @ApiModelProperty(value = "位置描述", position = 7)
+    private String locDesc;
+
+    @ApiModelProperty(value = "关联设备", position = 8)
+    private Long relatedDeviceNo;
+
+    @ApiModelProperty(value = "厂商", position = 9)
+    private Integer manufacturerId;
+
+    //@ApiModelProperty(value = "设备状态  1:正常 2:故障 3:无 4: 预警 5:未启用", position = 11, hidden = true)
+    @ApiModelProperty(value = "设备状态  1:正常 2:故障 3:无 4: 预警 5:未启用", position = 11, hidden = true)
+    private Integer deviceStatus;
+
+    @ApiModelProperty(value = "状态 0:删除 1:正常", position = 12, hidden = true)
+    private Integer status;
+
+    @ApiModelProperty(value = "是否已标记 0:未标记 1:已标记", position = 13)
+    private Integer isTag;
+
+    @ApiModelProperty(value = "坐标x", position = 14)
+    private BigDecimal xCoordinates;
+
+    @ApiModelProperty(value = "坐标y", position = 15)
+    private BigDecimal yCoordinates;
+
+    @ApiModelProperty(value = "创建人", hidden = true)
+    private String createBy = "system";
+
+    @ApiModelProperty(value = "更新人", hidden = true)
+    private String updateBy = "system";
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间", hidden = true)
+    private LocalDateTime dateCreate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新时间", hidden = true)
+    private LocalDateTime dateUpdate = LocalDateTime.now();
+
+    @ApiModelProperty(value = "平面图id", position = 16)
+    private Integer planId;
+
+    @ApiModelProperty(value = "水表电子号", position = 17)
+    private String waterMeterNo;
+
+    @ApiModelProperty(value = "水表档案号", position = 18)
+    private String waterMeterFileNo;
+
+
+
+    @ApiModelProperty(value = "参考sc_customer表id", position = 19)
+    private Integer customerId;
+
+    @ApiModelProperty(value = "udip平台id", position = 20)
+    private String udipId;
+
+    @ApiModelProperty(value = "是否注册", position = 20)
+    private Integer registerStatus;
+
+    @ApiModelProperty(value = "同步状态 0:无同步 1:已同步 2:未同步", position = 20)
+    private Integer syncStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "设备最后上报时间", position = 21)
+    private LocalDateTime lastReceiveTime;
+
+    private List<Integer> deviceStatusList;
+
+    @ApiModelProperty(value = "水表档案号", position = 22)
+    private String metercode;
+
+    @ApiModelProperty(value = "客户信息ID", position = 23)
+    private BigInteger accountId;
+
+    @ApiModelProperty(value = "客户编号", position = 24)
+    private String accountnumber;
+
+    @ApiModelProperty(value="铅封号", position = 25)
+    private String sealNo;
+
+}

+ 90 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/entity/WaterMeterReplaceLog.java

@@ -0,0 +1,90 @@
+package com.zoniot.meter.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@ApiModel(value="com.bz.smart_city.entity.WaterMeterReplaceLog")
+@Data
+public class WaterMeterReplaceLog {
+
+    @ApiModelProperty(value="主键")
+    private Integer id;
+
+    @ApiModelProperty(value="站点id")
+    private Integer siteId;
+
+    @ApiModelProperty(value="记录表id,参考sc_water_meter_maintenance_log表id")
+    private Integer mainLogId;
+
+    @ApiModelProperty(value="参考sc_device表id")
+    private Long deviceId;
+
+    @ApiModelProperty(value="更换方案,1 更换模块,2:更换整表")
+    private Integer replaceMethod;
+
+    @ApiModelProperty(value="新设备类型,参考sc_device_type表id")
+    private Integer newDeviceTypeId;
+
+    @ApiModelProperty(value="旧设备类型,参考sc_device_type表id")
+    private Integer oldDeviceTypeId;
+
+    @ApiModelProperty(value="新表表号(电子号)")
+    private String newWaterNo;
+
+    @ApiModelProperty(value="旧表表号(电子号)")
+    private String oldWaterNo;
+
+    @ApiModelProperty(value="新表起度")
+    private String newBeginWsv;
+
+    @ApiModelProperty(value="旧表止度")
+    private String oldEndWsv;
+
+    @ApiModelProperty(value="新节点编号")
+    private String newDeviceNo;
+
+    @ApiModelProperty(value="旧节点编号")
+    private String oldDeviceNo;
+
+    @ApiModelProperty(value="新卡流量号")
+    private String newSimNo;
+
+    @ApiModelProperty(value="旧卡流量号")
+    private String oldSimNo;
+
+    @ApiModelProperty(value="新设备标识号")
+    private String newDeviceFlagNo;
+
+    @ApiModelProperty(value="旧设备标识号")
+    private String oldDeviceFlagNo;
+
+    @ApiModelProperty(value="备注")
+    private String remark;
+
+    @ApiModelProperty(value="更换人")
+    private String replaceUsername;
+
+    @ApiModelProperty(value="更换人手机号码")
+    private String replaceUserPhone;
+
+    @ApiModelProperty(value="状态",hidden = true)
+    private Integer status;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value="创建时间")
+    private LocalDateTime dateCreate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value="更新时间",hidden = true)
+    private LocalDateTime dateUpdate;
+
+    @ApiModelProperty(value="创建人",hidden = true)
+    private String createBy;
+
+    @ApiModelProperty(value="更新人",hidden = true)
+    private String updateBy;
+}

+ 93 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/job/DataJob.java

@@ -0,0 +1,93 @@
+package com.zoniot.meter.job;
+
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import com.zoniot.meter.service.ConcentratorService;
+import com.zoniot.meter.service.DeviceReplaceService;
+import com.zoniot.meter.service.DeviceService;
+import com.zoniot.meter.service.MeterReadRecordService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class DataJob {
+    @Autowired
+    private MeterReadRecordService meterReadRecordService;
+    @Autowired
+    private ConcentratorService concentratorService;
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private DeviceReplaceService deviceReplaceService;
+
+    private static Logger logger = LoggerFactory.getLogger(DataJob.class);
+
+
+    /**
+     * 1、简单任务示例(Bean模式)
+     */
+    @XxlJob("demoJobHandler")
+    public ReturnT<String> demoJobHandler(String param) throws Exception {
+        XxlJobLogger.log("XXL-JOB, Hello World.");
+        for (int i = 0; i < 5; i++) {
+            XxlJobLogger.log("beat at:" + i);
+            TimeUnit.SECONDS.sleep(2);
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     *  新增设备
+     */
+    @XxlJob("addDeviceJobHandler")
+    public ReturnT<String> addDeviceJobHandler(String param) throws Exception {
+        XxlJobLogger.log("addDeviceJobHandler");
+        deviceService.addDevice();
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     * 更新设备
+     */
+    @XxlJob("updateDeviceJobHandler")
+    public ReturnT<String> updateDeviceJobHandler(String param) throws Exception {
+        XxlJobLogger.log("updateDeviceJobHandler");
+        deviceService.updateDevice();
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     *  新增集中器
+     */
+    @XxlJob("addConcentratorJobHandler")
+    public ReturnT<String> addConcentratorJobHandler(String param) throws Exception {
+        XxlJobLogger.log("addConcentratorJobHandler");
+        concentratorService.addConcentrator();
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     *  换表
+     */
+    @XxlJob("addReplaceJobHandler")
+    public ReturnT<String> addReplaceJobHandler(String param) throws Exception {
+        XxlJobLogger.log("addReplaceJobHandler");
+        deviceReplaceService.addReplace();
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     *  抄表
+     */
+    @XxlJob("meterReadJobHandler")
+    public ReturnT<String> meterReadJobHandler(String param) throws Exception {
+        XxlJobLogger.log("meterReadJobHandler");
+        meterReadRecordService.meterRead();
+        return ReturnT.SUCCESS;
+    }
+}

+ 19 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ConcentratorData.java

@@ -0,0 +1,19 @@
+package com.zoniot.meter.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ConcentratorData {
+    private String concentratorName;
+    private String concentratorCode;
+    private String sim;
+    private String installAddress;
+    private Date installDate;
+    private String installLatitude;
+    private String installLongitude;
+    private Integer meterQuantity;
+    private String concentratorStatus;
+    private String operateType;
+}

+ 28 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/model/FileData.java

@@ -0,0 +1,28 @@
+package com.zoniot.meter.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FileData {
+    private String meterSiteNum;
+    private String userNum;
+    private String communicationMode;
+    private String concentratorCode;
+    private String fmaddress;
+    private String installAddress;
+    @JSONField(format="yyyy-MM-dd HH:mm:ss")
+    private Date installDate;
+    private String installLatitude;
+    private String installLongitude;
+    private String meterCalibre;
+    private String meterCode;
+    private String meterPurposes;
+    private String meterStatus;
+    private String operateType;
+    private String outFactoryNum;
+    private String sealNum;
+    private String steelSealNum;
+}

+ 13 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ReadData.java

@@ -0,0 +1,13 @@
+package com.zoniot.meter.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ReadData {
+
+    private String fmaddress;
+    private String userNum;
+    private List<ReadItem> data;
+}

+ 16 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/model/ReadItem.java

@@ -0,0 +1,16 @@
+package com.zoniot.meter.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ReadItem {
+    private String dataType;
+    @JSONField(format="yyyy-MM-dd HH:mm:ss")
+    private Date collectTime;
+    private String value;
+    @JSONField(format="yyyy-MM-dd HH:mm:ss")
+    private Date receiveTime;
+}

+ 195 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/repository/MeterReadRecord.java

@@ -0,0 +1,195 @@
+package com.zoniot.meter.repository;
+
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * <p>抄表记录</p>
+ * sh.enableSharding("meter-reading-database");
+ * sh.shardCollection("meter-reading-database.sc_meter_read_record",{"readDate":1,"deviceId":1});
+ * db.sc_meter_read_record.createIndex({readDate:1,customerId:1,buildingId:1,siteId:1,sysId:1,readStatus:1,concentratorId:1},{background: true,name:'idx_1'})
+ * @Author wilian.peng
+ * @Date 2020/12/22 16:59
+ * @Version 1.0
+ */
+@Data
+@Document(collection = "sc_meter_read_record")
+public class MeterReadRecord implements Serializable {
+    /**
+    * 主键
+    */
+    private Long id;
+
+    /**
+    * 读表日期
+    */
+    private Integer readDate;
+
+    /**
+     * 站点
+     */
+    private Integer siteId;
+
+    /**
+     * 场景
+     */
+    private Integer sysId;
+
+    /**
+    * 省
+    */
+    private Integer province;
+
+    /**
+    * 市
+    */
+    private Integer city;
+
+    /**
+    * 区
+    */
+    private Integer region;
+
+    /**
+    * 小区
+    */
+    private Integer community;
+
+    /**
+    * 客户
+    */
+    private Integer customerId;
+
+    /**
+    * 集中器
+    */
+    private Integer concentratorId;
+
+    /**
+    * 采集器
+    */
+    private Integer collectorId;
+
+    /**
+    * 建筑
+    */
+    private Integer buildingId;
+
+    /**
+    * 安装地址
+    */
+    private String location;
+
+    /**
+    * 设备类型
+    */
+    private Integer deviceTypeId;
+
+    /**
+    * 设备id
+    */
+    private Long deviceId;
+
+    /**
+    * 节点编号
+    */
+    private String deviceNo;
+
+    /**
+    * 电子号
+    */
+    private String meterNo;
+
+    /**
+    * 档案号
+    */
+    private String meterFileNo;
+
+    /**
+    * 读表时间
+    */
+    private Date readTime;
+
+    /**
+    * 读表状态
+    */
+    private String readStatus;
+
+    /**
+    * 读表数据
+    */
+    private String readData;
+
+    /**
+    * 最近有效数据
+    */
+    private String lastValid;
+
+    /**
+    * 距离上次的消耗
+    */
+    private BigDecimal lastCost;
+
+    /**
+    * 状态
+    */
+    private Integer status;
+
+    /**
+    * 创建时间
+    */
+    private Date dateCreate;
+
+    /**
+    * 更新时间
+    */
+    private Date dateUpdate;
+
+    /**
+    * 创建人
+    */
+    private String createBy;
+
+    /**
+    * 更新人
+    */
+    private String updateBy;
+
+    /***********************************以下字段将存入MongoDB中**************************************/
+    private String communityName;
+
+    private String buildingName ;
+
+    private String customerName ;
+
+    private String provinceName ;
+
+    private String cityName ;
+
+    private String regionName ;
+
+    private String deviceTypeName ;
+
+    private String concentratorNo ;
+
+    private String collectorNo ;
+
+    private Integer manufacturerId ;
+
+    private String manufacturerName ;
+
+    private Integer channelNumberId;
+
+    private String channelName ;
+
+    /**
+     * 最后上送数据,格式如下:
+     * {"数据ID":11111,data:{"WSV":"1","VOL":"2.5"}}
+     */
+    private Map<String, String> lastSendData ;
+}

+ 11 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/repository/MeterReadRecordRepository.java

@@ -0,0 +1,11 @@
+package com.zoniot.meter.repository;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+import java.util.List;
+
+public interface MeterReadRecordRepository extends MongoRepository<MeterReadRecord, Long> {
+    MeterReadRecord findByDeviceIdAndReadDate(Long deviceId, Integer date);
+
+    List<MeterReadRecord> findByReadDateAndCustomerIdAndReadStatus(Integer date, Integer customerId,String readStatus);
+}

+ 73 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/AccessTokenService.java

@@ -0,0 +1,73 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class AccessTokenService {
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+    private RestTemplate restTemplate = new RestTemplate();
+    @Value("${agent.guiyang.api-url}")
+    String apiUrl;
+
+    public String getAccessToken(){
+        String token = null;
+        String tokenKey = "guiyang:accessToken";
+        token = redisTemplate.opsForValue().get(tokenKey);
+        if (token != null) {
+            return token;
+        }else {
+            String tokenUrl = apiUrl + "/api/auth/v1/token?appId={appId}&appSecret={appSecret}";
+            //log.info("postData : {}", JSON.toJSONString(deviceReplace));
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+
+            Map<String,String> map = new HashMap<>();
+            map.put("appId","100010");
+            map.put("appSecret","7895a610-a1db-4980-bdef-74f2535dbc38");
+
+
+            ResponseEntity<String> responseEntity = null;
+            try {
+                responseEntity = restTemplate.getForEntity(tokenUrl, String.class,map);
+
+            }catch (Exception e){
+                log.error("request error e={}",e.getMessage());
+            }
+
+            if (responseEntity != null) {
+                log.info("responseEntity : {} {}", responseEntity.getStatusCodeValue(),responseEntity.getBody());
+                JSONObject jsonObj = (JSONObject) JSONObject.parse(responseEntity.getBody());
+                JSONObject data = jsonObj.getJSONObject("data");
+                Integer code = jsonObj.getInteger("code");
+                if (code == 0 && data != null) {
+                    String accessTokenTem = data.getString("token");
+                    Integer expireIn = data.getInteger("expireIn");
+                    redisTemplate.opsForValue().set(tokenKey,accessTokenTem,expireIn-10, TimeUnit.SECONDS);
+                    return accessTokenTem;
+                } else {
+                    log.info("请求token错误");
+                }
+            }
+
+        }
+        return token;
+    }
+}

+ 80 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/ConcentratorService.java

@@ -0,0 +1,80 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.zoniot.meter.dao.ConcentratorMapper;
+import com.zoniot.meter.entity.Concentrator;
+import com.zoniot.meter.model.ConcentratorData;
+import com.zoniot.meter.model.ReadData;
+import com.zoniot.meter.repository.MeterReadRecord;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Slf4j
+@Service
+public class ConcentratorService {
+
+    @Autowired
+    private ConcentratorMapper concentratorMapper;
+
+    public void addConcentrator() {
+        List<Concentrator> list = concentratorMapper.findAdd();
+        log.info("list size="+list.size());
+        if (list != null && list.size() > 0) {
+            int total = list.size();
+            int pageSize = 5000;
+            int totalPage = total / pageSize;
+            if (total % pageSize != 0) {
+                totalPage++;
+            }
+            for (int i = 1; i <= totalPage; i++)
+            {
+                log.info("current page = " + i);
+                List<Concentrator> records = newArrayList();
+                int start = (i - 1) * pageSize;
+                int j = 0;
+
+                for (int index = 0; (j < pageSize) && (index < total); j++)
+                {
+                    index = start + j;
+                    records.add(list.get(index));
+                    index++;
+                }
+                log.info("current page size = " + records.size());
+                buildData(records);
+            }
+        }
+    }
+
+    private void buildData(List<Concentrator> records) {
+        List<ConcentratorData> list = newArrayList();
+        if (records != null && records.size() > 0) {
+            for (Concentrator record : records) {
+                ConcentratorData concentratorData = new ConcentratorData();
+                concentratorData.setConcentratorName(record.getName());
+                concentratorData.setConcentratorCode(record.getSerialNumber());
+                concentratorData.setSim(record.getSimNo());
+                concentratorData.setInstallAddress(record.getAddress());
+                concentratorData.setInstallDate(record.getDateCreate());
+                concentratorData.setInstallLatitude("");
+                concentratorData.setInstallLongitude("");
+                concentratorData.setMeterQuantity(2);
+                concentratorData.setConcentratorStatus("01");
+                concentratorData.setOperateType("01");
+                //List<ConcentratorData> list = new ArrayList<>();
+                list.add(concentratorData);
+            }
+        }
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        //dataService.fasttasks("10002",json);
+    }
+}

+ 72 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DataService.java

@@ -0,0 +1,72 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RequestCallback;
+import org.springframework.web.client.ResponseExtractor;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Slf4j
+@Component
+public class DataService {
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    private RestTemplate restTemplate = new RestTemplate();
+    @Value("${agent.guiyang.api-url}")
+    String apiUrl;
+
+
+
+    public void fasttasks(String dataType, String json){
+        String accessToken = accessTokenService.getAccessToken();
+
+        log.info("accessToken={}",accessToken);
+        String tokenUrl = apiUrl + "/api/data-exchange/v1/fasttasks/?token="+accessToken+"&dataType="+dataType;
+        //log.info("postData : {}", JSON.toJSONString(deviceReplace));
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        //headers.add("Authorization", "Bearer " + accessToken);
+
+        Map<String,String> map = new HashMap<>();
+        map.put("token",accessToken);
+        map.put("dataType",dataType);
+
+        log.info("content={}",JSON.toJSONString(map));
+        HttpEntity<String> request = new HttpEntity<>(json,headers);
+
+        ResponseEntity<String> responseEntity = null;
+        try {
+            try {
+                responseEntity = restTemplate.postForEntity(tokenUrl, request, String.class);
+            }catch (Exception e){
+                log.error("request error e={}",e.getMessage());
+            }
+        }catch (Exception e){
+            log.error("request error e={}",e.getMessage());
+        }
+        if (responseEntity != null) {
+            log.info("responseEntity : {} {}", responseEntity.getStatusCodeValue(),responseEntity.getBody());
+            JSONObject jsonObj = (JSONObject) JSONObject.parse(responseEntity.getBody());
+            System.out.println(jsonObj);
+            //return JSONObject.parseArray(readingsJSONArray.toJSONString(), ReadingDataDto.class);
+        }
+        return ;
+    }
+
+
+
+
+}

+ 116 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DeviceReplaceService.java

@@ -0,0 +1,116 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.zoniot.meter.dao.WaterMeterReplaceLogMapper;
+import com.zoniot.meter.dto.WaterMeterReplaceLogDto;
+import com.zoniot.meter.entity.Device;
+import com.zoniot.meter.entity.WaterMeterReplaceLog;
+import com.zoniot.meter.model.FileData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Slf4j
+@Service
+public class DeviceReplaceService {
+
+    @Autowired
+    private WaterMeterReplaceLogMapper waterMeterReplaceLogMapper;
+
+    public void addReplace() {
+        List<WaterMeterReplaceLogDto> list = waterMeterReplaceLogMapper.findAdd();
+        log.info("list size="+list.size());
+        if (list != null && list.size() > 0) {
+            int total = list.size();
+            int pageSize = 5000;
+            int totalPage = total / pageSize;
+            if (total % pageSize != 0) {
+                totalPage++;
+            }
+            for (int i = 1; i <= totalPage; i++)
+            {
+                log.info("current page = " + i);
+                List<WaterMeterReplaceLogDto> records = newArrayList();
+                int start = (i - 1) * pageSize;
+                int j = 0;
+
+                for (int index = 0; (j < pageSize) && (index < total); j++)
+                {
+                    index = start + j;
+                    records.add(list.get(index));
+                    index++;
+                }
+                log.info("current page size = " + records.size());
+                buildData(records);
+            }
+        }
+    }
+
+    private void buildData(List<WaterMeterReplaceLogDto> records) {
+        List<FileData> delList = newArrayList();
+        List<FileData> addList = newArrayList();
+        if (records != null && records.size() > 0) {
+            for (WaterMeterReplaceLogDto record : records) {
+                FileData fileDataDel = new FileData();
+                fileDataDel.setMeterSiteNum(record.getOldWaterNo());
+                fileDataDel.setUserNum(record.getFileNo());
+                fileDataDel.setCommunicationMode("");
+                fileDataDel.setConcentratorCode(record.getConcentratorCode());
+                fileDataDel.setFmaddress(record.getOldWaterNo());
+                fileDataDel.setInstallAddress(record.getLocDesc());
+                fileDataDel.setInstallDate(new Date());
+                fileDataDel.setInstallLatitude("");
+                fileDataDel.setInstallLongitude("");
+                fileDataDel.setMeterCalibre("01");
+                fileDataDel.setMeterCode(record.getFileNo());
+                fileDataDel.setMeterPurposes("");
+                fileDataDel.setMeterStatus("01");
+                fileDataDel.setOperateType("03");
+                fileDataDel.setOutFactoryNum(record.getOldWaterNo());
+                fileDataDel.setSealNum(record.getOldWaterNo());
+                fileDataDel.setSteelSealNum(record.getOldWaterNo());
+                delList.add(fileDataDel);
+
+                FileData fileDataAdd = new FileData();
+                fileDataAdd.setMeterSiteNum(record.getNewWaterNo());
+                fileDataAdd.setUserNum(record.getFileNo());
+                fileDataAdd.setCommunicationMode("");
+                fileDataAdd.setConcentratorCode(record.getConcentratorCode());
+                fileDataAdd.setFmaddress(record.getNewWaterNo());
+                fileDataAdd.setInstallAddress(record.getLocDesc());
+                fileDataAdd.setInstallDate(new Date());
+                fileDataAdd.setInstallLatitude("");
+                fileDataAdd.setInstallLongitude("");
+                fileDataAdd.setMeterCalibre("01");
+                fileDataAdd.setMeterCode(record.getFileNo());
+                fileDataAdd.setMeterPurposes("");
+                fileDataAdd.setMeterStatus("01");
+                fileDataAdd.setOperateType("01");
+                fileDataAdd.setOutFactoryNum(record.getNewWaterNo());
+                fileDataAdd.setSealNum(record.getNewWaterNo());
+                fileDataAdd.setSteelSealNum(record.getNewWaterNo());
+                addList.add(fileDataAdd);
+            }
+        }
+
+        Map<String,Object> delMap = new HashMap<>();
+        delMap.put("data",delList);
+        String delJson  = JSON.toJSONString(delMap);
+        System.out.println(delJson);
+        //dataService.fasttasks("10001",delJson);
+
+        Map<String,Object> addMap = new HashMap<>();
+        addMap.put("data",addList);
+        String addJson  = JSON.toJSONString(addMap);
+        System.out.println(addJson);
+        //dataService.fasttasks("10001",addJson);
+    }
+
+}

+ 153 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/DeviceService.java

@@ -0,0 +1,153 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.zoniot.meter.dao.DeviceMapper;
+import com.zoniot.meter.dto.DeviceDto;
+import com.zoniot.meter.entity.Concentrator;
+import com.zoniot.meter.entity.Device;
+import com.zoniot.meter.model.ConcentratorData;
+import com.zoniot.meter.model.FileData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Slf4j
+@Service
+public class DeviceService {
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    public void addDevice() {
+        List<DeviceDto> list = deviceMapper.findAddDevice();
+        log.info("list size="+list.size());
+        if (list != null && list.size() > 0) {
+            int total = list.size();
+            int pageSize = 5000;
+            int totalPage = total / pageSize;
+            if (total % pageSize != 0) {
+                totalPage++;
+            }
+            for (int i = 1; i <= totalPage; i++)
+            {
+                log.info("current page = " + i);
+                List<DeviceDto> records = newArrayList();
+                int start = (i - 1) * pageSize;
+                int j = 0;
+
+                for (int index = 0; (j < pageSize) && (index < total); j++)
+                {
+                    index = start + j;
+                    records.add(list.get(index));
+                    index++;
+                }
+                log.info("current page size = " + records.size());
+                buildAddData(records);
+            }
+        }
+    }
+
+
+
+    public void updateDevice() {
+        List<DeviceDto> list = deviceMapper.findUpdateDevice();
+        log.info("list size="+list.size());
+        if (list != null && list.size() > 0) {
+            int total = list.size();
+            int pageSize = 5000;
+            int totalPage = total / pageSize;
+            if (total % pageSize != 0) {
+                totalPage++;
+            }
+            for (int i = 1; i <= totalPage; i++)
+            {
+                log.info("current page = " + i);
+                List<DeviceDto> records = newArrayList();
+                int start = (i - 1) * pageSize;
+                int j = 0;
+
+                for (int index = 0; (j < pageSize) && (index < total); j++)
+                {
+                    index = start + j;
+                    records.add(list.get(index));
+                    index++;
+                }
+                log.info("current page size = " + records.size());
+                buildUpdateData(records);
+            }
+        }
+    }
+
+    private void buildUpdateData(List<DeviceDto> records) {
+        List<FileData> list = newArrayList();
+        if (records != null && records.size() > 0) {
+            for (DeviceDto record : records) {
+                FileData fileData = new FileData();
+                fileData.setMeterSiteNum(record.getWaterMeterNo());
+                fileData.setUserNum(record.getWaterMeterFileNo());
+                fileData.setCommunicationMode("");
+                fileData.setConcentratorCode(record.getConcentratorCode());
+                fileData.setFmaddress(record.getWaterMeterNo());
+                fileData.setInstallAddress(record.getLocDesc());
+                fileData.setInstallDate(new Date());
+                fileData.setInstallLatitude("");
+                fileData.setInstallLongitude("");
+                fileData.setMeterCalibre("01");
+                fileData.setMeterCode(record.getWaterMeterFileNo());
+                fileData.setMeterPurposes("");
+                fileData.setMeterStatus("01");
+                fileData.setOperateType("03");
+                fileData.setOutFactoryNum(record.getWaterMeterNo());
+                fileData.setSealNum(record.getWaterMeterNo());
+                fileData.setSteelSealNum(record.getWaterMeterNo());
+                list.add(fileData);
+            }
+        }
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        //dataService.fasttasks("10001",json);
+    }
+
+    private void buildAddData(List<DeviceDto> records) {
+        List<FileData> list = newArrayList();
+        if (records != null && records.size() > 0) {
+            for (DeviceDto record : records) {
+                FileData fileData = new FileData();
+                fileData.setMeterSiteNum(record.getWaterMeterNo());
+                fileData.setUserNum(record.getWaterMeterFileNo());
+                fileData.setCommunicationMode("");
+                fileData.setConcentratorCode(record.getConcentratorCode());
+                fileData.setFmaddress(record.getWaterMeterNo());
+                fileData.setInstallAddress(record.getLocDesc());
+                fileData.setInstallDate(new Date());
+                fileData.setInstallLatitude("");
+                fileData.setInstallLongitude("");
+                fileData.setMeterCalibre("01");
+                fileData.setMeterCode(record.getWaterMeterFileNo());
+                fileData.setMeterPurposes("");
+                fileData.setMeterStatus("01");
+                fileData.setOperateType("01");
+                fileData.setOutFactoryNum(record.getWaterMeterNo());
+                fileData.setSealNum(record.getWaterMeterNo());
+                fileData.setSteelSealNum(record.getWaterMeterNo());
+                list.add(fileData);
+            }
+        }
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        //dataService.fasttasks("10001",json);
+    }
+}

+ 89 - 0
meter-reading-guiyang/src/main/java/com/zoniot/meter/service/MeterReadRecordService.java

@@ -0,0 +1,89 @@
+package com.zoniot.meter.service;
+
+import com.alibaba.fastjson.JSON;
+import com.zoniot.meter.model.ReadData;
+import com.zoniot.meter.model.ReadItem;
+import com.zoniot.meter.repository.MeterReadRecord;
+import com.zoniot.meter.repository.MeterReadRecordRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+@Slf4j
+@Service
+public class MeterReadRecordService {
+
+    @Autowired
+    private MeterReadRecordRepository meterReadRecordRepository;
+
+    public void meterRead(){
+        log.info("begin MeterReadRecordService meterRead");
+        List<MeterReadRecord> list =  meterReadRecordRepository.findByReadDateAndCustomerIdAndReadStatus(20210128,3,"2");
+        log.info("list size="+list.size());
+        if (list != null && list.size() > 0) {
+            int total = list.size();
+            int pageSize = 5000;
+            int totalPage = total / pageSize;
+            if (total % pageSize != 0) {
+                totalPage++;
+            }
+            for (int i = 1; i <= totalPage; i++)
+            {
+                log.info("current page = " + i);
+                List<MeterReadRecord> records = newArrayList();
+                int start = (i - 1) * pageSize;
+                int j = 0;
+
+                for (int index = 0; (j < pageSize) && (index < total); j++)
+                {
+                    index = start + j;
+                    records.add(list.get(index));
+                    index++;
+                }
+                log.info("current page size = " + records.size());
+                buildReadData(records);
+            }
+        }
+    }
+
+    private void buildReadData(List<MeterReadRecord> records) {
+        List<ReadData> list = newArrayList();
+        if (records != null && records.size() > 0) {
+            for (MeterReadRecord record : records) {
+                ReadItem readItem = new ReadItem();
+                readItem.setDataType("20");
+                readItem.setCollectTime(record.getReadTime());
+                readItem.setReceiveTime(new Date());
+                //readItem.setValue(Math.floor(Double.valueOf(record.getReadData())));//向下取整
+                //new BigDecimal(record.getReadData()).setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue()
+
+
+                ReadData readData = new ReadData();
+                readData.setFmaddress(record.getMeterNo());
+                readData.setUserNum(record.getMeterFileNo());
+                readData.setData(newArrayList(readItem));
+                list.add(readData);
+            }
+        }
+
+
+
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",list);
+        String json  = JSON.toJSONString(map);
+        System.out.println(json);
+        //dataService.fasttasks("10201",json);
+    }
+}

+ 52 - 0
meter-reading-guiyang/src/main/resources/application-dev.properties

@@ -0,0 +1,52 @@
+server.port=8081
+agent.guiyang.api-url=http://218.17.45.101:18850
+
+
+##########################################################数据库配置#####################################################
+spring.datasource.url=jdbc:mysql://114.135.61.188:33306/smart_city_sit_6_10?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+spring.datasource.username=root
+spring.datasource.password=100Zone@123
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.datasource.druid.max-wait=60000
+spring.datasource.druid.max-active=20
+spring.datasource.druid.initial-size=5
+spring.datasource.druid.min-idle=5
+spring.datasource.druid.pool-prepared-statements=true
+spring.datasource.druid.max-open-prepared-statements=20
+spring.datasource.druid.test-on-return=false
+spring.datasource.druid.test-on-borrow=true
+spring.datasource.druid.test-while-idle=true
+spring.datasource.druid.validation-query=SELECT 'X'
+spring.datasource.druid.min-evictable-idle-time-millis=300000
+spring.datasource.druid.time-between-eviction-runs-millis=60000
+spring.datasource.druid.filters=stat,wall
+spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+
+
+# redis
+spring.redis.host=114.135.61.188
+spring.redis.port=26379
+spring.redis.password=zoniot
+spring.redis.database=11
+spring.redis.timeout=10000ms
+spring.redis.jedis.pool.max-active=8
+spring.redis.jedis.pool.max-idle=8
+spring.redis.jedis.pool.max-wait=-1ms
+spring.redis.jedis.pool.min-idle=2
+
+
+#########################################XXL Job����#################################################
+xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
+xxl.job.accessToken=
+xxl.job.executor.appname=guiyang-meter-reading-executor
+xxl.job.executor.address=
+xxl.job.executor.ip=
+xxl.job.executor.port=18082
+xxl.job.executor.logpath=/opt/sit/meter-reading-job/xxl-job/jobhandler
+xxl.job.executor.logretentiondays=30
+
+
+#mongodb url
+spring.data.mongodb.uri=mongodb://114.135.61.188:17017/meter-reading-database
+logging.level.org.springframework.data.mongodb.core=DEBUG

+ 50 - 0
meter-reading-guiyang/src/main/resources/application-sit.properties

@@ -0,0 +1,50 @@
+agent.guiyang.api-url=http://218.17.45.101:18850
+
+
+##########################################################数据库配置#####################################################
+spring.datasource.url=jdbc:mysql://114.135.61.188:33306/smart_city_sit_6_10?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+spring.datasource.username=root
+spring.datasource.password=100Zone@123
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.datasource.druid.max-wait=60000
+spring.datasource.druid.max-active=20
+spring.datasource.druid.initial-size=5
+spring.datasource.druid.min-idle=5
+spring.datasource.druid.pool-prepared-statements=true
+spring.datasource.druid.max-open-prepared-statements=20
+spring.datasource.druid.test-on-return=false
+spring.datasource.druid.test-on-borrow=true
+spring.datasource.druid.test-while-idle=true
+spring.datasource.druid.validation-query=SELECT 'X'
+spring.datasource.druid.min-evictable-idle-time-millis=300000
+spring.datasource.druid.time-between-eviction-runs-millis=60000
+spring.datasource.druid.filters=stat,wall
+spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+
+
+# redis
+spring.redis.host=114.135.61.188
+spring.redis.port=26379
+spring.redis.password=zoniot
+spring.redis.database=11
+spring.redis.timeout=10000ms
+spring.redis.jedis.pool.max-active=8
+spring.redis.jedis.pool.max-idle=8
+spring.redis.jedis.pool.max-wait=-1ms
+spring.redis.jedis.pool.min-idle=2
+
+
+#########################################XXL Job����#################################################
+xxl.job.admin.addresses=http://10.0.0.156:8081/xxl-job-admin
+xxl.job.accessToken=
+xxl.job.executor.appname=guiyang-meter-reading-executor
+xxl.job.executor.address=
+xxl.job.executor.ip=
+xxl.job.executor.port=18082
+xxl.job.executor.logpath=/opt/sit/meter-reading-job/xxl-job/jobhandler
+xxl.job.executor.logretentiondays=30
+
+#mongodb url
+spring.data.mongodb.uri=mongodb://114.135.61.188:17017/meter-reading-database
+logging.level.org.springframework.data.mongodb.core=DEBUG

+ 1 - 0
meter-reading-guiyang/src/main/resources/application.properties

@@ -0,0 +1 @@
+spring.profiles.active=dev

+ 259 - 0
meter-reading-guiyang/src/main/resources/mapper/ConcentratorMapper.xml

@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zoniot.meter.dao.ConcentratorMapper">
+  <resultMap id="BaseResultMap" type="com.zoniot.meter.entity.Concentrator">
+    <!--@mbg.generated-->
+    <!--@Table sc_concentrator-->
+    <id column="id" property="id" />
+    <result column="site_id" property="siteId" />
+    <result column="customer_id" property="customerId" />
+    <result column="serial_number" property="serialNumber" />
+    <result column="name" property="name" />
+    <result column="type" property="type" />
+    <result column="province" property="province" />
+    <result column="city" property="city" />
+    <result column="region" property="region" />
+    <result column="building_id" property="buildingId" />
+    <result column="address" property="address" />
+    <result column="device_status" property="deviceStatus" />
+    <result column="device_type" property="deviceType" />
+    <result column="baud_rate" property="baudRate" />
+    <result column="ip" property="ip" />
+    <result column="port" property="port" />
+    <result column="sim_no" property="simNo" />
+    <result column="date_create" property="dateCreate" />
+    <result column="date_update" property="dateUpdate" />
+    <result column="create_by" property="createBy" />
+    <result column="update_by" property="updateBy" />
+    <result column="status" property="status" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, site_id, customer_id, serial_number, `name`, `type`, province, city, region, 
+    building_id, address, device_status, device_type, baud_rate, ip, port, sim_no, date_create, 
+    date_update, create_by, update_by, `status`
+  </sql>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.zoniot.meter.entity.Concentrator" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into sc_concentrator
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="siteId != null">
+        site_id,
+      </if>
+      <if test="customerId != null">
+        customer_id,
+      </if>
+      <if test="serialNumber != null">
+        serial_number,
+      </if>
+      <if test="name != null">
+        `name`,
+      </if>
+      <if test="type != null">
+        `type`,
+      </if>
+      <if test="province != null">
+        province,
+      </if>
+      <if test="city != null">
+        city,
+      </if>
+      <if test="region != null">
+        region,
+      </if>
+      <if test="buildingId != null">
+        building_id,
+      </if>
+      <if test="address != null">
+        address,
+      </if>
+      <if test="deviceStatus != null">
+        device_status,
+      </if>
+      <if test="deviceType != null">
+        device_type,
+      </if>
+      <if test="baudRate != null">
+        baud_rate,
+      </if>
+      <if test="ip != null">
+        ip,
+      </if>
+      <if test="port != null">
+        port,
+      </if>
+      <if test="simNo != null">
+        sim_no,
+      </if>
+      <if test="dateCreate != null">
+        date_create,
+      </if>
+      <if test="dateUpdate != null">
+        date_update,
+      </if>
+      <if test="createBy != null">
+        create_by,
+      </if>
+      <if test="updateBy != null">
+        update_by,
+      </if>
+      <if test="status != null">
+        `status`,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="siteId != null">
+        #{siteId},
+      </if>
+      <if test="customerId != null">
+        #{customerId},
+      </if>
+      <if test="serialNumber != null">
+        #{serialNumber},
+      </if>
+      <if test="name != null">
+        #{name},
+      </if>
+      <if test="type != null">
+        #{type},
+      </if>
+      <if test="province != null">
+        #{province},
+      </if>
+      <if test="city != null">
+        #{city},
+      </if>
+      <if test="region != null">
+        #{region},
+      </if>
+      <if test="buildingId != null">
+        #{buildingId},
+      </if>
+      <if test="address != null">
+        #{address},
+      </if>
+      <if test="deviceStatus != null">
+        #{deviceStatus},
+      </if>
+      <if test="deviceType != null">
+        #{deviceType},
+      </if>
+      <if test="baudRate != null">
+        #{baudRate},
+      </if>
+      <if test="ip != null">
+        #{ip},
+      </if>
+      <if test="port != null">
+        #{port},
+      </if>
+      <if test="simNo != null">
+        #{simNo},
+      </if>
+      <if test="dateCreate != null">
+        #{dateCreate},
+      </if>
+      <if test="dateUpdate != null">
+        #{dateUpdate},
+      </if>
+      <if test="createBy != null">
+        #{createBy},
+      </if>
+      <if test="updateBy != null">
+        #{updateBy},
+      </if>
+      <if test="status != null">
+        #{status},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.zoniot.meter.entity.Concentrator">
+    <!--@mbg.generated-->
+    update sc_concentrator
+    <set>
+      <if test="siteId != null">
+        site_id = #{siteId},
+      </if>
+      <if test="customerId != null">
+        customer_id = #{customerId},
+      </if>
+      <if test="serialNumber != null">
+        serial_number = #{serialNumber},
+      </if>
+      <if test="name != null">
+        `name` = #{name},
+      </if>
+      <if test="type != null">
+        `type` = #{type},
+      </if>
+      <if test="province != null">
+        province = #{province},
+      </if>
+      <if test="city != null">
+        city = #{city},
+      </if>
+      <if test="region != null">
+        region = #{region},
+      </if>
+      <if test="buildingId != null">
+        building_id = #{buildingId},
+      </if>
+      <if test="address != null">
+        address = #{address},
+      </if>
+      <if test="deviceStatus != null">
+        device_status = #{deviceStatus},
+      </if>
+      <if test="deviceType != null">
+        device_type = #{deviceType},
+      </if>
+      <if test="baudRate != null">
+        baud_rate = #{baudRate},
+      </if>
+      <if test="ip != null">
+        ip = #{ip},
+      </if>
+      <if test="port != null">
+        port = #{port},
+      </if>
+      <if test="simNo != null">
+        sim_no = #{simNo},
+      </if>
+      <if test="dateCreate != null">
+        date_create = #{dateCreate},
+      </if>
+      <if test="dateUpdate != null">
+        date_update = #{dateUpdate},
+      </if>
+      <if test="createBy != null">
+        create_by = #{createBy},
+      </if>
+      <if test="updateBy != null">
+        update_by = #{updateBy},
+      </if>
+      <if test="status != null">
+        `status` = #{status},
+      </if>
+    </set>
+    where id = #{id}
+  </update>
+  <insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into sc_concentrator
+    (site_id, customer_id, serial_number, `name`, `type`, province, city, region, building_id, 
+      address, device_status, device_type, baud_rate, ip, port, sim_no, date_create, 
+      date_update, create_by, update_by, `status`)
+    values
+    <foreach collection="list" item="item" separator=",">
+      (#{item.siteId}, #{item.customerId}, #{item.serialNumber}, #{item.name}, #{item.type}, 
+        #{item.province}, #{item.city}, #{item.region}, #{item.buildingId}, #{item.address}, 
+        #{item.deviceStatus}, #{item.deviceType}, #{item.baudRate}, #{item.ip}, #{item.port}, 
+        #{item.simNo}, #{item.dateCreate}, #{item.dateUpdate}, #{item.createBy}, #{item.updateBy}, 
+        #{item.status})
+    </foreach>
+  </insert>
+
+  <select id="findAdd" resultMap="BaseResultMap">
+    SELECT * from sc_concentrator WHERE DATEDIFF(date_create,NOW())=-1
+  </select>
+</mapper>

+ 24 - 0
meter-reading-guiyang/src/main/resources/mapper/DeviceMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zoniot.meter.dao.DeviceMapper">
+
+  <select id="findAddDevice" resultType="com.zoniot.meter.dto.DeviceDto">
+    SELECT
+            sd.*,
+            sc.serial_number as concentrator_code
+    from sc_device sd
+    left join sc_water_related_device swrd on(swrd.device_id = sd.id)
+    left join sc_concentrator sc on(sc.id = swrd.concentrator_id)
+    WHERE sd.status = 1 and DATEDIFF(sd.date_create,NOW())=-1
+  </select>
+
+  <select id="findUpdateDevice" resultType="com.zoniot.meter.dto.DeviceDto">
+    SELECT
+            sd.*,
+            sc.serial_number as concentrator_code
+    from sc_device sd
+                 left join sc_water_related_device swrd on(swrd.device_id = sd.id)
+                 left join sc_concentrator sc on(sc.id = swrd.concentrator_id)
+    WHERE sd.status = 1 and DATEDIFF(sd.date_update,NOW())=-1
+  </select>
+</mapper>

+ 17 - 0
meter-reading-guiyang/src/main/resources/mapper/WaterMeterReplaceLogMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zoniot.meter.dao.WaterMeterReplaceLogMapper">
+
+  <select id="findAdd" resultType="com.zoniot.meter.dto.WaterMeterReplaceLogDto">
+    SELECT
+            swmrl.*,
+            sd.water_meter_file_no as fiile_no,
+            sd.loc_desc,
+            sc.serial_number as concentrator_code
+    from sc_water_meter_replace_log swmrl
+    left join sc_device sd on(sd.id = swmrl.device_id)
+    left join sc_water_related_device swrd on(swrd.device_id = swmrl.device_id)
+    left join sc_concentrator sc on(sc.id = swrd.concentrator_id)
+    WHERE swmrl.status = 1 and sd.status = 1 and DATEDIFF(swmrl.date_create,NOW())=-1 order by swmrl.date_create asc
+  </select>
+</mapper>

+ 13 - 0
meter-reading-guiyang/src/test/java/com/zoniot/meter/MeterReadingGuiyangApplicationTests.java

@@ -0,0 +1,13 @@
+package com.zoniot.meter;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MeterReadingGuiyangApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}