From 52cd0fe6f2224b0bd17b19ddaf475406a92b9ed4 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期五, 09 五月 2025 13:42:00 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java               |   69 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml                                                                    |  138 +++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java                                    |   45 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java                |   25 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(233服务器).yml                                 |    4 
 pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java               |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml                                              |   80 ++
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java                 |   67 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java                     |   52 +
 pipIrr-platform/pipIrr-global/src/main/resources/application-global(166web文件花生壳).yml                                      |    4 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application(121服务器).yml                                 |    4 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java                       |  267 +++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java |   13 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java     |   52 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java          |   23 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java                                 |   22 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java              |   73 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes                                                             |    2 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml                                         |    3 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw                                                                       |  259 ++++++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java                                 |    9 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitignore                                                                 |   33 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java   |   35 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java                                  |   36 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml                                           |  488 ++++++------
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java                            |   10 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java        |   29 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml                                                |   79 ++
 pipIrr-platform/pipIrr-web/pom.xml                                                                                        |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd                                                                   |  149 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java                 |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml                                    |   19 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.mvn/wrapper/maven-wrapper.properties                                      |   19 
 pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml                                                   |    4 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java                   |   57 +
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java         |   28 
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java        |   29 
 37 files changed, 1,981 insertions(+), 248 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
index f0c50d1..e20d911 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
@@ -1,11 +1,9 @@
 package com.dy.pipIrrGlobal.daoSe;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
 import com.dy.pipIrrGlobal.voSe.*;
 import com.dy.pipIrrGlobal.voSt.VoClientOpenCardCount;
 import com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal;
-import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -13,13 +11,11 @@
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-02 16:00
- * @LastEditTime 2024-02-02 16:00
+ * @date 2025-05-08 17:15
+ * @LastEditTime 2025-05-08 17:15
  * @Description
  */
