From 11c7a9b0270cbf529ebb5e434b5fe0593dd209f0 Mon Sep 17 00:00:00 2001
From: Administrator <zhubaomin>
Date: 星期四, 30 五月 2024 09:43:01 +0800
Subject: [PATCH] 2024-05-30 朱宝民 添加微信和手机App两个子模块

---
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/application.yml                                        |   18 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/log4j2.yml                                             |   73 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java         |    3 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.mvn/wrapper/maven-wrapper.properties                                  |   18 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java                 |  143 ++-
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml                                                                |  140 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-app/pom.xml                                                                   |  140 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/PipIrrAppApplication.java                  |   28 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/test/java/com/dy/pipIrrApp/PipIrrWebAppApplicationTests.java          |   13 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebFilterConfiguration.java         |   51 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java                |   24 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw                                                                      |  250 ++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java                     |   37 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.gitignore                                                             |   33 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw                                                                   |  250 ++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw.cmd                                                               |  146 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/RestTemplateConfig.java             |   21 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw.cmd                                                                  |  146 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java               |   34 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/log4j2.yml                                          |   73 +
 pipIrr-platform/pipIrr-web/pipIrr-web-app/.mvn/wrapper/maven-wrapper.properties                                     |   18 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/PipIrrWechatApplication.java         |   28 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebFilterConfiguration.java   |   51 +
 pipIrr-platform/pipIrr-web/pipIrr-web-app/.gitignore                                                                |   33 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RestTemplateConfig.java       |   21 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml                                  |   35 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/result/AppResultCode.java                  |   21 
 pipIrr-platform/pipIrr-web/pom.xml                                                                                  |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmCommandHistory.java                        |   11 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml                                      |   11 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java                       |   15 
 pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebListenerConfiguration.java       |   68 +
 /dev/null                                                                                                           |  179 ----
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java         |   21 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebListenerConfiguration.java |   68 +
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/test/java/com/dy/pipIrrWechat/PipIrrWebWechatApplicationTests.java |   13 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application.yml                                     |   18 
 pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml                                             |    9 
 38 files changed, 1,978 insertions(+), 285 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java
index 4c3f20a..4b94e9e 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java
@@ -88,9 +88,16 @@
     Integer deleteIntakeId(@Param("controllerId") Long controllerId);
 
     /**
-     * 鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒鍦板潃
-     * @param intakeId 鍙栨按鍙D
-     * @return 闃�鎺у櫒鍦板潃
+     * 鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒瀵硅薄
+     * @param intakeId
+     * @return
      */
-    String getRtuAddrByIntakeId(Long intakeId);
+    PrController getControllerByIntakeId(Long intakeId);
+
+    /**
+     * 鏍规嵁RTU鍦板潃鑾峰彇闃�鎺у櫒瀵硅薄
+     * @param rtuAddr
+     * @return
+     */
+    PrController getControllerByRtuAddr(String rtuAddr);
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmCommandHistory.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmCommandHistory.java
index 6f97065..d935b7a 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmCommandHistory.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmCommandHistory.java
@@ -15,7 +15,6 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.dy.common.po.BaseEntity;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
@@ -31,7 +30,7 @@
 @ToString
 @NoArgsConstructor
 @AllArgsConstructor