-
-@Mapper
-public interface SeCardOperateMapper extends BaseMapper<SeCardOperate> {
+public interface SeCardOperateMapper {
     int deleteByPrimaryKey(Long id);
 
     int insert(SeCardOperate record);
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java
index 67e5da8..f5eff16 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java
@@ -4,6 +4,7 @@
 import com.dy.pipIrrGlobal.pojoSe.SeClient;
 import com.dy.pipIrrGlobal.voSe.VoClient;
 import com.dy.pipIrrGlobal.voSe.VoClientWechat;
+import com.dy.pipIrrGlobal.voSe.VoTermClient;
 import com.dy.pipIrrGlobal.voSt.VoCardUsage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -127,4 +128,25 @@
      * @return
      */
     List<VoCardUsage> getClientUsages(Map<String, Object> params);
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛璁板綍鏁癬鍏呭�兼満
+     * @param params
+     * @return
+     */
+    Long getTermClientCount(Map<?, ?> params);
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛鏁版嵁_鍏呭�兼満
+     * @param params
+     * @return
+     */
+    List<VoTermClient> getTermClients(Map<?, ?> params);
+
+    /**
+     * 鏍规嵁鍐滄埛ID鑾峰彇涓�涓啘鎴锋暟鎹甠鍏呭�兼満
+     * @param clientId
+     * @return
+     */
+    VoTermClient getTermOneClient(@Param("clientId") Long clientId);
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java
index 428f765..a402151 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java
@@ -17,8 +17,8 @@
 
 /**
  * @author ZhuBaoMin
- * @date 2024-01-18 19:10
- * @LastEditTime 2024-02-02 16:00
+ * @date 2025-05-08 17:15
+ * @LastEditTime 2025-05-08 17:15
  * @Description
  */
 
@@ -152,6 +152,11 @@
     private Date operateDt;
 
     /**
+     * 鎿嶄綔璁㈠崟鍙�
+     */
+    private String orderNo;
+
+    /**
      * 鎿嶄綔鏄惁鏈夋晥
      */
     @Length(message = "鎿嶄綔鏈夋晥鎬т笉澶т簬{max}锛屼笉灏忎簬{min}", min = 1, max = 2)
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java
new file mode 100644
index 0000000..76f7b7a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermClient.java
@@ -0,0 +1,45 @@
+package com.dy.pipIrrGlobal.voSe;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-07 16:57
+ * @LastEditTime 2025-05-07 16:57
+ * @Description 鍏呭�兼満鍐滄埛瑙嗗浘瀵硅薄
+ */
+
+@Data
+@JsonPropertyOrder({"clientId", "clientNum", "name", "districtNum",  "phone", "idCard", "villageName", "address", "cardCount",  "operateDt"})
+public class VoTermClient {
+    public static final long serialVersionUID = 202505071705001L;
+
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    private Long clientId;
+
+    private String clientNum;
+
+    private String name;
+
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    private Long districtNum;
+
+    private String phone;
+
+    private String idCard;
+
+    private String villageName;;
+
+    private String address;
+
+    private Integer cardCount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date operateDt;
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java
new file mode 100644
index 0000000..e0d69f8
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java
@@ -0,0 +1,36 @@
+package com.dy.pipIrrGlobal.voSe;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 15:59
+ * @LastEditTime 2025-05-08 15:59
+ * @Description
+ */
+
+@Data
+@JsonPropertyOrder({"projectNo", "cardNum", "balance", "waterPrice",  "time", "orderNo"})
+public class VoTermRecharge {
+    public static final long serialVersionUID = 202505081559001L;
+
+    private Integer projectNo;
+
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    private Long cardNum;
+
+    private Float balance;
+
+    private Double waterPrice;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date time;
+
+    private String orderNo;
+}
diff --git "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml" "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
index bc9864b..b4f1c39 100644
--- "a/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
+++ "b/pipIrr-platform/pipIrr-global/src/main/resources/application-global\050166web\346\226\207\344\273\266\350\212\261\347\224\237\345\243\263\051.yml"
@@ -146,6 +146,10 @@
         webPort: 8089
         actutorPort: 9089
         idSuffix: 11
+    terminal:
+        webPort: 8090
+        actutorPort: 9090
+        idSuffix: 12
     # 2023-10-24鏂板锛岀敤浜庢墽琛屼复鏃朵换鍔★紝渚嬪鍒犻櫎鏁版嵁搴撲腑涓婁簺鍑洪敊鐨勬暟鎹�
     temp:
         webPort: 8099
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 89434e4..b302ccc 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -146,6 +146,10 @@
         webPort: 8089
         actutorPort: 9089
         idSuffix: 11
+    terminal:
+        webPort: 8090
+        actutorPort: 9090
+        idSuffix: 12
     # 2023-10-24鏂板锛岀敤浜庢墽琛屼复鏃朵换鍔★紝渚嬪鍒犻櫎鏁版嵁搴撲腑涓婁簺鍑洪敊鐨勬暟鎹�
     temp:
         webPort: 8099
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
index cf15a1f..84dc129 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -20,12 +20,14 @@
     <result column="remarks" jdbcType="VARCHAR" property="remarks" />
     <result column="operator" jdbcType="BIGINT" property="operator" />
     <result column="operate_dt" jdbcType="TIMESTAMP" property="operateDt" />
+    <result column="order_no" jdbcType="VARCHAR" property="orderNo" />
     <result column="operate_valid" jdbcType="TINYINT" property="operateValid" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, card_id, client_id, money, system_balance, trade_amount, price, card_cost, gift, 
-    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt, operate_valid
+    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt, 
+    order_no, operate_valid
   </sql>
   <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -46,13 +48,15 @@
       price, card_cost, gift, 
       refund_amount, no_trade_amount, operate_type, 
       payment_id, remarks, `operator`, 
-      operate_dt, operate_valid)
+      operate_dt, order_no, operate_valid
+      )
     values (#{id,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, 
       #{money,jdbcType=FLOAT}, #{systemBalance,jdbcType=FLOAT}, #{tradeAmount,jdbcType=FLOAT}, 
       #{price,jdbcType=FLOAT}, #{cardCost,jdbcType=INTEGER}, #{gift,jdbcType=FLOAT}, 
       #{refundAmount,jdbcType=FLOAT}, #{noTradeAmount,jdbcType=FLOAT}, #{operateType,jdbcType=TINYINT}, 
       #{paymentId,jdbcType=BIGINT}, #{remarks,jdbcType=VARCHAR}, #{operator,jdbcType=BIGINT}, 
-      #{operateDt,jdbcType=TIMESTAMP}, #{operateValid,jdbcType=TINYINT})
+      #{operateDt,jdbcType=TIMESTAMP}, #{orderNo,jdbcType=VARCHAR}, #{operateValid,jdbcType=TINYINT}
+      )
   </insert>
   <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
     <!--@mbg.generated-->
@@ -106,6 +110,9 @@
       <if test="operateDt != null">
         operate_dt,
       </if>
+      <if test="orderNo != null">
+        order_no,
+      </if>
       <if test="operateValid != null">
         operate_valid,
       </if>
@@ -158,6 +165,9 @@
       </if>
       <if test="operateDt != null">
         #{operateDt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="orderNo != null">
+        #{orderNo,jdbcType=VARCHAR},
       </if>
       <if test="operateValid != null">
         #{operateValid,jdbcType=TINYINT},
@@ -213,6 +223,9 @@
       <if test="operateDt != null">
         operate_dt = #{operateDt,jdbcType=TIMESTAMP},
       </if>
+      <if test="orderNo != null">
+        order_no = #{orderNo,jdbcType=VARCHAR},
+      </if>
       <if test="operateValid != null">
         operate_valid = #{operateValid,jdbcType=TINYINT},
       </if>
@@ -237,6 +250,7 @@
       remarks = #{remarks,jdbcType=VARCHAR},
       `operator` = #{operator,jdbcType=BIGINT},
       operate_dt = #{operateDt,jdbcType=TIMESTAMP},
+      order_no = #{orderNo,jdbcType=VARCHAR},
       operate_valid = #{operateValid,jdbcType=TINYINT}
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -244,12 +258,12 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鍏呭�艰褰曟暟閲�-->
   <select id="getRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
-        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
     <where>
       AND ope.operate_type in(1, 2, 5,10)
       AND ope.operate_valid = 2
@@ -278,37 +292,37 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鍏呭�艰褰�-->
   <select id="getRecharges" resultType="com.dy.pipIrrGlobal.voSe.VoRecharge">
     SELECT
-      ope.id AS opeId,
-      card.id AS cardId,
-      cli.name AS clientName,
-      cli.phone,
-      cli.idCard,
-      cli.clientNum,
-      dis.name AS villageName,
-      cli.address,
-      card.money,
-      cardNum,
-      IFNULL(ope.card_cost,0) AS cardCost,
-      IFNULL(ope.trade_amount, 0) AS amount,
-      IFNULL(ope.gift, 0) AS gift,
-      IFNULL(ope.refund_amount, 0) AS refundAmount,
-      (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS afterRecharge,
-      pay.name AS paymentName,
-      ope.price,
-      us.name AS opr,
-      (CASE
-        WHEN ope.operate_type = 1 THEN '寮�鍗�'
-        WHEN ope.operate_type = 2 THEN '鍏呭��'
-        WHEN ope.operate_type = 5 THEN '杩旇繕'
-        WHEN ope.operate_type = 10 THEN '鍙嶅啓'
-      END) AS operateType,
-      ope.operate_dt
+    ope.id AS opeId,
+    card.id AS cardId,
+    cli.name AS clientName,
+    cli.phone,
+    cli.idCard,
+    cli.clientNum,
+    dis.name AS villageName,
+    cli.address,
+    card.money,
+    cardNum,
+    IFNULL(ope.card_cost,0) AS cardCost,
+    IFNULL(ope.trade_amount, 0) AS amount,
+    IFNULL(ope.gift, 0) AS gift,
+    IFNULL(ope.refund_amount, 0) AS refundAmount,
+    (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS afterRecharge,
+    pay.name AS paymentName,
+    ope.price,
+    us.name AS opr,
+    (CASE
+    WHEN ope.operate_type = 1 THEN '寮�鍗�'
+    WHEN ope.operate_type = 2 THEN '鍏呭��'
+    WHEN ope.operate_type = 5 THEN '杩旇繕'
+    WHEN ope.operate_type = 10 THEN '鍙嶅啓'
+    END) AS operateType,
+    ope.operate_dt
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN ba_district dis ON dis.id = cli.villageId
-        LEFT JOIN ba_user us ON ope.operator = us.id
-        Left JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN ba_district dis ON dis.id = cli.villageId
+    LEFT JOIN ba_user us ON ope.operator = us.id
+    Left JOIN se_payment_method pay ON ope.payment_id = pay.id
     <where>
       AND ope.operate_type in(1, 2, 5,10)
       AND ope.operate_valid = 2
@@ -335,7 +349,7 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇浜ゆ槗璁板綍鏁�-->
   <select id="getTransactionRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     SELECT
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
     LEFT JOIN se_client cli ON ope.client_id = cli.id
     LEFT JOIN se_client_card card ON card.id = ope.card_id
@@ -361,41 +375,41 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇浜ゆ槗璁板綍-->
   <select id="getTransactions" resultType="com.dy.pipIrrGlobal.voSe.VoTradeDetails">
     SELECT
-        ope.id AS orderNumber,
-        cli.name AS clientName,
-        card.cardNum AS cardNum,
-        cli.idCard,
-        cli.clientNum,
-        cli.phone,
-        (CASE ope.operate_type
-            WHEN 1 THEN '寮�鍗�'
-            WHEN 2 THEN '鍏呭��'
-            WHEN 3 THEN '閿�鍗�'
-            WHEN 5 THEN '琛ユ墸'
-            WHEN 10 THEN '鍙嶅啓'
-        END) AS operateType,
-        (IFNULL(ope.trade_amount,0.00) + IFNULL(ope.card_cost,0.00)) AS tradeAmount,
-        IFNULL(ope.trade_amount,0.00) AS waterCost,
-        IFNULL(ope.card_cost,0.00) AS cardCost,
-        IFNULL(ope.gift,0.00) AS gift,
-        IFNULL(ope.refund_amount,0.00) AS refundAmount,
-        (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
-        pay.name AS paymentName,
-        ope.operate_dt as tradeTime,
-        us.id AS cashierId,
-        us.name AS cashierName,
-        (CASE card.state
-            WHEN 1 THEN '姝e父'
-            WHEN 2 THEN '宸叉敞閿�'
-            WHEN 3 THEN '宸叉寕澶�'
-        END) AS cardState,
-        cli.districtTitle,
-        cli.villageId AS villageId
+    ope.id AS orderNumber,
+    cli.name AS clientName,
+    card.cardNum AS cardNum,
+    cli.idCard,
+    cli.clientNum,
+    cli.phone,
+    (CASE ope.operate_type
+    WHEN 1 THEN '寮�鍗�'
+    WHEN 2 THEN '鍏呭��'
+    WHEN 3 THEN '閿�鍗�'
+    WHEN 5 THEN '琛ユ墸'
+    WHEN 10 THEN '鍙嶅啓'
+    END) AS operateType,
+    (IFNULL(ope.trade_amount,0.00) + IFNULL(ope.card_cost,0.00)) AS tradeAmount,
+    IFNULL(ope.trade_amount,0.00) AS waterCost,
+    IFNULL(ope.card_cost,0.00) AS cardCost,
+    IFNULL(ope.gift,0.00) AS gift,
+    IFNULL(ope.refund_amount,0.00) AS refundAmount,
+    (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
+    pay.name AS paymentName,
+    ope.operate_dt as tradeTime,
+    us.id AS cashierId,
+    us.name AS cashierName,
+    (CASE card.state
+    WHEN 1 THEN '姝e父'
+    WHEN 2 THEN '宸叉敞閿�'
+    WHEN 3 THEN '宸叉寕澶�'
+    END) AS cardState,
+    cli.districtTitle,
+    cli.villageId AS villageId
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON card.id = ope.card_id
-        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON card.id = ope.card_id
+    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
     <where>
       AND ope.operate_type IN(1,2,3,5,10)
       AND ope.operate_valid = 2
@@ -422,11 +436,11 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇寮�鍗¤褰曟暟閲�-->
   <select id="getActiveCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
     <where>
       AND ope.operate_type = 1
       AND ope.operate_valid = 2
@@ -451,24 +465,24 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇寮�鍗¤褰�-->
   <select id="getActiveCards" resultType="com.dy.pipIrrGlobal.voSe.VoActiveCard">
     SELECT
-        ope.id,
-        cli.name AS clientName,
-        cli.clientNum AS clientNum,
-        card.cardNum AS cardNum,
-        card.state AS state,
-        (CASE
-            WHEN card.state = 1 THEN '姝e父'
-            WHEN card.state = 2 THEN '宸叉敞閿�'
-            WHEN card.state = 3 THEN '宸叉寕澶�'
-        END) AS stateName,
-        ope.card_cost AS cardCost,
-        pay.name AS paymentName,
-        (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
-        ope.operate_dt AS operateDt
+    ope.id,
+    cli.name AS clientName,
+    cli.clientNum AS clientNum,
+    card.cardNum AS cardNum,
+    card.state AS state,
+    (CASE
+    WHEN card.state = 1 THEN '姝e父'
+    WHEN card.state = 2 THEN '宸叉敞閿�'
+    WHEN card.state = 3 THEN '宸叉寕澶�'
+    END) AS stateName,
+    ope.card_cost AS cardCost,
+    pay.name AS paymentName,
+    (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
+    ope.operate_dt AS operateDt
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
     <where>
       AND ope.operate_type = 1
       AND ope.operate_valid = 2
@@ -499,10 +513,10 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍鏁伴噺-->
   <select id="getReissueCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
     <where>
       AND ope.operate_type = 4
       AND ope.operate_valid = 2
@@ -523,17 +537,17 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍-->
   <select id="getReissueCards" resultType="com.dy.pipIrrGlobal.voSe.VoReissueCard">
     SELECT
-        CAST(ope.id AS char) AS id ,
-        cli.name AS clientName,
-        cli.clientNum AS clientNum,
-        card.cardNum AS cardNum,
-        ope.card_cost AS cardCost,
-        IFNULL(ope.no_trade_amount,0) AS reissueAmount,
-        (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
-        ope.operate_dt AS operateDt
+    CAST(ope.id AS char) AS id ,
+    cli.name AS clientName,
+    cli.clientNum AS clientNum,
+    card.cardNum AS cardNum,
+    ope.card_cost AS cardCost,
+    IFNULL(ope.no_trade_amount,0) AS reissueAmount,
+    (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
+    ope.operate_dt AS operateDt
     FROM se_card_operate ope
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
     <where>
       AND ope.operate_type = 4
       AND ope.operate_valid = 2
@@ -560,11 +574,11 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇閫氱敤鎿嶄綔璁板綍鏁伴噺-->
   <select id="getCommonOperationRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
     <where>
       AND ope.operate_valid = 2
       <if test = "operateType != null and operateType > 0">
@@ -588,21 +602,21 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇閫氱敤鎿嶄綔璁板綍-->
   <select id="getCommonOperations" resultType="com.dy.pipIrrGlobal.voSe.VoOperate">
     SELECT
-        cli.name AS clientName,
-        cli.clientNum,
-        CAST(card.cardNum AS char) AS cardNum,
-        us.name AS operator,
-        ope.operate_dt AS operateDt,
-        IFNULL(ope.trade_amount,0) AS refund,
-        (CASE
-            WHEN ope.payment_id = 1 THEN '鐜伴噾'
-        END) AS refundTypeName,
-        card.money,
-        IFNULL(ope.system_balance,0) AS systemBalance
+    cli.name AS clientName,
+    cli.clientNum,
+    CAST(card.cardNum AS char) AS cardNum,
+    us.name AS operator,
+    ope.operate_dt AS operateDt,
+    IFNULL(ope.trade_amount,0) AS refund,
+    (CASE
+    WHEN ope.payment_id = 1 THEN '鐜伴噾'
+    END) AS refundTypeName,
+    card.money,
+    IFNULL(ope.system_balance,0) AS systemBalance
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
     <where>
       AND ope.operate_valid = 2
       <if test = "operateType != null and operateType > 0">
@@ -632,14 +646,14 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鍒楄〃鏁�-->
   <select id="getReceiptsRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     SELECT
-        COUNT(*) AS recordCount
+    COUNT(*) AS recordCount
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
-        LEFT JOIN ba_district vil ON cli.villageId = vil.id
-        LEFT JOIN ba_district tow ON cli.townId = tow.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN ba_district vil ON cli.villageId = vil.id
+    LEFT JOIN ba_district tow ON cli.townId = tow.id
     <where>
       AND ope.operate_type IN(1,2)
       AND ope.operate_valid = 2
@@ -668,34 +682,34 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鍒楄〃-->
   <select id="getReceipts" resultType="com.dy.pipIrrGlobal.voSe.VoReceipt">
     SELECT
-        ope.id AS orderNumber,
-        tow.name AS townName,
-        vil.name AS villageName,
-        cli.`name`,
-        cli.phone,
-        cli.clientNum,
-        card.cardNum,
-        (CASE
-            WHEN ope.operate_type = 1 THEN '寮�鍗�'
-            WHEN ope.operate_type = 2 THEN '鍏呭��'
-        END) AS operateType,
-        IFNULL(ope.trade_amount,0) AS waterCost,
-        IFNULL(ope.gift,0) AS gift,
-        IFNULL(ope.card_cost,0) AS cardCost,
-        (IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS amount,
-        card.money,
-        pay.`name` AS paymentName,
-        us.`name` AS operatorName,
-        ope.operate_dt AS operateTime,
-        ope.operator AS cashierId,
-        NOW() AS currentTime
+    ope.id AS orderNumber,
+    tow.name AS townName,
+    vil.name AS villageName,
+    cli.`name`,
+    cli.phone,
+    cli.clientNum,
+    card.cardNum,
+    (CASE
+    WHEN ope.operate_type = 1 THEN '寮�鍗�'
+    WHEN ope.operate_type = 2 THEN '鍏呭��'
+    END) AS operateType,
+    IFNULL(ope.trade_amount,0) AS waterCost,
+    IFNULL(ope.gift,0) AS gift,
+    IFNULL(ope.card_cost,0) AS cardCost,
+    (IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS amount,
+    card.money,
+    pay.`name` AS paymentName,
+    us.`name` AS operatorName,
+    ope.operate_dt AS operateTime,
+    ope.operator AS cashierId,
+    NOW() AS currentTime
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
-        LEFT JOIN ba_district vil ON cli.villageId = vil.id
-        LEFT JOIN ba_district tow ON cli.townId = tow.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN ba_district vil ON cli.villageId = vil.id
+    LEFT JOIN ba_district tow ON cli.townId = tow.id
     <where>
       AND ope.operate_type IN(1,2)
       AND ope.operate_valid = 2
@@ -730,14 +744,14 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鏀惰垂閲戦鍚堣-->
   <select id="getTotalAmount" parameterType="java.util.Map" resultType="java.lang.Double">
     SELECT
-        SUM(IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS totalAmount
+    SUM(IFNULL(ope.trade_amount,0) + IFNULL(ope.card_cost,0)) AS totalAmount
     FROM se_card_operate ope
-        LEFT JOIN se_client cli ON ope.client_id = cli.id
-        LEFT JOIN se_client_card card ON ope.card_id = card.id
-        LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
-        LEFT JOIN ba_user us ON ope.operator = us.id
-        LEFT JOIN ba_district vil ON cli.villageId = vil.id
-        LEFT JOIN ba_district tow ON cli.townId = tow.id
+    LEFT JOIN se_client cli ON ope.client_id = cli.id
+    LEFT JOIN se_client_card card ON ope.card_id = card.id
+    LEFT JOIN se_payment_method pay ON ope.payment_id = pay.id
+    LEFT JOIN ba_user us ON ope.operator = us.id
+    LEFT JOIN ba_district vil ON cli.villageId = vil.id
+    LEFT JOIN ba_district tow ON cli.townId = tow.id
     <where>
       AND ope.operate_type IN(1,2)
       AND ope.operate_valid = 2
@@ -758,9 +772,9 @@
   <!--鏍规嵁姘村崱缂栧彿鑾峰彇鍏舵寕澶辨椂閫�娆鹃噾棰濓紙琛ュ崱鏃跺垽鏂娇鐢級-->
   <select id="getTradeAmountByCardNo" resultType="java.lang.Double">
     SELECT
-        ope.trade_amount AS tradeAmount
+    ope.trade_amount AS tradeAmount
     FROM se_client_card card
-        INNER JOIN se_card_operate ope ON ope.card_id = card.id
+    INNER JOIN se_card_operate ope ON ope.card_id = card.id
     <where>
       AND ope.operate_type = 6
       AND card.cardNum = #{cardNum}
@@ -800,7 +814,7 @@
     select
     count(*)
     from
-      (
+    (
     SELECT
     sco.client_id AS clientId,
     sc.`name` AS clientName,
@@ -815,22 +829,22 @@
     WHERE
     sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
     GROUP BY sc.id) c
-    </select>
+  </select>
   <!--鎸囧畾鏃堕棿娈靛唴寮�鐗╃悊鍗″啘鎴�-->
   <select id="getOpenIcCardClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientOpenCardCount">
     SELECT
-      sco.client_id AS clientId,
-      sc.`name` AS clientName,
-      sc.clientNum AS clientNum,
-      sc.address AS address,
-      sc.phone AS phone,
-      sc.idCard AS idCard,
-      COUNT(sc.id) AS openCardCount
+    sco.client_id AS clientId,
+    sc.`name` AS clientName,
+    sc.clientNum AS clientNum,
+    sc.address AS address,
+    sc.phone AS phone,
+    sc.idCard AS idCard,
+    COUNT(sc.id) AS openCardCount
     FROM
-      `se_card_operate` sco
-        INNER JOIN se_client sc ON sc.id = sco.client_id
+    `se_card_operate` sco
+    INNER JOIN se_client sc ON sc.id = sco.client_id
     WHERE
-      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
+    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 1 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
     GROUP BY sc.id
     ORDER BY sc.id DESC
     <trim prefix="limit " >
@@ -863,18 +877,18 @@
   <!--鎸囧畾鏃堕棿娈靛唴姣忎釜鍐滄埛鍏呭�煎悎璁�-->
   <select id="getRechargeTotalClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal">
     SELECT
-      sco.client_id AS clientId,
-      sc.`name` AS clientName,
-      sc.clientNum AS clientNum,
-      sc.address AS address,
-      sc.phone AS phone,
-      sc.idCard AS idCard,
-      IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
+    sco.client_id AS clientId,
+    sc.`name` AS clientName,
+    sc.clientNum AS clientNum,
+    sc.address AS address,
+    sc.phone AS phone,
+    sc.idCard AS idCard,
+    IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
     FROM
-      `se_card_operate` sco
-        INNER JOIN se_client sc ON sc.id = sco.client_id
+    `se_card_operate` sco
+    INNER JOIN se_client sc ON sc.id = sco.client_id
     WHERE
-      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
+    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
     GROUP BY sc.id
     ORDER BY sc.id DESC
     <trim prefix="limit " >
@@ -908,18 +922,18 @@
   <!--鎸囧畾鏃堕棿娈靛唴鐗╃悊鍗″厖鍊奸噾棰濊秴杩囨寚瀹氬�肩殑鍐滄埛-->
   <select id="getRechargeTotalGtValueClients" resultType="com.dy.pipIrrGlobal.voSt.VoClientRechargeTotal">
     SELECT
-      sco.client_id AS clientId,
-      sc.`name` AS clientName,
-      sc.clientNum AS clientNum,
-      sc.address AS address,
-      sc.phone AS phone,
-      sc.idCard AS idCard,
-      IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
+    sco.client_id AS clientId,
+    sc.`name` AS clientName,
+    sc.clientNum AS clientNum,
+    sc.address AS address,
+    sc.phone AS phone,
+    sc.idCard AS idCard,
+    IFNULL(SUM(sco.trade_amount),0) AS rechargeTotal
     FROM
-      `se_card_operate` sco
-        INNER JOIN se_client sc ON sc.id = sco.client_id
+    `se_card_operate` sco
+    INNER JOIN se_client sc ON sc.id = sco.client_id
     WHERE
-      sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
+    sco.operate_dt BETWEEN #{timeStart} AND #{timeStop} AND sco.operate_type = 2 AND sc.deleted = 0 AND sc.disabled = 0 AND sco.operate_valid = 2
     GROUP BY sc.id
     HAVING IFNULL(SUM(sco.trade_amount),0) &gt; #{value}
     ORDER BY sc.id DESC
@@ -934,10 +948,10 @@
   <select id="getRechargesCountNew" resultType="java.lang.Long">
     SELECT COUNT(*) AS recordCount
     FROM se_client_card card
-        LEFT JOIN se_client cli ON cli.id = card.clientId
-        LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
-        LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
-        LEFT JOIN ba_user us ON us.id = rch.operator
+    LEFT JOIN se_client cli ON cli.id = card.clientId
+    LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
+    LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
+    LEFT JOIN ba_user us ON us.id = rch.operator
     <where>
       AND rch.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
@@ -957,20 +971,20 @@
   <!--鑾峰彇鍏呭�艰褰曪紝绠$悊骞冲彴鍏呭�煎垪琛ㄤ娇鐢紝APP鏈娇鐢�-->
   <select id="getRechargesNew" resultType="com.dy.pipIrrGlobal.voSe.VoRechargeNew">
     SELECT
-        cli.name AS clientName,
-        cli.clientNum,
-        card.cardNum,
-        IFNULL(rch.amount, 0) AS amount,
-        IFNULL(rch.gift, 0) AS gift,
-        IFNULL(rch.afterRecharge, 0) AS afterRecharge,
-        pay.name AS paymentName,
-        us.name AS operator,
-        rch.operateDt AS operateTime
+    cli.name AS clientName,
+    cli.clientNum,
+    card.cardNum,
+    IFNULL(rch.amount, 0) AS amount,
+    IFNULL(rch.gift, 0) AS gift,
+    IFNULL(rch.afterRecharge, 0) AS afterRecharge,
+    pay.name AS paymentName,
+    us.name AS operator,
+    rch.operateDt AS operateTime
     FROM se_client_card card
-        LEFT JOIN se_client cli ON cli.id = card.clientId
-        LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
-        LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
-        LEFT JOIN ba_user us ON us.id = rch.operator
+    LEFT JOIN se_client cli ON cli.id = card.clientId
+    LEFT JOIN se_recharge_history rch ON rch.cardId = card.id
+    LEFT JOIN se_payment_method pay ON pay.id = rch.paymentId
+    LEFT JOIN ba_user us ON us.id = rch.operator
     <where>
       AND rch.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
@@ -997,9 +1011,9 @@
   <select id="getRefundsCount" resultType="java.lang.Long">
     SELECT COUNT(*) AS recordCount
     FROM se_client_card card
-        INNER JOIN se_client cli ON cli.id = card.clientId
-        LEFT JOIN se_card_operate ope ON ope.card_id = card.id
-        INNER JOIN ba_user us ON us.id = ope.operator
+    INNER JOIN se_client cli ON cli.id = card.clientId
+    LEFT JOIN se_card_operate ope ON ope.card_id = card.id
+    INNER JOIN ba_user us ON us.id = ope.operator
     <where>
       AND ope.operate_type = 5
       AND ope.operate_valid = 2
@@ -1020,17 +1034,17 @@
   <!--鑾峰彇杩旇繕璁板綍锛岀鐞嗗钩鍙板厖鍊煎垪琛ㄤ娇鐢�-->
   <select id="getRefunds" resultType="com.dy.pipIrrGlobal.voSe.VoRefund">
     SELECT
-        cli.name AS clientName,
-        cli.clientNum,
-        card.cardNum,
-        IFNULL(ope.money, 0) AS money,
-        IFNULL(ope.refund_amount, 0) AS refundAmount,
-        us.name AS operator,
-        ope.operate_dt AS operateTime
+    cli.name AS clientName,
+    cli.clientNum,
+    card.cardNum,
+    IFNULL(ope.money, 0) AS money,
+    IFNULL(ope.refund_amount, 0) AS refundAmount,
+    us.name AS operator,
+    ope.operate_dt AS operateTime
     FROM se_client_card card
-        INNER JOIN se_client cli ON cli.id = card.clientId
-        LEFT JOIN se_card_operate ope ON ope.card_id = card.id
-        INNER JOIN ba_user us ON us.id = ope.operator
+    INNER JOIN se_client cli ON cli.id = card.clientId
+    LEFT JOIN se_card_operate ope ON ope.card_id = card.id
+    INNER JOIN ba_user us ON us.id = ope.operator
     <where>
       AND ope.operate_type = 5
       AND ope.operate_valid = 2
@@ -1058,14 +1072,14 @@
   <!--鏍规嵁姘村崱ID銆佹搷浣滅被鍨嬭幏鍙栬幏鍙栨渶鍚庝竴鏉¤褰曪紝鍒ゆ柇寮�鍗℃槸鍚﹀悓姝ュ厖鍊间娇鐢�-->
   <update id="turnOperateValidByCardId">
     UPDATE se_card_operate
-        SET operate_valid = 2
+    SET operate_valid = 2
     WHERE id = (
-        SELECT id FROM (
-            SELECT id
-        FROM se_card_operate
-        WHERE operate_valid = 1 AND operate_type = #{operateType} AND card_id = #{cardId}
-        ORDER BY id DESC
-        LIMIT 1) AS subquery
+    SELECT id FROM (
+    SELECT id
+    FROM se_card_operate
+    WHERE operate_valid = 1 AND operate_type = #{operateType} AND card_id = #{cardId}
+    ORDER BY id DESC
+    LIMIT 1) AS subquery
     );
   </update>
 
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
index 91c9588..5b0014b 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
@@ -549,4 +549,83 @@
       </if>
     </trim>
   </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛璁板綍鏁癬鍏呭�兼満-->
+  <select id="getTermClientCount" resultType="java.lang.Long">
+    SELECT
+      count(*)
+    FROM se_client cli
+        LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
+    <where>
+      AND cli.disabled = 0
+      AND cli.deleted = 0
+      <if test = "name != null and name !=''">
+        AND cli.name like CONCAT('%',#{name},'%')
+      </if>
+
+      <if test = "clientNum != null and clientNum !=''">
+        AND cli.clientNum like CONCAT('%',#{clientNum},'%')
+      </if>
+
+      <if test = "phone != null and phone !=''">
+        AND cli.phone like CONCAT('%',#{phone},'%')
+      </if>
+    </where>
+  </select>
+
+  <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛鏁版嵁_鍏呭�兼満-->
+  <select id="getTermClients" resultType="com.dy.pipIrrGlobal.voSe.VoTermClient">
+    SELECT
+        cli.id AS clientId,
+        cli.clientNum,
+        cli.name,
+        cli.phone,
+        cli.idCard,
+        dis_village.name AS villageName,
+        cli.address,
+        (SELECT COUNT(*) FROM se_client_card WHERE clientId = cli.id)+(SELECT COUNT(*) FROM se_virtual_card WHERE client_id = cli.id) AS cardCount,
+        cli.operateDt,
+        cli.districtNum
+    FROM se_client cli
+        LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
+    <where>
+      AND cli.disabled = 0
+      AND cli.deleted = 0
+      <if test = "name != null and name !=''">
+        AND cli.name like CONCAT('%',#{name},'%')
+      </if>
+
+      <if test = "clientNum != null and clientNum !=''">
+        AND cli.clientNum like CONCAT('%',#{clientNum},'%')
+      </if>
+
+      <if test = "phone != null and phone !=''">
+        AND cli.phone like CONCAT('%',#{phone},'%')
+      </if>
+    </where>
+    ORDER BY cli.operateDt DESC
+    <trim prefix="limit " >
+      <if test="start != null and count != null">
+        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
+      </if>
+    </trim>
+  </select>
+
+  <!--鏍规嵁鍐滄埛ID鑾峰彇涓�涓啘鎴锋暟鎹甠鍏呭�兼満-->
+  <select id="getTermOneClient" resultType="com.dy.pipIrrGlobal.voSe.VoTermClient">
+    SELECT
+      cli.id AS clientId,
+      cli.clientNum,
+      cli.name,
+      cli.phone,
+      cli.idCard,
+      dis_village.name AS villageName,
+      cli.address,
+      (SELECT COUNT(*) FROM se_client_card WHERE clientId = cli.id)+(SELECT COUNT(*) FROM se_virtual_card WHERE client_id = cli.id) AS cardCount,
+      cli.operateDt,
+      cli.districtNum
+    FROM se_client cli
+           LEFT JOIN ba_district dis_village ON cli.villageId = dis_village.id
+    WHERE cli.disabled = 0 AND cli.deleted = 0 AND cli.id = #{clientId}
+  </select>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java
index f798af0..3a03493 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/card/IcCardSv.java
@@ -1,7 +1,6 @@
 package com.dy.pipIrrStatistics.card;
 
 import com.dy.common.webUtil.QueryResultVo;
-import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
 import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
 import com.dy.pipIrrGlobal.voSt.VoCardUsage;
 import com.dy.pipIrrGlobal.voSt.VoICCard;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java
index 5a61fcf..e825abd 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/client/ClientSv.java
@@ -3,7 +3,6 @@
 import com.dy.common.webUtil.QueryResultVo;
 import com.dy.pipIrrGlobal.daoRm.RmClientAmountDayLastMapper;
 import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveHistoryMapper;
-import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
 import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
 import com.dy.pipIrrGlobal.voSt.*;
 import com.dy.pipIrrStatistics.card.IcCardqo.CommonQO;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes
new file mode 100644
index 0000000..3b41682
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitattributes
@@ -0,0 +1,2 @@
+/mvnw text eol=lf
+*.cmd text eol=crlf
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitignore b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.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-terminal/.mvn/wrapper/maven-wrapper.properties b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..d58dfb7
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wrapperVersion=3.3.2
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw
new file mode 100644
index 0000000..19529dd
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw
@@ -0,0 +1,259 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.2
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  if [ -n "${JAVA_HOME-}" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+trim() {
+  # MWRAPPER-139:
+  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
+  #   Needed for removing poorly interpreted newline sequences when running in more
+  #   exotic environments such as mingw bash on Windows.
+  printf "%s" "${1}" | tr -d '[:space:]'
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl=$(trim "${value-}") ;;
+  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
+MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd
new file mode 100644
index 0000000..249bdf3
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/mvnw.cmd
@@ -0,0 +1,149 @@
+<# : batch portion
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Apache Maven Wrapper startup batch script, version 3.3.2
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
+if ($env:MAVEN_USER_HOME) {
+  $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
+}
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml
new file mode 100644
index 0000000..addccc1
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/pom.xml
@@ -0,0 +1,138 @@
+<?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-terminal</artifactId>
+    <name>pipIrr-web-terminal</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.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>
+
+            <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-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java
new file mode 100644
index 0000000..e27b024
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/PipIrrTerminalApplication.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrTerminal;
+
+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.pipIrrTerminal"},
+        excludeFilters = {
+                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
+                        com.dy.common.singleDataSource.DruidDataSourceConfig.class //鎺掗櫎鍗曟暟鎹簮
+                })
+        }
+)
+@MapperScan({"com.dy.pipIrrGlobal.daoPr", "com.dy.pipIrrGlobal.daoBa","com.dy.pipIrrGlobal.daoFi", "com.dy.pipIrrGlobal.daoSe"})
+public class PipIrrTerminalApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(PipIrrTerminalApplication.class, args);
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
new file mode 100644
index 0000000..1c6cc15
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
@@ -0,0 +1,52 @@
+package com.dy.pipIrrTerminal.card;
+
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.pipIrrGlobal.voSe.VoTermRecharge;
+import com.dy.pipIrrTerminal.card.dto.ActiveCard;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 10:15
+ * @LastEditTime 2025-05-08 10:15
+ * @Description
+ */
+
+@Slf4j
+@RestController
+@RequestMapping(path = "card")
+@RequiredArgsConstructor
+public class CardCtrl {
+    private final CardSv cardSv;
+
+    @PostMapping(path = "activeTermCard", consumes = MediaType.APPLICATION_JSON_VALUE)
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<VoTermRecharge> activeTermCard(@RequestBody @Valid ActiveCard po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
+            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+
+        Map map_result = cardSv.activeOrReissueTermCard(po);
+        if(map_result.get("success").equals(false)) {
+            return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString());
+        }
+        return BaseResponseUtils.buildSuccess(map_result.get("content")) ;
+
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
new file mode 100644
index 0000000..e244ab3
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -0,0 +1,267 @@
+package com.dy.pipIrrTerminal.card;
+
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
+import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
+import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
+import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
+import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
+import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
+import com.dy.pipIrrGlobal.voSe.VoTermRecharge;
+import com.dy.pipIrrTerminal.card.dto.ActiveCard;
+import com.dy.pipIrrTerminal.card.dto.DtoRecharge;
+import com.dy.pipIrrTerminal.card.enums.CardStateENUM;
+import com.dy.pipIrrTerminal.card.enums.LastOperateENUM;
+import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 10:15
+ * @LastEditTime 2025-05-08 10:15
+ * @Description
+ */
+
+@Slf4j
+@Service
+public class CardSv {
+    @Autowired
+    private SeCardOperateMapper seCardOperateMapper;
+
+    @Autowired
+    private SeClientCardMapper seClientCardMapper;
+
+    @Autowired
+    private SeClientMapper seClientMapper;
+
+    @Autowired
+    private PrWaterPriceMapper prWaterPriceMapper;
+
+    @Value("${project.projectNo}")
+    private Integer projectNo;
+
+    /**
+     * 鏍规嵁姘村崱鍦板潃鍒ゆ柇璇ュ崱鏄惁鍙互寮�鍗�
+     * @param cardAddr
+     * @return true:鍙互寮�鍗�
+     */
+    public Boolean canActiveCard(String cardAddr) {
+        // 鎸囧畾姘村崱鍦板潃鐨勬按鍗℃暟閲忥紝鏃犳晥鍗$墖鎺掗櫎鍦ㄥ
+        Long cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddr(cardAddr)).orElse(0L);
+        if (cardCount == 0) {
+            return true;
+        }
+
+        // 鎸囧畾姘村崱鍦板潃涓旀甯哥姸鎬佹垨鎸傚け鐘舵�佺殑姘村崱鏁伴噺
+        cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddrAndState(cardAddr)).orElse(0L);
+        if (cardCount == 0) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * 鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode锛岃ˉ鍗¤繃绋嬩腑寮�鏂板崱浣跨敤
+     * @param clientId
+     * @return
+     */
+    public Long getAreaCodeById(Long clientId) {
+        return seClientMapper.getAreaCodeById(clientId);
+    }
+
+    public String getCardNumOfMax(String areaCode) {
+        return seClientCardMapper.getCardNumOfMax(areaCode);
+    }
+
+    public Map generateCardNum(Long clientId) {
+        Map map_cardNum = new HashMap<>();
+        map_cardNum.put("success", false);
+        map_cardNum.put("content", null);
+
+        // 鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode
+        Long areaCodeL = getAreaCodeById(clientId);
+        if (areaCodeL == null) {
+            map_cardNum.put("msg", "璇ュ啘鎴疯鏀垮尯鍒掑紓甯�");
+            return map_cardNum;
+        }
+
+        String areaCode = String.valueOf(areaCodeL);
+        String cardNum = Optional.ofNullable(getCardNumOfMax(areaCode)).orElse("");
+        if (cardNum != null && cardNum.trim().length() > 0) {
+            Integer number = Integer.parseInt(cardNum.substring(12));
+            number = number + 1;
+            if (number > 65535) {
+                map_cardNum.put("msg", "姘村崱缂栧彿宸叉弧");
+                return map_cardNum;
+            }
+            cardNum = cardNum.substring(0, 12) + String.format("%05d", number);
+        } else {
+            cardNum = areaCode + "00001";
+        }
+
+        map_cardNum.put("success", true);
+        map_cardNum.put("content", cardNum);
+        return map_cardNum;
+    }
+
+    public String generateOrderNo() {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
+        LocalDateTime dateTime = LocalDateTime.now();
+        Random random = new Random();
+        String CHARACTERS = "0123456789";
+        StringBuilder sb = new StringBuilder(4);
+        for (int i = 0; i < 4; i++) {
+            int index = random.nextInt(CHARACTERS.length());
+            sb.append(CHARACTERS.charAt(index));
+        }
+        return dtf.format(dateTime) + sb.toString();
+    }
+
+
+    public Map addCardAndOperate(ActiveCard po, Long cardNum, String orderNo) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        // amount锛氬厖鍊兼帴鍙d负杈撳叆鍙傛暟锛岃ˉ鍗℃帴鍙d负鍘熷崱閫�杩橀噾棰�
+        SeClientCard seClientCard = new SeClientCard();
+        seClientCard.setProtocol(po.getProtocol());
+        seClientCard.setCardaddr(po.getCardAddr());
+        seClientCard.setCardnum(String.valueOf(cardNum));
+        seClientCard.setClientid(po.getClientId());
+        seClientCard.setMoney(po.getAmount());
+        seClientCard.setState(CardStateENUM.INVALID.getCode());
+        if (po.getOriginalCardId() != null) {
+            // 琛ュ崱
+            seClientCard.setOriginalCardId(po.getOriginalCardId());
+            seClientCard.setLastoper(LastOperateENUM.REPLACE.getCode());
+            seClientCard.setReplacedt(new Date());
+        } else {
+            // 寮�鏂板崱
+            seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
+            seClientCard.setCreatedt(new Date());
+        }
+
+        seClientCardMapper.insert(seClientCard);
+        Long cardId = Optional.ofNullable(seClientCard.getId()).orElse(0L);
+        if (cardId == 0) {
+            map.put("msg", "寮�鍗″け璐�-鍐滄埛鍗″啓鍏ュ紓甯�");
+            return map;
+        }
+
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(po.getClientId());
+        seCardOperate.setMoney(0f);
+        seCardOperate.setCardCost(po.getCardCost());
+        seCardOperate.setPaymentId(po.getPaymentId());
+        if (po.getOriginalCardId() != null) {
+            // 琛ュ崱
+            seCardOperate.setOperateType(OperateTypeENUM.REISSUE.getCode());
+            seCardOperate.setNoTradeAmount(po.getAmount());
+        } else {
+            // 寮�鏂板崱
+            seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
+        }
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(new Date());
+        seCardOperate.setOrderNo(orderNo);
+        seCardOperate.setOperateValid((byte) 1);
+
+        seCardOperateMapper.insert(seCardOperate);
+        Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
+        if (rec == 0) {
+            map.put("msg", "寮�鍗″け璐�-寮�鍗¤褰曞啓鍏ュ紓甯�");
+            return map;
+        }
+
+        map.put("success", true);
+        return map;
+    }
+
+    public Map plusRecharge(ActiveCard po, Long cardNum) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        DtoRecharge dtoRecharge = new DtoRecharge();
+        dtoRecharge.setCardNum(cardNum);
+        dtoRecharge.setAmount(po.getAmount());
+        dtoRecharge.setPaymentId(po.getPaymentId());
+        dtoRecharge.setRemarks(po.getRemarks());
+        dtoRecharge.setOperator(po.getOperator());
+        dtoRecharge.setMoney(0f);
+        dtoRecharge.setGift(0f);
+        dtoRecharge.setPrice(0f);
+        //BaseResponse<Boolean> job = cardOperateSv.addRecharge(dtoRecharge);
+        BaseResponse<Boolean> job = null;
+        if (!job.getCode().equals("0001")) {
+            map.put("msg", "寮�鍗″け璐�-鍏呭�煎紓甯�");
+            return map;
+        }
+
+        map.put("success", true);
+        return map;
+    }
+
+    public Map activeOrReissueTermCard(ActiveCard po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+        Float amount = po.getAmount();
+        Long originalCardId = po.getOriginalCardId();
+
+        if (!canActiveCard(po.getCardAddr())) {
+            map.put("msg", "寮�鍗″け璐�-姝ゅ崱宸插瓨鍦�");
+            return map;
+        }
+
+        Map map_cardNum = generateCardNum(po.getClientId());
+        if(map_cardNum.get("success").equals(false)) {
+            map.put("msg", map_cardNum.get("msg").toString());
+            return map;
+        }
+        Long cardNum = Long.parseLong(map_cardNum.get("content").toString());
+
+        String orderNo = generateOrderNo();
+        Map map_addCardAndOperate = addCardAndOperate(po, cardNum, orderNo);
+        if(map_addCardAndOperate.get("success").equals(false)) {
+            map.put("msg", map_addCardAndOperate.get("msg").toString());
+            return map;
+        }
+
+        if (amount != null && amount > 0 && originalCardId == null) {
+            Map map_plusRecharge = plusRecharge(po, cardNum);
+            if(map_plusRecharge.get("success").equals(false)) {
+                map.put("msg", map_plusRecharge.get("msg").toString());
+                return map;
+            }
+        }
+
+        Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum)).orElse(0f);
+        Double waterPrice = prWaterPriceMapper.getPrice();
+
+        VoTermRecharge voTermRecharge = new VoTermRecharge();
+        voTermRecharge.setProjectNo(projectNo);
+        voTermRecharge.setCardNum(cardNum);
+        voTermRecharge.setBalance(balance);
+        voTermRecharge.setWaterPrice(waterPrice);
+        voTermRecharge.setTime(new Date());
+        voTermRecharge.setOrderNo(orderNo);
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voTermRecharge);
+        return map;
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java
new file mode 100644
index 0000000..5e5f365
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/ActiveCard.java
@@ -0,0 +1,69 @@
+package com.dy.pipIrrTerminal.card.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 10:26
+ * @LastEditTime 2025-05-08 10:26
+ * @Description
+ */
+
+@Data
+public class ActiveCard {
+    public static final long serialVersionUID = 202505081027001L;
+
+    /**
+     * 鍗忚鍚嶇О
+     */
+    @NotBlank(message = "鍗忚涓嶈兘涓虹┖")
+    private String protocol;
+
+    /**
+     * 姘村崱鍦板潃锛屼粎淇濆瓨锛屾棤涓氬姟
+     */
+    @NotBlank(message = "姘村崱鍦板潃涓嶈兘涓虹┖")
+    private String cardAddr;
+
+    /**
+     * 鍐滄埛ID锛堜富閿級
+     */
+    @NotNull(message = "鍐滄埛涓嶈兘涓虹┖")
+    private Long clientId;
+
+    /**
+     * 鍘熸寕澶卞崱ID锛岃ˉ鍗¤繃绋嬪紑鍗¢渶瑕�
+     */
+    private Long originalCardId;
+
+    /**
+     * 鍗$墖璐圭敤
+     */
+    @NotNull(message = "鍗$墖璐圭敤涓嶈兘涓虹┖")
+    private Integer cardCost;
+
+    /**
+     * 鍏呭�奸噾棰�
+     */
+    private Float amount;
+
+    /**
+     * 鏀粯鏂瑰紡缂栧彿
+     */
+    @NotNull(message = "浠樻柟寮忎笉鑳戒负绌�")
+    private Long paymentId;
+
+    /**
+     * 澶囨敞淇℃伅
+     */
+    private String remarks;
+
+    /**
+     * 鎿嶄綔浜虹紪鍙�
+     */
+    @NotNull(message = "鎿嶄綔浜轰笉鑳戒负绌�")
+    private Long operator;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
new file mode 100644
index 0000000..0497da6
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRecharge.java
@@ -0,0 +1,73 @@
+package com.dy.pipIrrTerminal.card.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
+import lombok.*;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 14:46
+ * @LastEditTime 2025-05-08 14:46
+ * @Description
+ */
+
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+public class DtoRecharge {
+    public static final long serialVersionUID = 202505081447001L;
+
+    /**
+     * 姘村崱缂栧彿
+     */
+    @NotNull(message = "姘村崱缂栧彿涓嶈兘涓虹┖")
+    private Long cardNum;
+
+    /**
+     * 鍐滄埛ID锛屼笉鏄厖鍊兼帴鍙d紶鍏ワ紝鐢卞紑鍗″璞′紶鍏ワ紝淇濆瓨鍏呭�艰褰曢渶瑕�
+     */
+    private Long clientId;
+
+    /**
+     * 鍗$墖浣欓
+     */
+    @Min(value = 0, message="鍗$墖浣欓涓嶈兘灏忎簬0")
+    private Float money;
+
+    /**
+     * 鍏呭�奸噾棰�
+     */
+    private Float amount;
+
+    /**
+     * 璧犻�侀噾棰�
+     */
+    @Min(value = 0, message="璧犻�侀噾棰濅笉鑳藉皬浜�0")
+    private Float gift;
+
+    /**
+     * 浠樻鏂瑰紡缂栧彿
+     */
+    private Long paymentId;
+
+    /**
+     * 姘翠环
+     */
+    @Min(value = 0, message="姘翠环涓嶈兘灏忎簬0")
+    private Float price;
+
+    /**
+     * 澶囨敞淇℃伅
+     */
+    private String remarks;
+
+    /**
+     * 鎿嶄綔浜虹紪鍙�
+     */
+    @Positive(message = "鎿嶄綔浜虹紪鍙峰繀椤讳负澶т簬0鐨勬暣鏁�")
+    private Long operator;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java
new file mode 100644
index 0000000..1db31e2
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/CardStateENUM.java
@@ -0,0 +1,23 @@
+package com.dy.pipIrrTerminal.card.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 11:36
+ * @LastEditTime 2025-05-08 11:36
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum CardStateENUM {
+    NORMAL((byte)1, "姝e父"),
+    CANCELLED((byte)2, "宸叉敞閿�"),
+    LOSS((byte)3, "宸叉寕澶�"),
+    INVALID((byte)4, "鏃犳晥鐨�");
+
+    private final Byte code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java
new file mode 100644
index 0000000..54c5781
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/LastOperateENUM.java
@@ -0,0 +1,29 @@
+package com.dy.pipIrrTerminal.card.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 11:34
+ * @LastEditTime 2025-05-08 11:34
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum LastOperateENUM {
+    ACTIVE((byte)1, "寮�鍗�"),
+    RECHARGE((byte)2, "鍏呭��"),
+    CANCEL((byte)3, "娉ㄩ攢"),
+    REPLACE((byte)4, "琛ュ崱"),
+    REFUND((byte)5, "琛ユ墸"),
+    LOSS((byte)6, "鎸傚け"),
+    REVERSAL((byte)7, "鍐叉"),
+    UNLOCK((byte)8, "瑙i攣"),
+    CONSUME((byte)9, "娑堣垂"),
+    WRITE_BACK((byte)10, "鍙嶅啓");
+
+    private final Byte code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java
new file mode 100644
index 0000000..059420e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java
@@ -0,0 +1,29 @@
+package com.dy.pipIrrTerminal.card.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-08 11:45
+ * @LastEditTime 2025-05-08 11:45
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum OperateTypeENUM {
+    ACTIVE((byte)1, "寮�鍗�"),
+    RECHARGE((byte)2, "鍏呭��"),
+    CANCEL((byte)3, "閿�鍗�"),
+    REISSUE((byte)4, "琛ュ崱"),
+    REFUND((byte)5, "琛ユ墸"),
+    LOSS((byte)6, "鎸傚け"),
+    REVERSAL((byte)7, "鍐叉"),
+    UNLOCK((byte)8, "瑙i攣"),
+    CONSUME((byte)9, "娑堣垂"),
+    WRITE_BACK((byte)10, "鍙嶅啓");
+
+    private final Byte code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java
new file mode 100644
index 0000000..59e84d5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientCtrl.java
@@ -0,0 +1,67 @@
+package com.dy.pipIrrTerminal.client;
+
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.voSe.VoTermClient;
+import com.dy.pipIrrTerminal.client.qo.QoClient;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-07 17:23
+ * @LastEditTime 2025-05-07 17:23
+ * @Description
+ */
+
+@Slf4j
+@RestController
+@RequestMapping(path = "client")
+@RequiredArgsConstructor
+public class ClientCtrl {
+    private final ClientSv clientSv;
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛鏁版嵁_鍏呭�兼満
+     * @param vo
+     * @return
+     */
+    @GetMapping(path = "getTermClients")
+    @SsoAop()
+    public BaseResponse<QueryResultVo<List<VoTermClient>>> getTermClients(QoClient vo){
+        try {
+            QueryResultVo<List<VoTermClient>> res = clientSv.getTermClients(vo);
+            return BaseResponseUtils.buildSuccess(res);
+        } catch (Exception e) {
+            log.error("鏌ヨ鍐滄埛寮傚父", e);
+            return BaseResponseUtils.buildException(e.getMessage()) ;
+        }
+    }
+
+    /**
+     * 鏍规嵁鍐滄埛ID鑾峰彇涓�涓啘鎴锋暟鎹甠鍏呭�兼満
+     * @param id
+     * @return
+     */
+    @GetMapping(path = "/getTermOne/{id}")
+    @SsoAop()
+    public BaseResponse<VoTermClient> getTermOneClient(@PathVariable("id") Long id){
+        if(id == null) {
+            return BaseResponseUtils.buildErrorMsg("鍐滄埛ID涓嶈兘涓虹┖");
+        }
+        try {
+            return BaseResponseUtils.buildSuccess(clientSv.getTermOneClient(id));
+        } catch (Exception e) {
+            log.error("鏌ヨ鍐滄埛寮傚父", e);
+            return BaseResponseUtils.buildException(e.getMessage()) ;
+        }
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java
new file mode 100644
index 0000000..2760b73
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/ClientSv.java
@@ -0,0 +1,57 @@
+package com.dy.pipIrrTerminal.client;
+
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
+import com.dy.pipIrrGlobal.voSe.VoClient;
+import com.dy.pipIrrGlobal.voSe.VoTermClient;
+import com.dy.pipIrrTerminal.client.qo.QoClient;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.PojoUtils;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-07 17:25
+ * @LastEditTime 2025-05-07 17:25
+ * @Description
+ */
+
+@Slf4j
+@Service
+public class ClientSv {
+    @Autowired
+    private SeClientMapper seClientMapper;
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鍐滄埛鏁版嵁_鍏呭�兼満
+     * @param queryVo
+     * @return
+     */
+    public QueryResultVo<List<VoTermClient>> getTermClients(QoClient queryVo){
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo) ;
+
+        Long itemTotal = (long)seClientMapper.getTermClientCount(params);
+        QueryResultVo<List<VoTermClient>> rsVo = new QueryResultVo<>() ;
+        rsVo.pageSize = queryVo.pageSize ;
+        rsVo.pageCurr = queryVo.pageCurr ;
+
+        rsVo.calculateAndSet(itemTotal, params);
+        rsVo.obj = seClientMapper.getTermClients(params);
+
+        return rsVo ;
+    }
+
+    /**
+     * 鏍规嵁鍐滄埛ID鑾峰彇涓�涓啘鎴锋暟鎹甠鍏呭�兼満
+     * @param clientId
+     * @return
+     */
+    public VoTermClient getTermOneClient(Long clientId) {
+        return seClientMapper.getTermOneClient(clientId);
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java
new file mode 100644
index 0000000..cd52785
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/client/qo/QoClient.java
@@ -0,0 +1,25 @@
+package com.dy.pipIrrTerminal.client.qo;
+
+import com.dy.common.webUtil.QueryConditionVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2025-05-07 17:16
+ * @LastEditTime 2025-05-07 17:16
+ * @Description 鍏呭�兼満鍐滄埛鏌ヨ瀵硅薄
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class QoClient extends QueryConditionVo {
+
+    public String name;
+
+    public String clientNum;
+
+    public String phone;
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java
new file mode 100644
index 0000000..2a3007a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebFilterConfiguration.java
@@ -0,0 +1,52 @@
+package com.dy.pipIrrTerminal.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 2025/05/07 16:02
+ * @LastEditTime 2025/05/07 16:02
+ * @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-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java
new file mode 100644
index 0000000..c45d0f8
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/config/WebListenerConfiguration.java
@@ -0,0 +1,35 @@
+package com.dy.pipIrrTerminal.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 2025/05/07 16:02
+ * @LastEditTime 2025/05/07 16:02
+ * @Description
+ */
+@Configuration
+public class WebListenerConfiguration {
+
+    /**
+     * 鍚姩椤哄簭
+     */
+    private static final int order_idSetSuffix = 1 ;
+
+
+    /**
+     * 鍐呴儴鎻愪緵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;
+    }
+}
diff --git "a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050121\346\234\215\345\212\241\345\231\250\051.yml" "b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050121\346\234\215\345\212\241\345\231\250\051.yml"
new file mode 100644
index 0000000..1907b46
--- /dev/null
+++ "b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050121\346\234\215\345\212\241\345\231\250\051.yml"
@@ -0,0 +1,4 @@
+spring:
+    profiles:
+        #121鏈嶅姟鍣細common-web, global, database, database-mq, database-yq, database-hlj, database-gz, database-lz, database-jc, self
+        include: common-web, global, database, database-mq, database-yq, database-hlj, database-gz, database-lz, database-jc, self
diff --git "a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050233\346\234\215\345\212\241\345\231\250\051.yml" "b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050233\346\234\215\345\212\241\345\231\250\051.yml"
new file mode 100644
index 0000000..50d9255
--- /dev/null
+++ "b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application\050233\346\234\215\345\212\241\345\231\250\051.yml"
@@ -0,0 +1,4 @@
+spring:
+    profiles:
+        #233鏈嶅姟鍣細common-web, global, database, database-ym, database-sp, database-test,database-mj, self
+        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml
new file mode 100644
index 0000000..e2c47b9
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application-self.yml
@@ -0,0 +1,19 @@
+#actutor鐨剋eb绔彛
+management:
+    server:
+        port: ${pipIrr.terminal.actutorPort}
+#web鏈嶅姟绔彛锛宼omcat榛樿鏄�8090
+server:
+    port: ${pipIrr.terminal.webPort}
+    servlet:
+        context-path: /terminal #web璁块棶涓婁笅鏂囪矾寰�
+        context-parameters:
+            #GenerateIdSetSuffixListener涓簲鐢紝鍙栧�艰寖鍥存槸0-99
+            idSuffix: ${pipIrr.terminal.idSuffix}
+
+logging:
+    level:
+        com:
+            dy:
+                pipIrrGlobal:
+                    daoSe: trace
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml
new file mode 100644
index 0000000..a24b0b5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/application.yml
@@ -0,0 +1,3 @@
+spring:
+    profiles:
+        include: common-web, global, database, database-ym, database-sp, database-test,database-mj, self
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml
new file mode 100644
index 0000000..0e7508c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/resources/log4j2.yml
@@ -0,0 +1,80 @@
+Configuration:
+    #status锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭锛涘彲浠ヨ缃垚Off(鍏抽棴)鎴朎rror(鍙緭鍑洪敊璇俊鎭�)
+    status: Error
+
+    Properties: # 瀹氫箟鍏ㄥ眬鍙橀噺
+        Property:
+            #鏃ュ織鏂囦欢瀛樺偍鐨勭洰褰�
+            - name: log.path
+              value: ./logs
+            #鏃ュ織鏂囦欢瀛樺偍鍚嶇О
+            - name: project.name
+              value: pipIrrOperation
+
+    #瀹氫箟杈撳嚭鍣紝鍙互杈撳嚭鍒版帶鍒跺彴鍜屾枃浠�.
+    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}/${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: "1 MB"
+            DefaultRolloverStrategy:
+              max: 10  #涓�澶╁唴鏃ュ織鏂囦欢鏈�澶т釜鏁�
+              Delete:
+                basePath: "${log.path}"
+                maxDepth: 2 #鍒犻櫎鏃ュ織鏂囦欢鐨勬渶澶ф繁搴�
+                IfFileName:
+                  glob: "${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
+                IfLastModified:
+                  age: "30d" #鏃ュ織鏂囦欢淇濈暀鐨勬渶澶уぉ鏁�
+    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: org.apache.dubbo
+              additivity: false #鍘婚櫎閲嶅鐨刲og
+              level: error #杈撳嚭鏃ュ織绾у埆
+              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-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java
new file mode 100644
index 0000000..891ce21
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/test/java/com/dy/pipIrrTerminal/PipIrrWebTerminalApplicationTests.java
@@ -0,0 +1,13 @@
+package com.dy.pipIrrTerminal;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PipIrrWebTerminalApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pom.xml b/pipIrr-platform/pipIrr-web/pom.xml
index 077869b..8050fdf 100644
--- a/pipIrr-platform/pipIrr-web/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pom.xml
@@ -33,6 +33,7 @@
         <module>pipIrr-web-operation</module>
         <module>pipIrr-web-file</module>
         <module>pipIrr-web-temp</module>
+        <module>pipIrr-web-terminal</module>
     </modules>
 
     <dependencies>

--
Gitblit v1.8.0