-public class RmCommandHistory implements BaseEntity {
+public class RmCommandHistory {
     public static final long serialVersionUID = 202401151517005L;
 
     /**
@@ -54,10 +53,16 @@
     private String commandName;
 
     /**
+     * 鍙栨按鍙D
+     */
+    @NotNull(message = "鍙栨按鍙D涓嶈兘涓虹┖")
+    private Long intakeId;
+
+    /**
      * 闃�鎺у櫒鍦板潃
      */
     @NotBlank(message = "闃�鎺у櫒鍦板潃涓嶈兘涓虹┖")
-    private String rtuaddr;
+    private String rtuAddr;
 
     /**
      * 閫氳鍗忚
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
index 5c588fd..9fd4b6a 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -115,7 +115,14 @@
         webPort: 8086
         actutorPort: 9086
         idSuffix: 8
-
+    wechat:
+        webPort: 8087
+        actutorPort: 9087
+        idSuffix: 9
+    app:
+        webPort: 8088
+        actutorPort: 9088
+        idSuffix: 10
 #椤圭洰缂栧彿
 #projectCode:
 #    ym: 100
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml
index 40f061c..928d0a5 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml
@@ -252,8 +252,13 @@
     SELECT COUNT(*) AS recordCount FROM pr_controller WHERE rtuAddr = (SELECT rtuAddr FROM pr_controller_tramp WHERE id = ${controllerId}) AND intakeId IS NOT NULL
   </select>
 
-  <!--鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒鍦板潃-->
-  <select id="getRtuAddrByIntakeId" resultType="java.lang.String">
-    SELECT rtuAddr FROM pr_controller WHERE deleted = 0 AND intakeId = #{intakeId} LIMIT 0,1
+  <!--鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒瀵硅薄-->
+  <select id="getControllerByIntakeId" resultType="com.dy.pipIrrGlobal.pojoPr.PrController">
+    SELECT * FROM pr_controller WHERE deleted = 0 AND intakeId = #{intakeId} LIMIT 0,1
+  </select>
+
+  <!--鏍规嵁RTU鍦板潃鑾峰彇闃�鎺у櫒瀵硅薄-->
+  <select id="getControllerByRtuAddr" resultType="com.dy.pipIrrGlobal.pojoPr.PrController">
+    SELECT * FROM pr_controller WHERE deleted = 0 AND rtuAddr = #{rtuAddr} LIMIT 0,1
   </select>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
index 3bc43bd..9523312 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
@@ -7,7 +7,8 @@
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="command_code" jdbcType="VARCHAR" property="commandCode" />
     <result column="command_name" jdbcType="VARCHAR" property="commandName" />
-    <result column="rtuAddr" jdbcType="VARCHAR" property="rtuaddr" />
+    <result column="intake_id" jdbcType="BIGINT" property="intakeId" />
+    <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr" />
     <result column="protocol" jdbcType="VARCHAR" property="protocol" />
     <result column="param" property="param" jdbcType="JAVA_OBJECT" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
     <result column="send_time" jdbcType="TIMESTAMP" property="sendTime" />
@@ -18,7 +19,7 @@
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
-    id, command_code, command_name, rtuAddr, protocol, param, send_time, `operator`, 
+    id, command_code, command_name, intake_id, rtu_addr, protocol, param, send_time, `operator`,
     `result`, result_time, result_text
   </sql>
   <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
@@ -36,11 +37,11 @@
   <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmCommandHistory">
     <!--@mbg.generated-->
     insert into rm_command_history (id, command_code, command_name, 
-      rtuAddr, protocol, param, 
+      intake_id, rtu_addr, protocol, param,
       send_time, `operator`, `result`, 
       result_time, result_text)
-    values (#{id,jdbcType=BIGINT}, #{commandCode,jdbcType=VARCHAR}, #{commandName,jdbcType=VARCHAR}, 
-      #{rtuaddr,jdbcType=VARCHAR}, #{protocol,jdbcType=VARCHAR}, #{param,jdbcType= JAVA_OBJECT, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler},
+    values (#{id,jdbcType=BIGINT}, #{commandCode,jdbcType=VARCHAR}, #{commandName,jdbcType=VARCHAR}, #{intakeId,jdbcType=BIGINT},
+      #{rtuAddr,jdbcType=VARCHAR}, #{protocol,jdbcType=VARCHAR}, #{param,jdbcType= JAVA_OBJECT, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler},
       #{sendTime,jdbcType=TIMESTAMP}, #{operator,jdbcType=BIGINT}, #{result,jdbcType=TINYINT}, 
       #{resultTime,jdbcType=TIMESTAMP}, #{resultText,jdbcType= JAVA_OBJECT, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler})
   </insert>
@@ -57,8 +58,11 @@
       <if test="commandName != null">
         command_name,
       </if>
-      <if test="rtuaddr != null">
-        rtuAddr,
+      <if test="intakeId != null">
+        intake_id,
+      </if>
+      <if test="rtuAddr != null">
+        rtu_addr,
       </if>
       <if test="protocol != null">
         protocol,
@@ -92,8 +96,11 @@
       <if test="commandName != null">
         #{commandName,jdbcType=VARCHAR},
       </if>
-      <if test="rtuaddr != null">
-        #{rtuaddr,jdbcType=VARCHAR},
+      <if test="intakeId != null">
+        #{intakeId,jdbcType=BIGINT},
+      </if>
+      <if test="rtuAddr != null">
+        #{rtuAddr,jdbcType=VARCHAR},
       </if>
       <if test="protocol != null">
         #{protocol,jdbcType=VARCHAR},
@@ -128,8 +135,11 @@
       <if test="commandName != null">
         command_name = #{commandName,jdbcType=VARCHAR},
       </if>
-      <if test="rtuaddr != null">
-        rtuAddr = #{rtuaddr,jdbcType=VARCHAR},
+      <if test="intakeId != null">
+        intake_id = #{intakeId,jdbcType=BIGINT},
+      </if>
+      <if test="rtuAddr != null">
+        rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
       </if>
       <if test="protocol != null">
         protocol = #{protocol,jdbcType=VARCHAR},
@@ -160,7 +170,8 @@
     update rm_command_history
     set command_code = #{commandCode,jdbcType=VARCHAR},
       command_name = #{commandName,jdbcType=VARCHAR},
-      rtuAddr = #{rtuaddr,jdbcType=VARCHAR},
+      intake_id = #{intakeId,jdbcType=BIGINT},
+      rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
       protocol = #{protocol,jdbcType=VARCHAR},
       param = #{param,jdbcType= JAVA_OBJECT, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler},
       send_time = #{sendTime,jdbcType=TIMESTAMP},
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/.gitignore b/pipIrr-platform/pipIrr-web/pipIrr-web-app/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/.mvn/wrapper/maven-wrapper.properties b/pipIrr-platform/pipIrr-web/pipIrr-web-app/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..aeccdfd
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# 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.
+wrapperVersion=3.3.1
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw b/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw
new file mode 100644
index 0000000..ba9212a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw
@@ -0,0 +1,250 @@
+#!/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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.1
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  if [ -n "${JAVA_HOME-}" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl="${value-}" ;;
+  distributionSha256Sum) distributionSha256Sum="${value-}" ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw.cmd b/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw.cmd
new file mode 100644
index 0000000..406932d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/mvnw.cmd
@@ -0,0 +1,146 @@
+<# : batch portion
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    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 Apache Maven Wrapper startup batch script, version 3.3.1
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-app/pom.xml
new file mode 100644
index 0000000..5f3bb83
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/pom.xml
@@ -0,0 +1,140 @@
+<?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>
+        <artifactId>pipIrr-web</artifactId>
+        <groupId>com.dy</groupId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <packaging>jar</packaging>
+    <artifactId>pipIrr-web-app</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>pipIrr-web-app</name>
+    <description>鎵嬫満App</description>
+
+
+    <build>
+        <plugins>
+            <!-- 鐢熸垚涓嶅寘鍚緷璧杍ar鐨勫彲鎵цjar鍖�
+            <plugin>
+                !- spring boot鎻愪緵鐨刴aven鎵撳寘鎻掍欢 -
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        !-
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        -
+                        <configuration>
+                            !- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar  -
+                            <classifier>execute</classifier>
+                            !- 涓嶆寚瀹氱敓鎴愯矾寰勭殑璇�, 榛樿淇濆瓨鍦� ${build.directory} 涓� -
+                            <outputDirectory>${project.build.directory}/execute</outputDirectory>
+                            <finalName>${artifactId}-${version}</finalName>
+                            <layout>ZIP</layout>
+                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
+                            <includes>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-common</artifactId>
+                                </include>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-global</artifactId>
+                                </include>
+                            </includes>
+                            <excludes>
+                                <exclude>
+                                    <groupId>org.projectlombok</groupId>
+                                    <artifactId>lombok</artifactId>
+                                </exclude>
+                            </excludes>
+                        </configuration>
+                    </execution>
+                </executions>
+
+            </plugin>
+            -->
+            <!-- 鎷疯礉渚濊禆鐨刯ar鍖呭埌lib鐩綍-->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <configuration>
+                            <!-- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar
+                            <classifier>execute</classifier>
+                            -->
+                            <!-- ${project.build.directory}鏄痬aven鍙橀噺锛屽唴缃殑锛岃〃绀簍arget鐩綍,濡傛灉涓嶅啓锛屽皢鍦ㄦ牴鐩綍涓嬪垱寤�/lib -->
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <!-- excludeTransitive:鏄惁涓嶅寘鍚棿鎺ヤ緷璧栧寘锛屾瘮濡傛垜浠緷璧朅锛屼絾鏄疉鍙堜緷璧栦簡B锛屾垜浠槸鍚︿篃瑕佹妸B鎵撹繘鍘� 榛樿涓嶆墦-->
+                            <excludeTransitive>false</excludeTransitive>
+                            <!-- 澶嶅埗鐨刯ar鏂囦欢鍘绘帀鐗堟湰淇℃伅 -->
+                            <stripVersion>false</stripVersion>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <layout>ZIP</layout>
+                            <mainClass>com.dy.pipIrrRemote.PipIrrRemoteApplication</mainClass>
+                            <includes>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-common</artifactId>
+                                </include>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-global</artifactId>
+                                </include>
+                            </includes>
+                            <excludes>
+                                <exclude>
+                                    <groupId>org.projectlombok</groupId>
+                                    <artifactId>lombok</artifactId>
+                                </exclude>
+                            </excludes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <!-- 璁剧疆java缂栬瘧鐗堟湰锛岃繍琛岀幆澧冪増鏈� -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <!-- source锛� 婧愪唬鐮佺紪璇戠増鏈紱target锛� 鐩爣骞冲彴缂栬瘧鐗堟湰锛沞ncoding锛� 瀛楃闆嗙紪鐮併�� -->
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${encoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- 瑙e喅璧勬簮鏂囦欢鐨勭紪鐮侀棶棰� -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>${encoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- maven閲屾墽琛屾祴璇曠敤渚嬬殑鎻掍欢 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- 涓嬮潰瑙e喅锛氬綋杩涜Maven Lifecycle package鏃舵姤閿欙細Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)-->
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/PipIrrAppApplication.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/PipIrrAppApplication.java
new file mode 100644
index 0000000..9d551cb
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/PipIrrAppApplication.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrApp;
+
+import com.dy.common.multiDataSource.EnableMultiDataSource;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.context.annotation.FilterType;
+
+@SpringBootApplication
+@EnableAspectJAutoProxy
+@EnableMultiDataSource
+@ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.pipIrrApp"},
+        excludeFilters = {
+                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
+                        com.dy.common.singleDataSource.DruidDataSourceConfig.class //鎺掗櫎鍗曟暟鎹簮
+                })
+        }
+)
+@MapperScan(basePackages={"com.dy.pipIrrGlobal.daoRm", "com.dy.pipIrrGlobal.daoPr", "com.dy.pipIrrGlobal.daoSe", "com.dy.pipIrrGlobal.daoBa"})
+public class PipIrrAppApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(PipIrrAppApplication.class, args);
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/RestTemplateConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/RestTemplateConfig.java
new file mode 100644
index 0000000..a59cc7c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/RestTemplateConfig.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrApp.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 17:09
+ * @LastEditTime 2024-05-07 17:09
+ * @Description
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebFilterConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebFilterConfiguration.java
new file mode 100644
index 0000000..d03d230
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebFilterConfiguration.java
@@ -0,0 +1,51 @@
+package com.dy.pipIrrApp.config;
+
+import com.dy.common.webFilter.DevOfDataSourceNameSetFilter;
+import com.dy.common.webFilter.UserTokenFilter;
+import jakarta.servlet.Filter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 14:51
+ * @LastEditTime 2024-05-07 14:51
+ * @Description
+ */
+@Configuration
+public class WebFilterConfiguration {
+
+    @Value("${pipIrr.global.dev}")
+    public String isDevStage ;//鏄惁涓哄紑鍙戦樁娈�
+    @Value("${pipIrr.global.dsName}")
+    public String dsName ;//寮�鍙戦樁娈电殑鏁版嵁婧愬悕绉�
+
+    /**
+     * DevOfDataSourceNameSetFilter涓嶶serTokenFilter鍙兘涓�涓閰嶇疆涓婏紝
+     * 鎵�浠ヤ粬浠殑order閮芥槸1
+     */
+    private static final int order_UserTokenFilter = 1 ;//涓庝笅闈�
+    private static final int order_DevOfDataSourceNameSetFilter = 1 ;
+
+
+    @Bean
+    public FilterRegistrationBean<? extends Filter> RegFilter() {
+        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
+        if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){
+            filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter());
+            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
+            filterRegistrationBean.addInitParameter("dataSourceName",dsName);//璁剧疆init鍙傛暟
+            filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
+            filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//鎵ц娆″簭
+        }else{
+            filterRegistrationBean.setFilter(new UserTokenFilter());
+            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
+            filterRegistrationBean.setName("UserTokenFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
+            filterRegistrationBean.setOrder(order_UserTokenFilter);//鎵ц娆″簭
+        }
+        return filterRegistrationBean;
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebListenerConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebListenerConfiguration.java
new file mode 100644
index 0000000..2fc5095
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/config/WebListenerConfiguration.java
@@ -0,0 +1,68 @@
+package com.dy.pipIrrApp.config;
+
+import com.dy.common.webListener.GenerateIdSetSuffixListener;
+import jakarta.servlet.ServletContextListener;
+import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 14:52
+ * @LastEditTime 2024-05-07 14:52
+ * @Description
+ */
+@Configuration
+public class WebListenerConfiguration {
+
+    /**
+     * 鍚姩椤哄簭
+     */
+    //private static final int order_config = 0 ;
+    private static final int order_idSetSuffix = 1 ;
+    //private static final int order_init = 2 ;
+
+    /*
+    * 瑙f瀽鍚勭***.config閰嶇疆鐨凜onfigListener锛屾殏鏃朵笉閲囩敤姝ょ閰嶇疆鏂瑰紡
+    *
+    @Bean
+    public ConfigListener getGlConfigListener(){
+        return new ConfigListener() ;
+    }
+    /**
+     * 澶栭儴鎻愪緵Listener
+     * @param listener 澶栭儴鎻愪緵Listener
+     * @return 娉ㄥ唽Bean
+    @Bean
+    public ServletListenerRegistrationBean<? extends ServletContextListener> regConfigListener(ConfigListener listener) {
+        ServletListenerRegistrationBean<ConfigListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+        listenerRegistrationBean.setListener(listener);
+        listenerRegistrationBean.setOrder(order_config);
+        return listenerRegistrationBean;
+    }
+    */
+
+    /**
+     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屾牴鎹厤缃� 璁剧疆ID浜х敓鍣ㄧ殑鍚庣紑
+     * @return 娉ㄥ唽Bean
+     */
+    @Bean
+    public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() {
+        ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+        listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener());
+        listenerRegistrationBean.setOrder(order_idSetSuffix);
+        return listenerRegistrationBean;
+    }
+
+//    /**
+//     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屽垵濮嬪寲鏁版嵁搴撴暟鎹�
+//     * @return 娉ㄥ唽Bean
+//     */
+//    @Bean
+//    public ServletListenerRegistrationBean<? extends ServletContextListener> regInitListener() {
+//        ServletListenerRegistrationBean<InitListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+//        listenerRegistrationBean.setListener(new InitListener());
+//        listenerRegistrationBean.setOrder(order_init);
+//        return listenerRegistrationBean;
+//    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/result/AppResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/result/AppResultCode.java
new file mode 100644
index 0000000..71e750d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/result/AppResultCode.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrApp.result;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-30 9:37
+ * @LastEditTime 2024-05-30 9:37
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum AppResultCode {
+
+    XXX(10001,"XXX");
+
+    private final Integer code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/application.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/application.yml
new file mode 100644
index 0000000..c8fd58f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/application.yml
@@ -0,0 +1,18 @@
+spring:
+    profiles:
+        include: global, database, database-ym, database-pj
+
+#actutor鐨剋eb绔彛
+management:
+    server:
+        port: ${pipIrr.app.actutorPort}
+#web鏈嶅姟绔彛锛宼omcat榛樿鏄�8088
+server:
+    port: ${pipIrr.app.webPort}
+    servlet:
+        context-path: /app #web璁块棶涓婁笅鏂囪矾寰�
+        context-parameters:
+            #GenerateIdSetSuffixListener涓簲鐢紝鍙栧�艰寖鍥存槸0-99
+            idSuffix: ${pipIrr.app.idSuffix}
+            #ConfigListener涓簲鐢�
+            #configFileNames: config-global.xml,config-demo.xml
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/log4j2.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/log4j2.yml
new file mode 100644
index 0000000..b42623a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/resources/log4j2.yml
@@ -0,0 +1,73 @@
+Configuration:
+    #status锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭锛涘彲浠ヨ缃垚Off(鍏抽棴)鎴朎rror(鍙緭鍑洪敊璇俊鎭�)
+    status: Error
+
+    Properties: # 瀹氫箟鍏ㄥ眬鍙橀噺
+        Property:
+            #鏃ュ織鏂囦欢瀛樺偍鐨勭洰褰�
+            - name: log.path
+              value: ./logs
+            #鏃ュ織鏂囦欢瀛樺偍鍚嶇О
+            - name: project.name
+              value: pipIrrRemote
+
+    #瀹氫箟杈撳嚭鍣紝鍙互杈撳嚭鍒版帶鍒跺彴鍜屾枃浠�.
+    Appenders:
+        #杈撳嚭鍒版帶鍒跺彴
+        Console:
+            #Appender鍛藉悕
+            name: CONSOLE
+            target: SYSTEM_OUT
+            ThresholdFilter:
+                level: debug #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
+                onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
+                onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
+            #鏃ュ織鍐呭鏍峰紡
+            PatternLayout:
+                #%n-鎹㈣
+                #%m-鏃ュ織鍐呭锛岃緭鍑轰唬鐮佷腑鎸囧畾鐨勬棩蹇椾俊鎭�
+                #%p-杈撳嚭浼樺厛绾э紝鍗矰EBUG,INFO,WARN,ERROR,FATAL
+                #%r-绋嬪簭鍚姩鍒扮幇鍦ㄧ殑姣鏁�
+                #%%- 杈撳嚭涓�涓�"%" 瀛楃
+                #%t-褰撳墠绾跨▼鍚�
+                #%d-鏃ユ湡鍜屾椂闂�, 甯哥敤鐨勬牸寮忔湁%d{DATE},%d{ABSOLUTE},%d{HH:mm:ss,SSS},%d{ddMMyyyyHH:mm:ss,SSS}
+                #%l-鍚�%F%L%C%M
+                #%F-java婧愭枃浠跺悕
+                #%L-java婧愮爜琛屾暟
+                #%C-java绫诲悕,%C{1}杈撳嚭鏈�鍚庝竴涓厓绱�
+                #%M-java鏂规硶鍚�
+                pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
+        # 杈撳嚭鍒版枃浠讹紝瓒呰繃10MB褰掓。
+        RollingFile:
+            - name: ROLLING_FILE
+              ignoreExceptions: false
+              fileName: ${log.path}/${project.name}.log
+              filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
+              ThresholdFilter:
+                  level: error #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
+                  onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
+                  onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
+              #鏃ュ織鍐呭鏍峰紡
+              PatternLayout:
+                  pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
+              Policies:
+                  SizeBasedTriggeringPolicy:
+                      size: "10 MB"
+              DefaultRolloverStrategy:
+                  max: 1000
+
+    Loggers:
+        Root:
+            level: info #鏃ュ織杈撳嚭绾у埆锛屽叡鏈�8涓骇鍒紝鎸夌収浠庝綆鍒伴珮涓猴細all < trace < debug < info < warn < error < fatal < off
+            AppenderRef: #Root鐨勫瓙鑺傜偣锛岀敤鏉ユ寚瀹氳鏃ュ織杈撳嚭鍒板摢涓狝ppender.
+                - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+                - ref: ROLLING_FILE  #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+        # 涓哄寘閰嶇疆鐗规畩鐨凩og绾у埆锛屾柟渚胯皟璇曪紝
+        # 涓嶅彈Loggers.Root.level闄愬埗
+        Logger:
+            - name: com.dy.pipIrrGlobal.daoBa
+              additivity: false #鍘婚櫎閲嶅鐨刲og
+              level: debug #杈撳嚭鏃ュ織绾у埆
+              AppenderRef:
+                  - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+                  - ref: ROLLING_FILE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/test/java/com/dy/pipIrrApp/PipIrrWebAppApplicationTests.java b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/test/java/com/dy/pipIrrApp/PipIrrWebAppApplicationTests.java
new file mode 100644
index 0000000..5e6013c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-app/src/test/java/com/dy/pipIrrApp/PipIrrWebAppApplicationTests.java
@@ -0,0 +1,13 @@
+package com.dy.pipIrrApp;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PipIrrWebAppApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java
index 7994a33..7a81f76 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java
@@ -6,7 +6,6 @@
 import com.dy.common.mw.protocol.CommandType;
 import com.dy.common.mw.protocol.Data;
 import com.dy.common.mw.protocol.p206V202404.CodeV202404;
-import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404;
 import com.dy.common.mw.protocol.p206V202404.downVos.ComCdXyVo;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
@@ -52,15 +51,14 @@
     protected static String controllerType = "57" ;//鎺у埗鍣ㄧ被鍨�
     protected static Integer projectNo = 100 ;//椤圭洰缂栫爜
 
-    protected static String icCardAddr = "04BEA5BB" ;//IC鍗″湴鍧�
-    protected static String icCardNo = "37142501020500001" ;//IC鍗$紪鍙凤紙鐢ㄦ埛鍗″簭鍒楀彿锛�
-
-    protected String protocolName = ProtocolConstantV206V202404.protocolName;
+    //protected static String icCardAddr = "04BEA5BB" ;//IC鍗″湴鍧�
+    //protected static String icCardNo = "37142501020500001" ;//IC鍗$紪鍙凤紙鐢ㄦ埛鍗″簭鍒楀彿锛�
+    //protected String protocolName = ProtocolConstantV206V202404.protocolName;
 
     protected String commandTypeOuter = CommandType.outerCommand;
 
     // 瀛樺偍瀹炰緥鍖栫殑 CompletableFuture<Data> 瀵硅薄
-    protected static Map<String, Object> features = new HashMap<>();
+    protected static Map<Long, Object> features = new HashMap<>();
     protected static Boolean setuped = false;
 
     @Autowired
@@ -83,7 +81,7 @@
      * 鑾峰彇绯荤粺閰嶇疆鍙傛暟
      */
     public void setUp() {
-        protocolName = comSupport.baSettingsMapper.getItemValue("protocolName");
+        //protocolName = comSupport.baSettingsMapper.getItemValue("protocolName");
         controllerType = comSupport.baSettingsMapper.getItemValue("controllerType");
         projectNo = Integer.parseInt(comSupport.baSettingsMapper.getItemValue("projectNo"));
         setuped = true;
@@ -98,18 +96,22 @@
 
     /**
      * 鍒涘缓鍛戒护鏃ュ織瀵硅薄
+     * @param comId 涓婚敭
      * @param commandCode 鍔熻兘鐮�
      * @param rtuAddr 闃�鎺у櫒鍦板潃
+     * @param protocol 閫氳鍗忚鍚嶇О
      * @param param 鍙傛暟鏁版嵁
      * @param operator 鎿嶄綔鍛�
-     * @return 闆堕浂鏃ュ織瀵硅薄
+     * @return
      */
-    protected RmCommandHistory getComHistory(String commandCode, String rtuAddr, Object param, Long operator ) {
+    protected RmCommandHistory getComHistory(Long comId, String commandCode, Long intakeId, String rtuAddr, String protocol, Object param, Long operator ) {
         RmCommandHistory rmCommandHistory = new RmCommandHistory();
+        rmCommandHistory.setId(comId);
         rmCommandHistory.setCommandCode(commandCode);
         rmCommandHistory.setCommandName(CodeV202404.getCodeName(commandCode));
-        rmCommandHistory.setRtuaddr(rtuAddr);
-        rmCommandHistory.setProtocol(protocolName);
+        rmCommandHistory.setIntakeId(intakeId);
+        rmCommandHistory.setRtuAddr(rtuAddr);
+        rmCommandHistory.setProtocol(protocol);
         rmCommandHistory.setParam((JSONObject) JSON.toJSON(param));
         rmCommandHistory.setSendTime(new Date());
         rmCommandHistory.setOperator(operator);
@@ -124,13 +126,13 @@
      * @param param 鍙傛暟鏁版嵁
      * @return 鏋勯�犲ソ鐨勫懡浠ゅ璞�
      */
-    protected Command command(String comId, String commandCode, String rtuAddr, Object param){
+    protected Command command(Long comId, String commandCode, String rtuAddr, String protocol, Object param){
         Command com = new Command() ;
-        com.id = comId==null?Command.defaultId:(comId.trim().equals("")?Command.defaultId:comId);
+        com.id = String.valueOf(comId);
         com.code = commandCode ;
         com.rtuAddr = rtuAddr ;
 
-        com.protocol = protocolName;
+        com.protocol = protocol;
         com.type = commandTypeOuter;
         com.rtuResultSendWebUrl = rtuResultSendWebUrl ;
 
@@ -144,13 +146,13 @@
      * @param comId
      * @return
      */
-    protected BaseResponse<Data> dealWithCallBack(String comId) {
+    protected BaseResponse<Data> dealWithCallBack(Long comId) {
         CompletableFuture<Data> featureObject = new CompletableFuture<>();
         features.put(comId, featureObject);
         try {
             CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId);
             System.out.println("receive result ID:" + comId);
-            Data resultData = feature.get(30, TimeUnit.SECONDS);
+            Data resultData = feature.get(10, TimeUnit.SECONDS);
             features.remove(comId);
             String commandId = resultData.getCommandId();
             if(commandId.equals(comId)) {
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
index cf75af5..c640895 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
@@ -9,6 +9,7 @@
 import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper;
 import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
 import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
+import com.dy.pipIrrGlobal.pojoPr.PrController;
 import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
 import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
 import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
@@ -40,12 +41,21 @@
     private final PrIntakeMapper prIntakeMapper;
 
     /**
-     * 鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒鍦板潃
-     * @param intakeId 鍙栨按鍙D
-     * @return 闃�鎺у櫒鍦板潃
+     * 鏍规嵁鍙栨按鍙D鑾峰彇闃�鎺у櫒瀵硅薄
+     * @param intakeId
+     * @return
      */
-    public String getRtuAddrByIntakeId(Long intakeId) {
-        return prControllerMapper.getRtuAddrByIntakeId(intakeId);
+    public PrController getControllerByIntakeId(Long intakeId) {
+        return prControllerMapper.getControllerByIntakeId(intakeId);
+    }
+
+    /**
+     * 鏍规嵁RTU鍦板潃鑾峰彇闃�鎺у櫒瀵硅薄
+     * @param rtuAddr
+     * @return
+     */
+    public PrController getControllerByRtuAddr(String rtuAddr) {
+        return prControllerMapper.getControllerByRtuAddr(rtuAddr);
     }
 
     /**
@@ -53,9 +63,9 @@
      * @param po 鍛戒护鏃ュ織瀵硅薄
      * @return 瀛楃涓茬被鍨嬬殑涓婚敭
      */
-    public String insert(RmCommandHistory po) {
+    public Long insert(RmCommandHistory po) {
         rmCommandHistoryMapper.insert(po);
-        return (po.getId()).toString();
+        return po.getId();
     }
 
     /**
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java
index 7977415..f79a834 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java
@@ -21,7 +21,8 @@
     /**
      * RTU
      */
-    RTU_ADDR_CANNOT_BE_NULL(20001, "闃�鎺у櫒鍦板潃涓嶈兘涓虹┖");
+    RTU_NOT_EXIST(20001, "闃�鎺у櫒涓嶅瓨鍦�"),
+    RTU_ADDR_CANNOT_BE_NULL(20002, "闃�鎺у櫒鍦板潃涓嶈兘涓虹┖");
 
     private final Integer code;
     private final String message;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
index c0fd553..5ffa204 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
@@ -8,9 +8,11 @@
 import com.dy.common.mw.protocol.p206V202404.CodeV202404;
 import com.dy.common.mw.protocol.p206V202404.downVos.ComCd10Vo;
 import com.dy.common.mw.protocol.p206V202404.downVos.ComCdXyVo;
+import com.dy.common.util.IDLongGenerator;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.pojoPr.PrController;
 import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
 import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
 import com.dy.pipIrrRemote.common.ComSupport;
@@ -49,6 +51,7 @@
     private final CommandSv commandSv;
 
     protected static String controllerType = "57";
+    private final IDLongGenerator idLongGenerator;
 
     /**
      * 鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌锛堜粎娴嬭瘯鐢級
@@ -120,12 +123,15 @@
         String newRtuAddr = addr.getNewRtuAddr();
         Long operator = addr.getOperator();
         String commandCode = CodeV202404.cd_10;
+        Long comId = idLongGenerator.generate();
 
-        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃
-        String rtuAddr = commandSv.getRtuAddrByIntakeId(intakeId);
-        if(rtuAddr == null || rtuAddr.length() == 0) {
-            return BaseResponseUtils.buildError(RemoteResultCode.RTU_ADDR_CANNOT_BE_NULL.getMessage());
+        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃鍙婇�氳鍗忚
+        PrController prController = commandSv.getControllerByIntakeId(intakeId);
+        if(prController == null) {
+            return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage());
         }
+        String rtuAddr = prController.getRtuAddr();
+        String protocol = prController.getProtocol();
 
         // 鍒涘缓瑙嗗浘
         ComCd10Vo param = new ComCd10Vo() ;
@@ -134,12 +140,12 @@
         param.rtuNewAddr = newRtuAddr;
 
         // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-        RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
-        String comId = commandSv.insert(rmCommandHistory);
+        RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator);
+        comId = commandSv.insert(rmCommandHistory);
         System.out.println(comId);
 
         // 鏋勯�犲懡浠�
-        Command com = command(comId, commandCode, rtuAddr, param);
+        Command com = command(comId, commandCode, rtuAddr, protocol, param);
         sendCom2Mw(com);
 
         CompletableFuture<Data> featureObject = new CompletableFuture<>();
@@ -184,12 +190,15 @@
         String commandCode = CodeV202404.cd_97;
         Long intakeId = po.getIntakeId();
         Long operator = po.getOperator();
+        Long comId = idLongGenerator.generate();
 
-        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃
-        String rtuAddr = commandSv.getRtuAddrByIntakeId(intakeId);
-        if(rtuAddr == null || rtuAddr.length() == 0) {
-            return BaseResponseUtils.buildError(RemoteResultCode.RTU_ADDR_CANNOT_BE_NULL.getMessage());
+        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃鍙婇�氳鍗忚
+        PrController prController = commandSv.getControllerByIntakeId(intakeId);
+        if(prController == null) {
+            return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage());
         }
+        String rtuAddr = prController.getRtuAddr();
+        String protocol = prController.getProtocol();
 
         // 鍒涘缓瑙嗗浘
         ComCdXyVo param = new ComCdXyVo();
@@ -197,11 +206,11 @@
         param.projectNo = projectNo;
 
         // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-        RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
-        String comId = commandSv.insert(rmCommandHistory);
+        RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator);
+        comId = commandSv.insert(rmCommandHistory);
 
         // 鏋勯�犲懡浠�
-        Command com = command(comId, commandCode, rtuAddr, param);
+        Command com = command(comId, commandCode, rtuAddr, protocol, param);
         return sendCom2Mw(com);
     }
 }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
index aa2d7c7..482486d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
@@ -1,16 +1,19 @@
 package com.dy.pipIrrRemote.valve;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.dy.common.aop.SsoAop;
 import com.dy.common.mw.protocol.Command;
 import com.dy.common.mw.protocol.Data;
 import com.dy.common.mw.protocol.p206V202404.CodeV202404;
 import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
 import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo;
+import com.dy.common.util.IDLongGenerator;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
-import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
 import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
+import com.dy.pipIrrGlobal.pojoPr.PrController;
 import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
 import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
 import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
@@ -46,7 +49,7 @@
  */
 
 @Slf4j
-@Tag(name = "鍒嗘按鎴跨鐞�", description = "鍒嗘按鎴挎搷浣�")
+@Tag(name = "闃�闂ㄧ鐞�", description = "闃�闂ㄦ搷浣�")
 @RestController
 @RequestMapping(path="valve")
 @RequiredArgsConstructor
@@ -55,7 +58,7 @@
     private final CommandSv commandSv;
     private final SeVirtualCardMapper seVirtualCardMapper;
     private final PrWaterPriceMapper prWaterPriceMapper;
-    private final RmCommandHistoryMapper rmCommandHistoryMapper;
+    private final IDLongGenerator idLongGenerator;
 
     /**
      * 杩滅▼寮�闃�锛堝钩鍙般�丄PP锛�
@@ -76,7 +79,7 @@
         Long vcId = valve.getVcId();
         Integer userType = valve.getUserType();
         Long operator = valve.getOperator();
-        String comId = null;
+        Long comId = idLongGenerator.generate();
 
         // 鑾峰彇绯荤粺鍙傛暟
         if(!setuped) {
@@ -88,11 +91,13 @@
         // 鑾峰彇姘翠环
         Double waterPrice = prWaterPriceMapper.getPrice();
 
-        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃
-        String rtuAddr = commandSv.getRtuAddrByIntakeId(intakeId);
-        if(rtuAddr == null || rtuAddr.length() == 0) {
-            return BaseResponseUtils.buildError(RemoteResultCode.RTU_ADDR_CANNOT_BE_NULL.getMessage());
+        // 鍙栨按鍙D鎹㈤榾鎺у櫒鍦板潃鍙婇�氳鍗忚
+        PrController prController = commandSv.getControllerByIntakeId(intakeId);
+        if(prController == null) {
+            return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage());
         }
+        String rtuAddr = prController.getRtuAddr();
+        String protocol = prController.getProtocol();
 
         // 鐢熸垚璁㈠崟鍙�
         LocalDateTime dateTime = LocalDateTime.now();
@@ -106,7 +111,7 @@
         String orderNo = dtf.format(dateTime) + sb.toString();
 
         String commandCode = null;
-        if(protocolName.equals("p206V202404")) {
+        if(protocol.equals("p206V202404")) {
             // 鑾峰彇鍔熻兘鐮�
             if(userType == 1) {
                 // 骞冲彴寮�闃�
@@ -127,13 +132,40 @@
             param.elePrice = 0.0;
             param.orderNo = orderNo;
 
-            // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-            RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
-            comId = commandSv.insert(rmCommandHistory);
+            // 鏋勯�犲懡浠�
+            Command com = command(comId, commandCode, rtuAddr, protocol, param);
 
-            // 鏋勯�犲苟鍙戦�佸懡浠�
-            Command com = command(comId, commandCode, rtuAddr, param);
-            sendCom2Mw(com);
+            // 鍙戦�佸懡浠�
+            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
+            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
+                // 璇锋眰鎴愬姛
+
+                // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
+                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator);
+                commandSv.insert(rmCommandHistory);
+
+                // 澶勭悊鍥炶皟
+                BaseResponse response_CallBack = dealWithCallBack(comId);
+                if(!response_CallBack.getCode().equals("0001")) {
+                    return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage());
+                }
+
+                // 鏇存敼铏氭嫙鍗$姸鎬侊細鏄惁浣跨敤涓�佹渶鍚庢搷浣溿�佹渶鍚庢搷浣滄椂闂�
+                SeVirtualCard virtualCard = new SeVirtualCard();
+                virtualCard.setId(vcId);
+                virtualCard.setInUse((byte) 1);
+                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
+                virtualCard.setLastOperateTime(new Date());
+                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
+
+                // 鍥炶皟杩斿洖鐨勫唴瀹�
+                Data myData = (Data)response_CallBack.getContent();
+                return BaseResponseUtils.buildSuccess(myData) ;
+            } else {
+                // 璇锋眰澶辫触
+                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
+                return BaseResponseUtils.buildFail(job_param.getString("message"));
+            }
         } else {
             // 鑾峰彇鍔熻兘鐮�
             if(userType == 1) {
@@ -148,30 +180,15 @@
             ComCd92_A2Vo param = new ComCd92_A2Vo();
 
             // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-            RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
-            comId = commandSv.insert(rmCommandHistory);
+            //RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, protocol, param, operator);
+            //comId = commandSv.insert(rmCommandHistory);
 
             // 鏋勯�犲苟鍙戦�佸懡浠�
-            Command com = command(comId, commandCode, rtuAddr, param);
+            Command com = command(comId, commandCode, rtuAddr, protocol, param);
             sendCom2Mw(com);
+
+            return BaseResponseUtils.buildSuccess();
         }
-
-        // 澶勭悊鍥炶皟
-        BaseResponse response = dealWithCallBack(comId);
-        if(!response.getCode().equals("0001")) {
-            return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage());
-        }
-
-        // 鏇存敼铏氭嫙鍗$姸鎬侊細鏄惁浣跨敤涓�佹渶鍚庢搷浣溿�佹渶鍚庢搷浣滄椂闂�
-        SeVirtualCard virtualCard = new SeVirtualCard();
-        virtualCard.setId(vcId);
-        virtualCard.setInUse((byte) 1);
-        virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
-        virtualCard.setLastOperateTime(new Date());
-        seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
-
-        Data myData = (Data)response.getContent();
-        return BaseResponseUtils.buildSuccess(myData) ;
     }
 
     /**
@@ -194,15 +211,23 @@
         String orderNo = valve.getOrderNo();
         Integer userType = valve.getUserType();
         Long operator = valve.getOperator();
-        String comId = null;
+        Long comId = idLongGenerator.generate();
 
         // 鑾峰彇绯荤粺鍙傛暟
         if(!setuped) {
             setUp();
         }
 
+        // 闃�鎺у櫒鍦板潃鎹㈠彇姘村彛ID鍜岄�氳鍗忚
+        PrController prController = commandSv.getControllerByRtuAddr(rtuAddr);
+        if(prController == null) {
+            return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage());
+        }
+        Long intakeId = prController.getIntakeId();
+        String protocol = prController.getProtocol();
+
         String commandCode = null;
-        if(protocolName.equals("p206V202404")) {
+        if(protocol.equals("p206V202404")) {
             // 鑾峰彇鍔熻兘鐮�
             if (userType == 1) {
                 // 骞冲彴鍏抽榾
@@ -219,13 +244,41 @@
             param.icCardNo = vcNum;
             param.orderNo = orderNo;
 
-            // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-            RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
-            comId = commandSv.insert(rmCommandHistory);
+            // 鏋勯�犲懡浠�
+            Command com = command(comId, commandCode, rtuAddr, protocol, param);
 
-            // 鏋勯�犲苟鍙戦�佸懡浠�
-            Command com = command(comId, commandCode, rtuAddr, param);
-            sendCom2Mw(com);
+            // 鍙戦�佸懡浠�
+            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
+            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
+                // 璇锋眰鎴愬姛
+
+                // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
+                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator);
+                commandSv.insert(rmCommandHistory);
+
+                // 澶勭悊鍥炶皟
+                BaseResponse response_CallBack = dealWithCallBack(comId);
+                if(!response_CallBack.getCode().equals("0001")) {
+                    return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage());
+                }
+
+                // 鏇存敼铏氭嫙鍗$姸鎬侊細鏄惁浣跨敤涓�佹渶鍚庢搷浣溿�佹渶鍚庢搷浣滄椂闂�
+                Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
+                SeVirtualCard virtualCard = new SeVirtualCard();
+                virtualCard.setId(vcId);
+                virtualCard.setInUse((byte) 1);
+                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
+                virtualCard.setLastOperateTime(new Date());
+                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
+
+                // 鍥炶皟杩斿洖鐨勫唴瀹�
+                Data myData = (Data)response_CallBack.getContent();
+                return BaseResponseUtils.buildSuccess(myData) ;
+            } else {
+                // 璇锋眰澶辫触
+                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
+                return BaseResponseUtils.buildFail(job_param.getString("message"));
+            }
         } else {
             // 鑾峰彇鍔熻兘鐮�
             if (userType == 1) {
@@ -244,11 +297,11 @@
             param.orderNo = orderNo;
 
             // 鍒涘缓鍛戒护鏃ュ織瀵硅薄骞舵坊鍔犲埌鏁版嵁搴撲腑
-            RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, param, operator);
+            RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator);
             comId = commandSv.insert(rmCommandHistory);
 
             // 鏋勯�犲苟鍙戦�佸懡浠�
-            Command com = command(comId, commandCode, rtuAddr, param);
+            Command com = command(comId, commandCode, rtuAddr, protocol, param);
             sendCom2Mw(com);
         }
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pipIrr-web-webchat.iml b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pipIrr-web-webchat.iml
deleted file mode 100644
index cb22448..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pipIrr-web-webchat.iml
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="web" name="Web">
-      <configuration>
-        <webroots />
-        <sourceRoots>
-          <root url="file://$MODULE_DIR$/src/main/java" />
-          <root url="file://$MODULE_DIR$/src/main/resources" />
-        </sourceRoots>
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_16">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-java:0.2.12" level="project" />
-    <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-java-core:0.2.12" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.10.1" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:2.0.7" level="project" />
-    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:4.9.2" level="project" />
-    <orderEntry type="library" name="Maven: com.squareup.okio:okio:2.8.0" level="project" />
-    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22" level="project" />
-    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.8.22" level="project" />
-    <orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.16" level="project" />
-    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents.client5:httpclient5:5.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents.core5:httpcore5:5.2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents.core5:httpcore5-h2:5.2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents.client5:httpclient5-fluent:5.1.3" level="project" />
-    <orderEntry type="module" module-name="pipIrr-common" />
-    <orderEntry type="library" name="Maven: org.apache.mina:mina-core:2.2.2" level="project" />
-    <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
-    <orderEntry type="module" module-name="pipIrr-global" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:3.1.0" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel-core:3.1.0" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:easyexcel-support:3.1.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
-    <orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
-    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.06" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-csv:1.8" level="project" />
-    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.2.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.1.1" level="project" />
-    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.33" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:10.1.12" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:10.1.12" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-web:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-expression:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:10.1.12" level="project" />
-    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:8.0.1.Final" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:3.0.2" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.5.3.Final" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.28" level="project" />
-    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.20" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-log4j2:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.20.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.20.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-jul:2.20.0" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-actuator:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.15.2" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.15.2" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.15.2" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2" level="project" />
-    <orderEntry type="library" name="Maven: io.micrometer:micrometer-observation:1.11.2" level="project" />
-    <orderEntry type="library" name="Maven: io.micrometer:micrometer-commons:1.11.2" level="project" />
-    <orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.11.2" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.hdrhistogram:HdrHistogram:2.1.12" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.latencyutils:LatencyUtils:2.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0" level="project" />
-    <orderEntry type="library" name="Maven: org.webjars:swagger-ui:5.2.0" level="project" />
-    <orderEntry type="library" name="Maven: org.springdoc:springdoc-openapi-starter-webmvc-api:2.2.0" level="project" />
-    <orderEntry type="library" name="Maven: org.springdoc:springdoc-openapi-starter-common:2.2.0" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-core-jakarta:2.2.15" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations-jakarta:2.2.15" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models-jakarta:2.2.15" level="project" />
-    <orderEntry type="library" name="Maven: org.springdoc:springdoc-openapi-security:1.7.0" level="project" />
-    <orderEntry type="library" name="Maven: org.springdoc:springdoc-openapi-common:1.7.0" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-core:2.2.9" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.2.9" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.2.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:6.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:6.1.2" level="project" />
-    <orderEntry type="library" name="Maven: com.mysql:mysql-connector-j:8.0.33" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.2.20" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:druid:1.2.20" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:4.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-core:4.0.3" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.eclipse.angus:angus-activation:2.0.1" level="project" />
-    <orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:4.0.3" level="project" />
-    <orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.5.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.5.3.2" level="project" />
-    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.6" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.13" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.1.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:3.1.3" level="project" />
-    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:5.0.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-tx:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: cglib:cglib:3.3.0" level="project" />
-    <orderEntry type="library" name="Maven: org.ow2.asm:asm:7.1" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.40" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension-spring6:2.0.40" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.40" level="project" />
-    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.5.5.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct-processor:1.5.5.Final" level="project" />
-    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.21" level="project" />
-    <orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.dubbo:dubbo:3.2.7" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:3.1.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:3.1.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:3.1.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.8.0" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:4.0.0" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:2.1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.4.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:2.4.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.24.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.14.6" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.9.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:5.3.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.14.6" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:5.3.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:6.0.11" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:6.0.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:6.0.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.9.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.gitignore b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.mvn/wrapper/maven-wrapper.properties b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..aeccdfd
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# 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.
+wrapperVersion=3.3.1
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw
new file mode 100644
index 0000000..ba9212a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw
@@ -0,0 +1,250 @@
+#!/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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.1
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  if [ -n "${JAVA_HOME-}" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl="${value-}" ;;
+  distributionSha256Sum) distributionSha256Sum="${value-}" ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw.cmd b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw.cmd
new file mode 100644
index 0000000..406932d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/mvnw.cmd
@@ -0,0 +1,146 @@
+<# : batch portion
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    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 Apache Maven Wrapper startup batch script, version 3.3.1
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml
new file mode 100644
index 0000000..ce653f1
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml
@@ -0,0 +1,140 @@
+<?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>
+        <artifactId>pipIrr-web</artifactId>
+        <groupId>com.dy</groupId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <packaging>jar</packaging>
+
+    <groupId>com.dy</groupId>
+    <artifactId>pipIrr-web-wechat</artifactId>
+    <name>pipIrr-web-wechat</name>
+    <description>寰俊灏忕▼搴�</description>
+
+    <build>
+        <plugins>
+            <!-- 鐢熸垚涓嶅寘鍚緷璧杍ar鐨勫彲鎵цjar鍖�
+            <plugin>
+                !- spring boot鎻愪緵鐨刴aven鎵撳寘鎻掍欢 -
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        !-
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        -
+                        <configuration>
+                            !- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar  -
+                            <classifier>execute</classifier>
+                            !- 涓嶆寚瀹氱敓鎴愯矾寰勭殑璇�, 榛樿淇濆瓨鍦� ${build.directory} 涓� -
+                            <outputDirectory>${project.build.directory}/execute</outputDirectory>
+                            <finalName>${artifactId}-${version}</finalName>
+                            <layout>ZIP</layout>
+                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
+                            <includes>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-common</artifactId>
+                                </include>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-global</artifactId>
+                                </include>
+                            </includes>
+                            <excludes>
+                                <exclude>
+                                    <groupId>org.projectlombok</groupId>
+                                    <artifactId>lombok</artifactId>
+                                </exclude>
+                            </excludes>
+                        </configuration>
+                    </execution>
+                </executions>
+
+            </plugin>
+            -->
+            <!-- 鎷疯礉渚濊禆鐨刯ar鍖呭埌lib鐩綍-->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <configuration>
+                            <!-- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar
+                            <classifier>execute</classifier>
+                            -->
+                            <!-- ${project.build.directory}鏄痬aven鍙橀噺锛屽唴缃殑锛岃〃绀簍arget鐩綍,濡傛灉涓嶅啓锛屽皢鍦ㄦ牴鐩綍涓嬪垱寤�/lib -->
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <!-- excludeTransitive:鏄惁涓嶅寘鍚棿鎺ヤ緷璧栧寘锛屾瘮濡傛垜浠緷璧朅锛屼絾鏄疉鍙堜緷璧栦簡B锛屾垜浠槸鍚︿篃瑕佹妸B鎵撹繘鍘� 榛樿涓嶆墦-->
+                            <excludeTransitive>false</excludeTransitive>
+                            <!-- 澶嶅埗鐨刯ar鏂囦欢鍘绘帀鐗堟湰淇℃伅 -->
+                            <stripVersion>false</stripVersion>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <layout>ZIP</layout>
+                            <mainClass>com.dy.pipIrrRemote.PipIrrRemoteApplication</mainClass>
+                            <includes>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-common</artifactId>
+                                </include>
+                                <include>
+                                    <groupId>com.dy</groupId>
+                                    <artifactId>pipIrr-global</artifactId>
+                                </include>
+                            </includes>
+                            <excludes>
+                                <exclude>
+                                    <groupId>org.projectlombok</groupId>
+                                    <artifactId>lombok</artifactId>
+                                </exclude>
+                            </excludes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <!-- 璁剧疆java缂栬瘧鐗堟湰锛岃繍琛岀幆澧冪増鏈� -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <!-- source锛� 婧愪唬鐮佺紪璇戠増鏈紱target锛� 鐩爣骞冲彴缂栬瘧鐗堟湰锛沞ncoding锛� 瀛楃闆嗙紪鐮併�� -->
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${encoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- 瑙e喅璧勬簮鏂囦欢鐨勭紪鐮侀棶棰� -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>${encoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- maven閲屾墽琛屾祴璇曠敤渚嬬殑鎻掍欢 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- 涓嬮潰瑙e喅锛氬綋杩涜Maven Lifecycle package鏃舵姤閿欙細Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)-->
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/PipIrrWechatApplication.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/PipIrrWechatApplication.java
new file mode 100644
index 0000000..72b7482
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/PipIrrWechatApplication.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrWechat;
+
+import com.dy.common.multiDataSource.EnableMultiDataSource;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.context.annotation.FilterType;
+
+@SpringBootApplication
+@EnableAspectJAutoProxy
+@EnableMultiDataSource
+@ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.pipIrrWechat"},
+        excludeFilters = {
+                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
+                        com.dy.common.singleDataSource.DruidDataSourceConfig.class //鎺掗櫎鍗曟暟鎹簮
+                })
+        }
+)
+@MapperScan(basePackages={"com.dy.pipIrrGlobal.daoRm", "com.dy.pipIrrGlobal.daoPr", "com.dy.pipIrrGlobal.daoSe", "com.dy.pipIrrGlobal.daoBa"})
+public class PipIrrWechatApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(PipIrrWechatApplication.class, args);
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RestTemplateConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RestTemplateConfig.java
new file mode 100644
index 0000000..74d0438
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RestTemplateConfig.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrWechat.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 17:09
+ * @LastEditTime 2024-05-07 17:09
+ * @Description
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebFilterConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebFilterConfiguration.java
new file mode 100644
index 0000000..c724dae
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebFilterConfiguration.java
@@ -0,0 +1,51 @@
+package com.dy.pipIrrWechat.config;
+
+import com.dy.common.webFilter.DevOfDataSourceNameSetFilter;
+import com.dy.common.webFilter.UserTokenFilter;
+import jakarta.servlet.Filter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 14:51
+ * @LastEditTime 2024-05-07 14:51
+ * @Description
+ */
+@Configuration
+public class WebFilterConfiguration {
+
+    @Value("${pipIrr.global.dev}")
+    public String isDevStage ;//鏄惁涓哄紑鍙戦樁娈�
+    @Value("${pipIrr.global.dsName}")
+    public String dsName ;//寮�鍙戦樁娈电殑鏁版嵁婧愬悕绉�
+
+    /**
+     * DevOfDataSourceNameSetFilter涓嶶serTokenFilter鍙兘涓�涓閰嶇疆涓婏紝
+     * 鎵�浠ヤ粬浠殑order閮芥槸1
+     */
+    private static final int order_UserTokenFilter = 1 ;//涓庝笅闈�
+    private static final int order_DevOfDataSourceNameSetFilter = 1 ;
+
+
+    @Bean
+    public FilterRegistrationBean<? extends Filter> RegFilter() {
+        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
+        if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){
+            filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter());
+            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
+            filterRegistrationBean.addInitParameter("dataSourceName",dsName);//璁剧疆init鍙傛暟
+            filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
+            filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//鎵ц娆″簭
+        }else{
+            filterRegistrationBean.setFilter(new UserTokenFilter());
+            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
+            filterRegistrationBean.setName("UserTokenFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
+            filterRegistrationBean.setOrder(order_UserTokenFilter);//鎵ц娆″簭
+        }
+        return filterRegistrationBean;
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebListenerConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebListenerConfiguration.java
new file mode 100644
index 0000000..2819225
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/WebListenerConfiguration.java
@@ -0,0 +1,68 @@
+package com.dy.pipIrrWechat.config;
+
+import com.dy.common.webListener.GenerateIdSetSuffixListener;
+import jakarta.servlet.ServletContextListener;
+import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-07 14:52
+ * @LastEditTime 2024-05-07 14:52
+ * @Description
+ */
+@Configuration
+public class WebListenerConfiguration {
+
+    /**
+     * 鍚姩椤哄簭
+     */
+    //private static final int order_config = 0 ;
+    private static final int order_idSetSuffix = 1 ;
+    //private static final int order_init = 2 ;
+
+    /*
+    * 瑙f瀽鍚勭***.config閰嶇疆鐨凜onfigListener锛屾殏鏃朵笉閲囩敤姝ょ閰嶇疆鏂瑰紡
+    *
+    @Bean
+    public ConfigListener getGlConfigListener(){
+        return new ConfigListener() ;
+    }
+    /**
+     * 澶栭儴鎻愪緵Listener
+     * @param listener 澶栭儴鎻愪緵Listener
+     * @return 娉ㄥ唽Bean
+    @Bean
+    public ServletListenerRegistrationBean<? extends ServletContextListener> regConfigListener(ConfigListener listener) {
+        ServletListenerRegistrationBean<ConfigListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+        listenerRegistrationBean.setListener(listener);
+        listenerRegistrationBean.setOrder(order_config);
+        return listenerRegistrationBean;
+    }
+    */
+
+    /**
+     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屾牴鎹厤缃� 璁剧疆ID浜х敓鍣ㄧ殑鍚庣紑
+     * @return 娉ㄥ唽Bean
+     */
+    @Bean
+    public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() {
+        ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+        listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener());
+        listenerRegistrationBean.setOrder(order_idSetSuffix);
+        return listenerRegistrationBean;
+    }
+
+//    /**
+//     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屽垵濮嬪寲鏁版嵁搴撴暟鎹�
+//     * @return 娉ㄥ唽Bean
+//     */
+//    @Bean
+//    public ServletListenerRegistrationBean<? extends ServletContextListener> regInitListener() {
+//        ServletListenerRegistrationBean<InitListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
+//        listenerRegistrationBean.setListener(new InitListener());
+//        listenerRegistrationBean.setOrder(order_init);
+//        return listenerRegistrationBean;
+//    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
new file mode 100644
index 0000000..ffcbee6
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrWechat.result;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-30 9:16
+ * @LastEditTime 2024-05-30 9:16
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum WechatResultCode {
+
+    XXX(10001,"XXX");
+
+    private final Integer code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application.yml
new file mode 100644
index 0000000..f36e52a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application.yml
@@ -0,0 +1,18 @@
+spring:
+    profiles:
+        include: global, database, database-ym, database-pj
+
+#actutor鐨剋eb绔彛
+management:
+    server:
+        port: ${pipIrr.wechat.actutorPort}
+#web鏈嶅姟绔彛锛宼omcat榛樿鏄�8087
+server:
+    port: ${pipIrr.wechat.webPort}
+    servlet:
+        context-path: /wx #web璁块棶涓婁笅鏂囪矾寰�
+        context-parameters:
+            #GenerateIdSetSuffixListener涓簲鐢紝鍙栧�艰寖鍥存槸0-99
+            idSuffix: ${pipIrr.wechat.idSuffix}
+            #ConfigListener涓簲鐢�
+            #configFileNames: config-global.xml,config-demo.xml
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/log4j2.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/log4j2.yml
new file mode 100644
index 0000000..b42623a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/log4j2.yml
@@ -0,0 +1,73 @@
+Configuration:
+    #status锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭锛涘彲浠ヨ缃垚Off(鍏抽棴)鎴朎rror(鍙緭鍑洪敊璇俊鎭�)
+    status: Error
+
+    Properties: # 瀹氫箟鍏ㄥ眬鍙橀噺
+        Property:
+            #鏃ュ織鏂囦欢瀛樺偍鐨勭洰褰�
+            - name: log.path
+              value: ./logs
+            #鏃ュ織鏂囦欢瀛樺偍鍚嶇О
+            - name: project.name
+              value: pipIrrRemote
+
+    #瀹氫箟杈撳嚭鍣紝鍙互杈撳嚭鍒版帶鍒跺彴鍜屾枃浠�.
+    Appenders:
+        #杈撳嚭鍒版帶鍒跺彴
+        Console:
+            #Appender鍛藉悕
+            name: CONSOLE
+            target: SYSTEM_OUT
+            ThresholdFilter:
+                level: debug #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
+                onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
+                onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
+            #鏃ュ織鍐呭鏍峰紡
+            PatternLayout:
+                #%n-鎹㈣
+                #%m-鏃ュ織鍐呭锛岃緭鍑轰唬鐮佷腑鎸囧畾鐨勬棩蹇椾俊鎭�
+                #%p-杈撳嚭浼樺厛绾э紝鍗矰EBUG,INFO,WARN,ERROR,FATAL
+                #%r-绋嬪簭鍚姩鍒扮幇鍦ㄧ殑姣鏁�
+                #%%- 杈撳嚭涓�涓�"%" 瀛楃
+                #%t-褰撳墠绾跨▼鍚�
+                #%d-鏃ユ湡鍜屾椂闂�, 甯哥敤鐨勬牸寮忔湁%d{DATE},%d{ABSOLUTE},%d{HH:mm:ss,SSS},%d{ddMMyyyyHH:mm:ss,SSS}
+                #%l-鍚�%F%L%C%M
+                #%F-java婧愭枃浠跺悕
+                #%L-java婧愮爜琛屾暟
+                #%C-java绫诲悕,%C{1}杈撳嚭鏈�鍚庝竴涓厓绱�
+                #%M-java鏂规硶鍚�
+                pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
+        # 杈撳嚭鍒版枃浠讹紝瓒呰繃10MB褰掓。
+        RollingFile:
+            - name: ROLLING_FILE
+              ignoreExceptions: false
+              fileName: ${log.path}/${project.name}.log
+              filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
+              ThresholdFilter:
+                  level: error #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
+                  onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
+                  onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
+              #鏃ュ織鍐呭鏍峰紡
+              PatternLayout:
+                  pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
+              Policies:
+                  SizeBasedTriggeringPolicy:
+                      size: "10 MB"
+              DefaultRolloverStrategy:
+                  max: 1000
+
+    Loggers:
+        Root:
+            level: info #鏃ュ織杈撳嚭绾у埆锛屽叡鏈�8涓骇鍒紝鎸夌収浠庝綆鍒伴珮涓猴細all < trace < debug < info < warn < error < fatal < off
+            AppenderRef: #Root鐨勫瓙鑺傜偣锛岀敤鏉ユ寚瀹氳鏃ュ織杈撳嚭鍒板摢涓狝ppender.
+                - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+                - ref: ROLLING_FILE  #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+        # 涓哄寘閰嶇疆鐗规畩鐨凩og绾у埆锛屾柟渚胯皟璇曪紝
+        # 涓嶅彈Loggers.Root.level闄愬埗
+        Logger:
+            - name: com.dy.pipIrrGlobal.daoBa
+              additivity: false #鍘婚櫎閲嶅鐨刲og
+              level: debug #杈撳嚭鏃ュ織绾у埆
+              AppenderRef:
+                  - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
+                  - ref: ROLLING_FILE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/test/java/com/dy/pipIrrWechat/PipIrrWebWechatApplicationTests.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/test/java/com/dy/pipIrrWechat/PipIrrWebWechatApplicationTests.java
new file mode 100644
index 0000000..cc65983
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/test/java/com/dy/pipIrrWechat/PipIrrWebWechatApplicationTests.java
@@ -0,0 +1,13 @@
+package com.dy.pipIrrWechat;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PipIrrWebWechatApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pom.xml b/pipIrr-platform/pipIrr-web/pom.xml
index 905817f..b846451 100644
--- a/pipIrr-platform/pipIrr-web/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pom.xml
@@ -28,6 +28,8 @@
         <module>pipIrr-web-sell</module>
         <module>pipIrr-web-project</module>
         <module>pipIrr-web-irrigate</module>
+        <module>pipIrr-web-wechat</module>
+        <module>pipIrr-web-app</module>
     </modules>
 
     <dependencies>

--
Gitblit v1.8.0