From 708dce320caedf9973ff0282098fb70dafd6702e Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期六, 12 十月 2024 14:09:57 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeCardOperate.java                   |    6 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java               |    6 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java   |  359 ++++++++++++----
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java    |    3 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java           |   14 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml                             |  199 +++++---
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java |  409 +++++++++++------
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java              |   16 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml                         |   14 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java           |   37 +
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java               |   21 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml                                 |   38 +
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml                              |  135 +++--
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java   |    4 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java    |   30 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java   |   12 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java          |    8 
 pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml                                            |    3 
 18 files changed, 910 insertions(+), 404 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 93d6b74..f0c50d1 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
@@ -6,6 +6,7 @@
 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;
 import java.util.Map;
@@ -224,4 +225,19 @@
      * @return
      */
     List<VoClientRechargeTotal> getRechargeTotalGtValueClients(Map<String, Object> params);
+
+    /**
+     * 渚濇嵁姘村崱ID灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鎸囧畾鎿嶄綔璁板綍鏀逛负鏈夋晥
+     * @param cardId
+     * @return
+     */
+    Integer turnOperateValidByCardId(@Param("cardId") Long cardId, @Param("operateType") Integer operateType);
+
+
+    /**
+     * 鏍规嵁姘村崱ID銆佹搷浣滅被鍨嬭幏鍙栬幏鍙栨渶鍚庝竴鏉¤褰曪紝鍒ゆ柇寮�鍗℃槸鍚﹀悓姝ュ厖鍊间娇鐢�
+     * @param cardId
+     * @return
+     */
+    SeCardOperate getCardOperate(@Param("operateType") Integer operateType, @Param("cardId") Long cardId);
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
index c87cb33..6b9c775 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -37,6 +37,7 @@
 
     /**
      * 渚濇嵁姘村崱鍦板潃鑾峰彇姘村崱缂栧彿锛�12鏈�19鏃ュ簾寮冿級
+     * 2024-06-30鍙栨秷搴熷純锛屾仮澶嶄娇鐢�
      * @param cardAddr
      * @return
      */
@@ -141,7 +142,7 @@
     List<VoCards> getUnreplaced(Map<?, ?> params);
 
     /**
-     * 鏍规嵁鎸囧畾姘村崱缂栧彿鑾峰彇鎸傚け浜嬭褰曟暟閲忥紙琛ュ崱銆佽В閿佷娇鐢級
+     * 鏍规嵁鎸囧畾姘村崱缂栧彿鑾峰彇鎸傚け璁板綍鏁伴噺锛堣ˉ鍗°�佽В閿佷娇鐢級
      * @param cardNum
      * @return
      */
@@ -191,7 +192,7 @@
     Double getTotalMoneyIcCards();
 
     /**
-     * 鏍规嵁姘村崱鍦板潃鑾峰彇姘村崱鏁伴噺锛岀敤鏉ュ垽鏂鍗℃槸鍚﹀厑璁稿紑鍗�
+     * 鏍规嵁姘村崱鍦板潃鑾峰彇姘村崱鏁伴噺锛岀敤鏉ュ垽鏂鍗℃槸鍚﹀厑璁稿紑鍗★紝鏃犳晥鍗$墖鎺掗櫎鍦ㄥ
      * @param cardAddr
      * @return
      */
@@ -234,4 +235,20 @@
      * @return
      */
     Float getTotalConsumption(@Param("timeStart")String timeStart, @Param("timeStop")String timeStop);
+
+    /**
+     * 渚濇嵁姘村崱鍦板潃灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鎸囧畾鎿嶄綔璁板綍鏀逛负鏈夋晥
+     * @param cardAddr
+     * @param operateType
+     * @return
+     */
+    Integer turnCardValidByAddr(@Param("cardAddr")String cardAddr, @Param("operateType")Integer operateType);
+
+    /**
+     * 鏍规嵁姘村崱ID鑾峰彇鍘熸按鍗D锛岃ˉ鍗¢�氱煡涓娇鐢�
+     * @param cardId
+     * @return
+     */
+    Long getOriginalCardIdByCardId(@Param("cardId") Long cardId);
+
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java
index f365c2d..e80a3c8 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeHistoryMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @author ZhuBaoMin
@@ -24,4 +25,11 @@
     int updateByPrimaryKeySelective(SeRechargeHistory record);
 
     int updateByPrimaryKey(SeRechargeHistory record);
+
+    /**
+     * 渚濇嵁姘村崱ID灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鍏呭�煎巻鍙茶褰曟敼涓烘湁鏁�
+     * @param cardId
+     * @return
+     */
+    Integer turnRechargeHistoryValidByCardId(@Param("cardId") Long cardId);
 }
\ 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 d35244d..3224b00 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
@@ -142,4 +142,10 @@
      */
     @Schema(description = "鎿嶄綔鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
     private Date operateDt;
+
+    /**
+     * 鎿嶄綔鏄惁鏈夋晥
+     */
+    @Length(message = "鎿嶄綔鏈夋晥鎬т笉澶т簬{max}锛屼笉灏忎簬{min}", min = 1, max = 2)
+    private Byte operateValid;
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java
index 92c9f2b..8ca10b8 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeRechargeHistory.java
@@ -125,4 +125,10 @@
     @Schema(description = "鎿嶄綔鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
     private Date operatedt;
 
+    /**
+     * 鎿嶄綔鏄惁鏈夋晥
+     */
+    @Length(message = "鎿嶄綔鏈夋晥鎬т笉澶т簬{max}锛屼笉灏忎簬{min}", min = 1, max = 2)
+    private Byte operateValid;
+
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java
index 28dd560..9fc3c3c 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTransactionStatistics.java
@@ -1,39 +1,54 @@
 package com.dy.pipIrrGlobal.voSe;
 
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
 import com.dy.common.po.BaseEntity;
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 /**
  * @author ZhuBaoMin
  * @date 2024-01-22 18:27
  * @LastEditTime 2024-01-22 18:27
- * @Description
+ * @Description 浜ゆ槗璁板綍姹囨�昏鍥惧璞�
  */
 
 @Data
-@Schema(title = "浜ゆ槗璁板綍姹囨�昏鍥惧璞�")
 public class VoTransactionStatistics implements BaseEntity {
     private static final long serialVersionUID = 202401241705001L;
 
-    @Schema(title = "涓氬姟绫诲瀷")
+    /**
+     * 涓氬姟绫诲瀷
+     */
     private String operateType;
 
-    @Schema(title = "浜ゆ槗鏃ユ湡")
+    /**
+     * 浜ゆ槗鏃ユ湡
+     */
     private String tradeDate;
 
-    @Schema(title = "浜ゆ槗绗旀暟")
+    /**
+     * 浜ゆ槗绗旀暟
+     */
     private Integer count;
 
-    @Schema(title = "瀹炴敹閲戦")
+    /**
+     * 瀹炴敹閲戦
+     */
     private Float received;
 
-    @Schema(title = "璧犻�侀噾棰�")
+    /**
+     * 璧犻�侀噾棰�
+     */
     private Float gift;
 
-    @Schema(title = "杩旇繕閲戦")
+    /**
+     * 杩旇繕閲戦
+     */
     private Float refundAmount;
 
-    @Schema(title = "鏀堕摱鍛業D")
-    private String cashierId;
+    /**
+     * 鏀堕摱鍛業D
+     */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    private Long cashierId;
 }
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml b/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
index 55fe57e..4dc85a0 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
@@ -27,6 +27,7 @@
             <settings>
                 <item1 item_name="lng" item_value="101.89878161146011" remarks="缁忓害"/>
                 <item2 item_name="lat" item_value="25.673963608371185" remarks="绾害"/>
+                <item3 item_name="projectName" item_value="绠$亴绯荤粺鍙婇珮鏁堟櫤鎱у井鐏屼簯鏈嶅姟绠$悊骞冲彴杞欢绯荤粺" remarks="椤圭洰鍚嶇О"/>
             </settings>
             <waterTypes>
                 <item1 typeName="鐏屾簤鐢ㄦ按"/>
@@ -73,6 +74,7 @@
             <settings>
                 <item1 item_name="lng" item_value="101.87345" remarks="缁忓害"/>
                 <item2 item_name="lat" item_value="25.70424" remarks="绾害"/>
+                <item3 item_name="projectName" item_value="绠$亴绯荤粺鍙婇珮鏁堟櫤鎱у井鐏屼簯鏈嶅姟绠$悊骞冲彴杞欢绯荤粺" remarks="椤圭洰鍚嶇О"/>
             </settings>
             <waterTypes>
                 <item1 typeName="鐏屾簤鐢ㄦ按"/>
@@ -119,6 +121,7 @@
             <settings>
                 <item1 item_name="lng" item_value="101.87345" remarks="缁忓害"/>
                 <item2 item_name="lat" item_value="25.70424" remarks="绾害"/>
+                <item3 item_name="projectName" item_value="绠$亴绯荤粺鍙婇珮鏁堟櫤鎱у井鐏屼簯鏈嶅姟绠$悊骞冲彴杞欢绯荤粺" remarks="椤圭洰鍚嶇О"/>
             </settings>
             <waterTypes>
                 <item1 typeName="鐏屾簤鐢ㄦ按"/>
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 f03c554..6ddb1e5 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -20,11 +20,12 @@
     <result column="remarks" jdbcType="VARCHAR" property="remarks" />
     <result column="operator" jdbcType="BIGINT" property="operator" />
     <result column="operate_dt" jdbcType="TIMESTAMP" property="operateDt" />
+    <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
+    refund_amount, no_trade_amount, operate_type, payment_id, remarks, `operator`, operate_dt, operate_valid
   </sql>
   <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -45,13 +46,13 @@
       price, card_cost, gift, 
       refund_amount, no_trade_amount, operate_type, 
       payment_id, remarks, `operator`, 
-      operate_dt)
+      operate_dt, 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})
+      #{operateDt,jdbcType=TIMESTAMP}, #{operateValid,jdbcType=TINYINT})
   </insert>
   <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
     <!--@mbg.generated-->
@@ -105,6 +106,9 @@
       <if test="operateDt != null">
         operate_dt,
       </if>
+      <if test="operateValid != null">
+        operate_valid,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="id != null">
@@ -154,6 +158,9 @@
       </if>
       <if test="operateDt != null">
         #{operateDt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="operateValid != null">
+        #{operateValid,jdbcType=TINYINT},
       </if>
     </trim>
   </insert>
@@ -206,6 +213,9 @@
       <if test="operateDt != null">
         operate_dt = #{operateDt,jdbcType=TIMESTAMP},
       </if>
+      <if test="operateValid != null">
+        operate_valid = #{operateValid,jdbcType=TINYINT},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -226,7 +236,8 @@
       payment_id = #{paymentId,jdbcType=BIGINT},
       remarks = #{remarks,jdbcType=VARCHAR},
       `operator` = #{operator,jdbcType=BIGINT},
-      operate_dt = #{operateDt,jdbcType=TIMESTAMP}
+      operate_dt = #{operateDt,jdbcType=TIMESTAMP},
+      operate_valid = #{operateValid,jdbcType=TINYINT}
     where id = #{id,jdbcType=BIGINT}
   </update>
 
@@ -235,12 +246,13 @@
     select
         COUNT(*) AS recordCount
     FROM se_card_operate ope
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER JOIN se_client cli ON ope.client_id = cli.id
-    INNER 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)
+      AND ope.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -291,13 +303,14 @@
       END) AS operateType,
       ope.operate_dt
     FROM se_card_operate ope
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER JOIN se_client cli ON ope.client_id = cli.id
-    LEFT JOIN ba_district dis ON dis.id = cli.villageId
-    INNER 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)
+      AND ope.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -329,7 +342,7 @@
         INNER JOIN ba_user us ON ope.operator = us.id
     <where>
       AND ope.operate_type IN(1,2,3,5)
-
+      AND ope.operate_valid = 2
       <if test = "villageId != null and villageId > 0">
         AND cli.villageId = #{villageId}
       </if>
@@ -364,7 +377,6 @@
         IFNULL(ope.card_cost,0.00) AS cardCost,
         IFNULL(ope.gift,0.00) AS gift,
         IFNULL(ope.refund_amount,0.00) AS refundAmount,
-        <!--ope.money,-->
         (IFNULL(ope.money, 0) + IFNULL(ope.trade_amount, 0) + IFNULL(ope.gift, 0)) AS money,
         pay.name AS paymentName,
         ope.operate_dt as tradeTime,
@@ -384,7 +396,7 @@
         LEFT JOIN ba_user us ON ope.operator = us.id
     <where>
       AND ope.operate_type IN(1,2,3,5)
-
+      AND ope.operate_valid = 2
       <if test = "villageId != null and villageId > 0">
         AND cli.villageId = #{villageId}
       </if>
@@ -408,12 +420,14 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇寮�鍗¤褰曟暟閲�-->
   <select id="getActiveCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-    COUNT(*) AS recordCount
+        COUNT(*) AS recordCount
     FROM se_card_operate ope
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER 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
+        LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
     <where>
       AND ope.operate_type = 1
+      AND ope.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -450,11 +464,12 @@
         (SELECT `name` FROM ba_user WHERE id =  ope.operator) AS operator,
         ope.operate_dt AS operateDt
     FROM se_card_operate ope
-        INNER JOIN se_client_card card ON ope.card_id = card.id
-        INNER JOIN se_client cli ON ope.client_id = cli.id
-        INNER 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
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -482,12 +497,13 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍鏁伴噺-->
   <select id="getReissueCardRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     select
-    COUNT(*) AS recordCount
+        COUNT(*) AS recordCount
     FROM se_card_operate ope
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER 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
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -505,19 +521,20 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍-->
   <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
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER 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
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -543,10 +560,11 @@
     select
         COUNT(*) AS recordCount
     FROM se_card_operate ope
-        INNER JOIN se_client cli ON ope.client_id = cli.id
-        INNER JOIN se_client_card card ON ope.card_id = card.id
-        INNER 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">
         AND ope.operate_type = #{operateType}
       </if>
@@ -580,10 +598,11 @@
         card.money,
         IFNULL(ope.system_balance,0) AS systemBalance
     FROM se_card_operate ope
-        INNER JOIN se_client cli ON ope.client_id = cli.id
-        INNER JOIN se_client_card card ON ope.card_id = card.id
-        INNER 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">
         AND ope.operate_type = #{operateType}
       </if>
@@ -611,16 +630,17 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鍒楄〃鏁�-->
   <select id="getReceiptsRecordCount" parameterType="java.util.Map" resultType="java.lang.Long">
     SELECT
-    COUNT(*) AS recordCount
+        COUNT(*) AS recordCount
     FROM se_card_operate ope
-    INNER JOIN se_client cli ON ope.client_id = cli.id
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER JOIN se_payment_method pay ON ope.payment_id = pay.id
-    INNER JOIN ba_user us ON ope.operator = us.id
-    INNER JOIN ba_district vil ON cli.villageId = vil.id
-    INNER 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
       <if test = "operateId != null and operateId > 0">
         AND ope.id = #{operateId}
       </if>
@@ -668,14 +688,15 @@
         ope.operator AS cashierId,
         NOW() AS currentTime
     FROM se_card_operate ope
-    INNER JOIN se_client cli ON ope.client_id = cli.id
-    INNER JOIN se_client_card card ON ope.card_id = card.id
-    INNER JOIN se_payment_method pay ON ope.payment_id = pay.id
-    INNER JOIN ba_user us ON ope.operator = us.id
-    INNER JOIN ba_district vil ON cli.villageId = vil.id
-    INNER 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
       <if test = "operateId != null and operateId > 0">
         AND ope.id = #{operateId}
       </if>
@@ -707,16 +728,17 @@
   <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鏀惰垂閲戦鍚堣-->
   <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
       <if test = "operateId != null and operateId > 0">
         AND ope.id = #{operateId}
       </if>
@@ -734,9 +756,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}
@@ -751,7 +773,7 @@
     FROM
     `se_card_operate`
     WHERE
-    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 1
+    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 1 AND operate_valid = 2
   </select>
   <!--鎸囧畾鏃堕棿娈靛唴鎸傚け鎬绘暟閲忥紙鐗╃悊鍗★級-->
   <select id="getLossCountIcCardsCount" resultType="java.lang.Long">
@@ -760,7 +782,7 @@
     FROM
     `se_card_operate`
     WHERE
-    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 6
+    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 6 AND operate_valid = 2
   </select>
   <!--鎸囧畾鏃堕棿娈靛唴鍏呭�兼�绘暟閲忥紙鐗╃悊鍗★級-->
   <select id="getRechargeCountIcCardsCount" resultType="java.lang.Long">
@@ -769,7 +791,7 @@
     FROM
     `se_card_operate`
     WHERE
-    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 2
+    operate_dt BETWEEN #{timeStart} AND #{timeStop} AND operate_type = 2 AND operate_valid = 2
   </select>
   <!--鎸囧畾鏃堕棿娈靛唴寮�鐗╃悊鍗″啘鎴锋暟閲�-->
   <select id="getOpenIcCardClientsCount" resultType="java.lang.Long">
@@ -789,7 +811,7 @@
     `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
+    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>
   <!--鎸囧畾鏃堕棿娈靛唴寮�鐗╃悊鍗″啘鎴�-->
@@ -806,7 +828,7 @@
       `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
+      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 " >
@@ -833,7 +855,7 @@
     `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
+    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) c
   </select>
   <!--鎸囧畾鏃堕棿娈靛唴姣忎釜鍐滄埛鍏呭�煎悎璁�-->
@@ -850,7 +872,7 @@
       `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
+      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 " >
@@ -877,7 +899,7 @@
     `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
+    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) > #{value}) c
   </select>
@@ -895,7 +917,7 @@
       `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
+      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
@@ -910,11 +932,12 @@
   <select id="getRechargesCountNew" 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_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
-        INNER JOIN ba_user us ON us.id = rch.operator
+        LEFT JOIN ba_user us ON us.id = rch.operator
     <where>
+      AND rch.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -942,11 +965,12 @@
         us.name AS operator,
         rch.operateDt AS operateTime
     FROM se_client_card card
-        INNER JOIN se_client cli ON cli.id = card.clientId
+        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
-        INNER JOIN ba_user us ON us.id = rch.operator
+        LEFT JOIN ba_user us ON us.id = rch.operator
     <where>
+      AND rch.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -976,6 +1000,7 @@
         INNER JOIN ba_user us ON us.id = ope.operator
     <where>
       AND ope.operate_type = 5
+      AND ope.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -1006,6 +1031,7 @@
         INNER JOIN ba_user us ON us.id = ope.operator
     <where>
       AND ope.operate_type = 5
+      AND ope.operate_valid = 2
       <if test = "clientName != null and clientName !=''">
         AND cli.name like CONCAT('%',#{clientName},'%')
       </if>
@@ -1025,4 +1051,25 @@
       </if>
     </trim>
   </select>
+
+
+  <!--鏍规嵁姘村崱ID銆佹搷浣滅被鍨嬭幏鍙栬幏鍙栨渶鍚庝竴鏉¤褰曪紝鍒ゆ柇寮�鍗℃槸鍚﹀悓姝ュ厖鍊间娇鐢�-->
+  <update id="turnOperateValidByCardId">
+    UPDATE se_card_operate
+        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
+    );
+  </update>
+
+  <!--鏍规嵁鎿嶄綔绫诲瀷銆佹按鍗D鑾峰彇鑾峰彇鏈�鍚庝竴鏉¤褰�-->
+  <select id="getCardOperate" resultType="com.dy.pipIrrGlobal.pojoSe.SeCardOperate">
+    SELECT * FROM se_card_operate
+    WHERE operate_type = #{operateType} AND card_id = #{cardId} ORDER BY operate_dt DESC LIMIT 1
+  </select>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
index 8935aee..1b18b3c 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -61,10 +61,13 @@
     </delete>
 
     <!--渚濇嵁姘村崱鍦板潃鑾峰彇姘村崱缂栧彿锛�12鏈�19鏃ュ簾寮冿級-->
+    <!--2024-06-30鍙栨秷搴熷純锛屾仮澶嶄娇鐢�-->
     <select id="getCardIdByAddr" resultType="java.lang.Long">
         SELECT id AS cardId
         FROM se_client_card
         WHERE cardAddr = #{cardAddr}
+        ORDER BY id DESC
+        LIMIT 1
     </select>
 
     <!--鏍规嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿紙12鏈�19鏃ユ坊鍔犲悗搴熷純锛�-->
@@ -356,7 +359,7 @@
                          END)     AS state
               FROM se_client_card card
                        INNER JOIN se_client cli ON cli.id = card.clientId
-              WHERE card.clientId = #{clientId,jdbcType=BIGINT}
+              WHERE state != 4 AND card.clientId = #{clientId,jdbcType=BIGINT}
               UNION ALL
               SELECT '铏氭嫙鍗�'     AS cardType,
                      vc.vc_num AS cardNum,
@@ -368,25 +371,43 @@
               FROM se_virtual_card vc
                        INNER JOIN se_client cli ON cli.id = vc.client_id
               WHERE vc.client_id = #{clientId,jdbcType=BIGINT}
-        <!--              SELECT '铏氭嫙鍗�'              AS cardType,-->
-        <!--                     virtualCard.vc_num AS CardNum,-->
-        <!--                     virtualCard.money  AS vcMoney,-->
-        <!--                     (CASE-->
-        <!--                          WHEN virtualCard.in_use = 0 THEN '鏈娇鐢�'-->
-        <!--                          WHEN virtualCard.in_use = 1 THEN '浣跨敤涓�'-->
-        <!--                         END)           AS State-->
-        <!--              FROM se_client client-->
-        <!--                       LEFT JOIN se_virtual_card virtualCard ON client.id = virtualCard.client_id-->
-        <!--              WHERE client.id = #{clientId,jdbcType=BIGINT}-->
         ) card
         ORDER BY card.Money DESC, card.State DESC
     </select>
 
     <!--鏍规嵁姘村崱缂栧彿鑾峰彇鎿嶄綔璁板綍鍒楄〃-->
     <select id="getOperateRecordsByCardNum" resultType="java.util.HashMap">
-        SELECT *
-        FROM v_operate
-        WHERE cardNum = #{cardNum,jdbcType=BIGINT}
+        SELECT
+            ope.id AS orderNumber,
+            cli.villageId,
+            cli.districtTitle,
+            cli.clientNum,
+            cli.`name`,
+            card.cardNum,
+            cli.idCard,
+            cli.phone,
+            IFNULL(ope.money,0) AS money,
+            IFNULL(ope.gift,0) AS gift,
+            IFNULL(ope.card_cost,0) AS cardCost,
+            IFNULL((ope.money + ope.trade_amount + ope.gift),0) AS afterRecharge,
+            ope.payment_id AS paymentId,
+            pay.name AS paymentMethod,
+            CASE
+            WHEN ope.operate_type = 1 THEN '寮�鍗�'
+            WHEN ope.operate_type = 2 THEN '鍏呭��'
+            WHEN ope.operate_type = 3 THEN '閿�鍗�'
+            END AS operateType,
+            ope.operate_dt AS operateDt,
+            user.name AS operatorName
+        FROM se_card_operate ope
+            LEFT JOIN se_client cli ON cli.id = ope.client_id
+            LEFT JOIN se_client_card card ON card.id = ope.card_id
+            LEFT JOIN se_payment_method pay ON pay.id = ope.payment_id
+            LEFT JOIN ba_user user ON user.id = ope.operator
+        WHERE ope.operate_valid = 2 AND ope.operate_type in (1,2,3) AND cardNum = #{cardNum,jdbcType=BIGINT}
+<!--        SELECT *-->
+<!--        FROM v_operate-->
+<!--        WHERE cardNum = #{cardNum,jdbcType=BIGINT}-->
     </select>
 
     <!--鏍规嵁姘村崱缂栧彿鑾峰彇浣欓-->
@@ -423,6 +444,7 @@
                     WHEN state = 1 THEN '姝e父'
                     WHEN state = 2 THEN '宸叉敞閿�'
                     WHEN state = 3 THEN '宸叉寕澶�'
+                    WHEN state = 4 THEN '鏃犳晥鍗$墖'
             END) AS stateName
         FROM se_client_card
         WHERE cardNum = #{cardNum,jdbcType=BIGINT}
@@ -432,7 +454,7 @@
     <select id="getCardsCount" parameterType="java.util.Map" resultType="java.lang.Long">
         SELECT COUNT(*) AS recordCount
         FROM se_client_card card
-                 INNER JOIN se_client cli ON card.clientId = cli.id
+            INNER JOIN se_client cli ON card.clientId = cli.id
         <where>
             AND card.state = 1
             <if test="clientNum != null and clientNum != ''">
@@ -452,25 +474,16 @@
     <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇姘村崱鍒楄〃锛屽簲鐢ㄧ▼搴忎娇鐢�-->
     <select id="getCards" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
         SELECT cli.clientNum,
-               cli.name AS clientName,
-               cardNum,
-        <!--        CASE-->
-        <!--            WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
-        <!--            ELSE card.cardNum-->
-        <!--        END AS cardNum,-->
-        cli.phone,
-        cli.idCard,
-        card.state AS cardState,
-        <!--        (CASE-->
-        <!--            WHEN card.state = 1 THEN '姝e父'-->
-        <!--            WHEN card.state = 2 THEN '宸叉敞閿�'-->
-        <!--            WHEN card.state = 3 THEN '宸叉寕澶�'-->
-        <!--        End) AS stateName,-->
-        '姝e父'                  AS stateName,
-        '鍐滄埛鍗�'                 AS cardType,
-        FORMAT(card.money, 2) AS money
+            cli.name AS clientName,
+            cardNum,
+            cli.phone,
+            cli.idCard,
+            card.state AS cardState,
+            '姝e父' AS stateName,
+            '鍐滄埛鍗�' AS cardType,
+            FORMAT(card.money, 2) AS money
         FROM se_client_card card
-                 INNER JOIN se_client cli ON card.clientId = cli.id
+            INNER JOIN se_client cli ON card.clientId = cli.id
         <where>
             AND card.state = 1
             <if test="clientNum != null and clientNum != ''">
@@ -504,23 +517,20 @@
 
     <!--鑾峰彇宸叉寕澶辨湭琛ュ崱鐨勮褰�-->
     <select id="getUnreplaced" resultType="com.dy.pipIrrGlobal.voSe.VoCards">
-        SELECT cli.clientNum,
-               cli.name AS clientName,
-               cardNum,
-        <!--        CASE-->
-        <!--          WHEN card.cardNum LIKE '10%' THEN CONCAT(SUBSTRING(card.cardNum, 7, 6),SUBSTRING(card.cardNum, 14, 4))-->
-        <!--          ELSE card.cardNum-->
-        <!--        END AS cardNum,-->
-        cli.phone,
-        cli.idCard,
-        card.state            AS cardState,
-        '宸叉寕澶�'                 AS stateName,
-        '鍐滄埛鍗�'                 AS cardType,
-        FORMAT(card.money, 2) AS money
+        SELECT
+            cli.clientNum,
+            cli.name AS clientName,
+            cardNum,
+            cli.phone,
+            cli.idCard,
+            card.state AS cardState,
+            '宸叉寕澶�' AS stateName,
+            '鍐滄埛鍗�' AS cardType,
+            FORMAT(card.money, 2) AS money
         FROM se_client_card card
-                 INNER JOIN se_client cli ON card.clientId = cli.id
+            INNER JOIN se_client cli ON card.clientId = cli.id
         WHERE card.state = 3
-          AND NOT EXISTS(SELECT * FROM se_client_card card2 WHERE card2.original_card_id = card.id)
+            AND NOT EXISTS(SELECT * FROM se_client_card card2 WHERE card2.original_card_id = card.id)
         ORDER BY card.id
         <trim prefix="limit ">
             <if test="start != null and count != null">
@@ -529,7 +539,7 @@
         </trim>
     </select>
 
-    <!--鏍规嵁鎸囧畾姘村崱缂栧彿鑾峰彇鎸傚け浜嬭褰曟暟閲忥紙琛ュ崱銆佽В閿佷娇鐢級-->
+    <!--鏍规嵁鎸囧畾姘村崱缂栧彿鑾峰彇鎸傚け璁板綍鏁伴噺锛堣ˉ鍗°�佽В閿佷娇鐢級-->
     <select id="getLostCount" resultType="java.lang.Integer">
         SELECT COUNT(*) AS recordCount
         FROM se_client_card card
@@ -556,7 +566,7 @@
     <select id="getCardsByClientNameAndPhoneCount" resultType="java.lang.Long">
         SELECT COUNT(*) AS recordCount
         FROM se_client_card card
-                 INNER JOIN se_client cli ON card.clientId = cli.id
+            INNER JOIN se_client cli ON card.clientId = cli.id
         <where>
             card.state = 1
             <if test="clientName != null and clientName != ''">
@@ -586,7 +596,7 @@
                '鍐滄埛鍗�'                 AS cardType,
                FORMAT(card.money, 2) AS money
         FROM se_client_card card
-                 INNER JOIN se_client cli ON card.clientId = cli.id
+            LEFT JOIN se_client cli ON card.clientId = cli.id
         <where>
             card.state = 1
             <if test="clientName != null and clientName != ''">
@@ -636,11 +646,11 @@
         WHERE state = 1
     </select>
 
-    <!--鏍规嵁姘村崱鍦板潃鑾峰彇姘村崱鏁伴噺-->
+    <!--鏍规嵁姘村崱鍦板潃鑾峰彇姘村崱鏁伴噺锛屾棤鏁堝崱鐗囨帓闄ゅ湪澶�-->
     <select id="getCountByCardAddr" resultType="java.lang.Long">
         SELECT COUNT(*) AS recordCount
         FROM se_client_card
-        WHERE cardAddr = #{cardAddr}
+        WHERE cardAddr = #{cardAddr} AND se_client_card.state != 4
     </select>
 
     <!--鏍规嵁姘村崱鍦板潃鑾峰彇鎸囧畾鐘舵�佺殑姘村崱鏁伴噺-->
@@ -722,4 +732,23 @@
         FROM rm_open_close_valve_history
         WHERE cl_dt BETWEEN #{timeStart} AND #{timeStop}
     </select>
+
+    <!--渚濇嵁姘村崱鍦板潃灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鎸囧畾鎿嶄綔璁板綍鏀逛负鏈夋晥-->
+    <update id="turnCardValidByAddr">
+        UPDATE se_client_card
+        SET state = 1
+        WHERE id = (
+            SELECT id FROM (
+                SELECT id
+                FROM se_client_card
+                WHERE state = 4 AND cardAddr = #{cardAddr} AND lastOper  = #{operateType}
+                ORDER BY id DESC
+                LIMIT 1) AS subquery
+        );
+    </update>
+
+    <!--鏍规嵁姘村崱ID鑾峰彇鍘熸按鍗D锛岃ˉ鍗¢�氱煡涓娇鐢�-->
+    <select id="getOriginalCardIdByCardId" resultType="java.lang.Long">
+        SELECT original_card_id AS originalCardId FROM se_client_card WHERE id = #{cardId};
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml
index aac929f..8fbf4cd 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeGeneralMapper.xml
@@ -253,6 +253,7 @@
     SUM(ope.trade_amount) AS tradeAmount
     FROM se_card_operate ope
     <where>
+      AND ope.operate_valid = 2
       <if test = "tradeDate != null and tradeDate !=''">
         AND Date(ope.operate_dt) = #{tradeDate}
       </if>
@@ -265,7 +266,7 @@
         AND ope.operator = #{cashierId}
       </if>
     </where>
-    GROUP BY ope.payment_id,  Date(ope.operate_dt)
+<!--    GROUP BY ope.payment_id,  Date(ope.operate_dt)-->
   </select>
 
   <!--  璐㈠姟瀵硅处瀹℃牳椤碉紝鏀堕摱鍛�+鏃ユ湡鍒嗙粍锛屾帓闄や氦鏄撶被鍨嬪垎缁勶紝璁板綍鏁�-->
@@ -286,17 +287,46 @@
 
   <!--寮�鍗$郴缁熶氦鏄撶粺璁★紝鏀堕摱鍛�+鏃ユ湡+绫诲瀷鍒嗙粍-->
   <select id="getSummaries" resultType="com.dy.pipIrrGlobal.voSe.VoTransactionStatistics">
-    SELECT * FROM v_trade_summary
+    SELECT
+        CASE
+            WHEN ope.operate_type = 1 THEN '寮�鍗�'
+            WHEN ope.operate_type = 2 THEN '鍏呭��'
+            WHEN ope.operate_type = 3 THEN '閿�鍗�'
+            WHEN ope.operate_type = 4 THEN '琛ュ崱'
+            WHEN ope.operate_type = 5 THEN '杩旇繕'
+        END AS operateType,
+        Date(ope.operate_dt) AS tradeDate,
+        COUNT(*) AS count,
+        (IFNULL(SUM(ope.trade_amount), 0) + IFNULL(SUM(ope.card_cost), 0)) AS received,
+        IFNULL(SUM(ope.gift), 0) AS gift,
+        IFNULL(sum(ope.refund_amount),0) AS refundAmount,
+        us.id AS cashierId
+    FROM se_card_operate ope
+        INNER JOIN ba_user us ON us.id = ope.operator
     <where>
+      AND ope.operate_type IN(1,2,3,4,5)
       <if test = "cashierId != null and cashierId > 0">
-        AND cashierId = #{cashierId}
+        AND us.id = #{cashierId}
       </if>
 
       <if test = "timeStart != null and timeStop != null">
-        AND Date(tradeDate) BETWEEN #{timeStart} AND #{timeStop}
+        AND Date(ope.operate_dt) BETWEEN #{timeStart} AND #{timeStop}
       </if>
     </where>
+    GROUP BY ope.operate_type,  Date(ope.operate_dt), us.id
     ORDER BY tradeDate
+
+<!--    SELECT * FROM v_trade_summary-->
+<!--    <where>-->
+<!--      <if test = "cashierId != null and cashierId > 0">-->
+<!--        AND cashierId = #{cashierId}-->
+<!--      </if>-->
+
+<!--      <if test = "timeStart != null and timeStop != null">-->
+<!--        AND Date(tradeDate) BETWEEN #{timeStart} AND #{timeStop}-->
+<!--      </if>-->
+<!--    </where>-->
+<!--    ORDER BY tradeDate-->
   </select>
 
   <!--  鏍规嵁鏀堕摱鍛業D鍙婃棩鏈熻幏鍙栬储鍔″璐浜ゆ槗鏄庣粏璁板綍鏁�-->
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml
index 45d08e3..91457c0 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeHistoryMapper.xml
@@ -177,4 +177,18 @@
       operateDt = #{operatedt,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+  <!--渚濇嵁姘村崱ID灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鍏呭�煎巻鍙茶褰曟敼涓烘湁鏁�-->
+  <update id="turnRechargeHistoryValidByCardId">
+    UPDATE se_recharge_history
+        SET operate_valid = 2
+    WHERE id = (
+        SELECT id FROM (
+            SELECT id
+            FROM se_recharge_history
+            WHERE operate_valid = 1 AND cardId = #{cardId}
+            ORDER BY id DESC
+        LIMIT 1) AS subquery
+    );
+  </update>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java
index 0556ce3..cdd3d2d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateCtrl.java
@@ -48,7 +48,7 @@
 @Slf4j
 @Tag(name = "姘村崱鎿嶄綔绠$悊", description = "姘村崱鍚勭鎿嶄綔")
 @RestController
-@RequestMapping(path="card")
+@RequestMapping(path = "card")
 @RequiredArgsConstructor
 public class CardOperateCtrl {
     private final CardOperateSv cardOperateSv;
@@ -59,30 +59,31 @@
 
     @Value("${project.projectNo}")
     private Integer projectNo;
+
     /**
      * 寮�鍗�
-     * @param po 寮�鍗′紶鍏ュ璞�
+     *
+     * @param po            寮�鍗′紶鍏ュ璞�
      * @param bindingResult
      * @return 姘村崱缂栧彿
      */
     @PostMapping(path = "active", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_active(@RequestBody @Valid ActiveCard po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_active(@RequestBody @Valid ActiveCard po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
         // 渚濇嵁姘村崱鍦板潃鍒ゆ柇璇ュ崱鏄惁鍙互寮�鍗★紝鏈紑杩囧崱鎴栦笉鏄甯哥姸鎬併�佹寕澶辩姸鎬佺殑鍙紑鍗�
-        if(!cardOperateSv.canActiveCard(po.getCardAddr())) {
+        if (!cardOperateSv.canActiveCard(po.getCardAddr())) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_CARD_ESIST.getMessage());
         }
 
         Long clientId = po.getClientId();
-
         // 鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode
         Long areaCodeL = cardOperateSv.getAreaCodeById(clientId);
-        if(areaCodeL == null) {
+        if (areaCodeL == null) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.AREA_CODE_MISTAKE.getMessage());
         }
         String areaCode = String.valueOf(areaCodeL);
@@ -94,10 +95,10 @@
          * cardNum涓烘柊鐨勫崱鍙�
          */
         String cardNum = Optional.ofNullable(cardOperateSv.getCardNumOfMax(areaCode)).orElse("");
-        if(cardNum != null && cardNum.trim().length() > 0) {
+        if (cardNum != null && cardNum.trim().length() > 0) {
             Integer number = Integer.parseInt(cardNum.substring(12));
             number = number + 1;
-            if(number > 65535) {
+            if (number > 65535) {
                 return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_OVERRUN.getMessage());
             }
             cardNum = cardNum.substring(0, 12) + String.format("%05d", number);
@@ -135,21 +136,20 @@
         seClientCard.setCardnum(cardNum);
         seClientCard.setClientid(clientId);
         seClientCard.setMoney(amount);
-        seClientCard.setState(CardStateENUM.NORMAL.getCode());
-        if(originalCardId != null) {
+        // 寮�鍗℃椂鍗$墖鐘舵�佷负鏃犳晥
+        seClientCard.setState(CardStateENUM.INVALID.getCode());
+        if (originalCardId != null) {
+            // 琛ュ崱
             seClientCard.setOriginalCardId(originalCardId);
+            seClientCard.setLastoper(LastOperateENUM.REPLACE.getCode());
+            seClientCard.setReplacedt(activeTime);
+        } else {
+            // 寮�鏂板崱
+            seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
+            seClientCard.setCreatedt(activeTime);
         }
-        seClientCard.setCreatedt(activeTime);
-        //if(cardCost == 0) {
-        //    // 鎹㈠崱
-        //    seClientCard.setLastoper(LastOperateENUM.CHANGE_CARD.getCode());
-        //}else {
-        //    // 寮�鍗�
-        //    seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
-        //}
-        seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode());
-        Long cardId = Optional.ofNullable(clientCardSv.add(seClientCard)).orElse(0L) ;
-        if(cardId == 0) {
+        Long cardId = Optional.ofNullable(clientCardSv.add(seClientCard)).orElse(0L);
+        if (cardId == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
         }
 
@@ -162,23 +162,20 @@
         seCardOperate.setMoney(0f);
         seCardOperate.setCardCost(cardCost);
         seCardOperate.setPaymentId(paymentId);
-        if(originalCardId != null) {
+        if (originalCardId != null) {
             // 琛ュ崱
             seCardOperate.setOperateType(OperateTypeENUM.REISSUE.getCode());
-        }else {
-            // 寮�鏂板崱鎴栨崲鍗�
-            //if(cardCost > 0) {
-            //    seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
-            //}else {
-            //    seCardOperate.setOperateType(OperateTypeENUM.CHANGE_CARD.getCode());
-            //}
+            seCardOperate.setNoTradeAmount(amount);
+        } else {
+            // 寮�鏂板崱
             seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode());
         }
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(activeTime);
+        seCardOperate.setOperateValid((byte) 1);
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_WRITE_ACTIVE_CARD_ERROR.getMessage());
         }
 
@@ -186,7 +183,7 @@
          * 濡傛灉鎿嶄綔浜哄憳寮�鍗℃椂杈撳叆浜嗗厖鍊奸噾棰濓紝鍒欏紑鍗″悗璋冪敤鍏呭�煎姛鑳�
          * 琛ュ崱闄ゅ锛岃ˉ鍗$殑閫�杩橀噾棰濇槸浠庢寕澶卞崱涓浆绉昏繃鏉ョ殑锛屾病鏈夊疄闄呴噾閽变氦鏄�
          */
-        if(amount != null && amount > 0 && originalCardId == null) {
+        if (amount != null && amount > 0 && originalCardId == null) {
             DtoRecharge dtoRecharge = new DtoRecharge();
             dtoRecharge.setCardNum(Long.parseLong(cardNum));
             dtoRecharge.setAmount(amount);
@@ -197,21 +194,21 @@
             dtoRecharge.setGift(0f);
             dtoRecharge.setPrice(0f);
             BaseResponse<Boolean> job = cardOperateSv.addRecharge(dtoRecharge);
-            if(!job.getCode().equals("0001")) {
+            if (!job.getCode().equals("0001")) {
                 return BaseResponseUtils.buildErrorMsg(SellResultCode.ACTIVE_FAIL_RECHARGE_EXCEPTION.getMessage());
             }
         }
 
         Map map = new HashMap();
-//        map.put("projectNo", String.format("%02x", Integer.parseInt(cardOperateSv.getProjectNo())));
         map.put("projectNo", String.format("%02x", projectNo));
         map.put("orderNumber", rec);
         map.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map) ;
+        return BaseResponseUtils.buildSuccess(map);
     }
 
     /**
      * 琛ュ崱
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -219,8 +216,8 @@
     @PostMapping(path = "reissue", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_reissue(@RequestBody @Valid DtoReissue po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_reissue(@RequestBody @Valid DtoReissue po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -250,14 +247,14 @@
         Long operator = po.getOperator();
 
         // 鍒ゆ柇褰撳墠姘村崱鏄惁涓烘寕澶辩姸鎬佷笖鏈ˉ鍗★紝浠呭凡缁忔寕澶变笖鏈ˉ鍗$殑鍙互琛ュ崱
-        if(!cardOperateSv.isLostAndUnreplaced(cardNum)) {
+        if (!cardOperateSv.isLostAndUnreplaced(cardNum)) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
         // 濡傛灉浼犲叆浜嗛��杩橀噾棰濓紝闇�瑕佸垽鏂�佸崱锛堣鎸傚け鐨勬按鍗★級鎸傚け鏃舵槸鍚﹀凡缁忛��娆撅紝鏃犺閫�娆惧灏戦兘鎻愮ず鐢ㄦ埛鎸傚け鏃跺凡閫�娆�
-        if(reissueAmount != null && reissueAmount > 0) {
+        if (reissueAmount != null && reissueAmount > 0) {
             Double tradeAmount = cardOperateSv.getTradeAmountByCardNo(cardNum);
-            if(tradeAmount != null && tradeAmount > 0) {
+            if (tradeAmount != null && tradeAmount > 0) {
                 return BaseResponseUtils.buildErrorMsg(SellResultCode.THE_FEE_CANNOT_BE_REFUNDED.getMessage());
             }
         }
@@ -266,7 +263,7 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         clientNum = map.get("clientNum").toString();
@@ -276,13 +273,14 @@
 
         /**
          * 濡傛灉鏄ˉ鍗¤皟鐢ㄧ殑寮�鍗′笖杞Щ浜嗛��杩橀噾棰濓紝闇�淇敼鎸傚け鍗′綑棰濅负0
+         * 閫氱煡琛ュ崱鎴愬姛鏃跺啀澶勭悊
+         if(reissueAmount != null) {
+         SeClientCard seClientCard = new SeClientCard();
+         seClientCard.setId(cardId);
+         seClientCard.setMoney(0f);
+         cardOperateSv.updateClientCard(seClientCard);
+         }
          */
-        if(reissueAmount != null) {
-            SeClientCard seClientCard = new SeClientCard();
-            seClientCard.setId(cardId);
-            seClientCard.setMoney(0f);
-            cardOperateSv.updateClientCard(seClientCard);
-        }
 
         /**
          * 娣诲姞寮�鍗¤褰曪紝閫�杩橀噾棰濆啿鍒版柊鍗′腑
@@ -299,11 +297,11 @@
         activeCard.setOperator(operator);
         BaseResponse<java.lang.Boolean> baseResponse_addActive = add_active(activeCard, null);
 
-        if(!baseResponse_addActive.getCode().equals("0001")) {
+        if (!baseResponse_addActive.getCode().equals("0001")) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.REPLACE_FAIL_WRITE_RECHARGE_ERROR.getMessage());
         }
 
-        JSONObject job_content = (JSONObject) JSON.toJSON( baseResponse_addActive.getContent());
+        JSONObject job_content = (JSONObject) JSON.toJSON(baseResponse_addActive.getContent());
         cardNum = job_content.getLong("cardNum");
         String orderNumber = job_content.getString("orderNumber");
         String projectNo = job_content.getString("projectNo");
@@ -313,20 +311,21 @@
         map_response.put("orderNumber", orderNumber);
         map_response.put("cardNum", cardNum);
         map_response.put("protocol", protocol);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
     }
 
     /**
      * 鍏呭��
-     * @param po 鍏呭�间紶杈撳璞�
+     *
+     * @param po            鍏呭�间紶杈撳璞�
      * @param bindingResult
      * @return
      */
     @PostMapping(path = "recharge", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_recharge(@RequestBody @Valid DtoRecharge po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_recharge(@RequestBody @Valid DtoRecharge po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
         return cardOperateSv.addRecharge(po);
@@ -334,6 +333,7 @@
 
     /**
      * 閿�鍗�
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -341,8 +341,8 @@
     @PostMapping(path = "cancel", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_cancel(@RequestBody @Valid DtoCancel po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_cancel(@RequestBody @Valid DtoCancel po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -360,14 +360,14 @@
         Long clientId = 0L;
         Long cardNum = po.getCardNum();
         Float refund = po.getRefund();
-        Byte refundType = po.getRefundType();
+        Long refundType = po.getRefundType();
         String remarks = po.getRemarks();
         Long operator = po.getOperator();
         Date cancelTime = new Date();
 
         // 楠岃瘉姘村崱鐘舵�佹槸鍚︽敮鎸佸綋鍓嶆搷浣�
         String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
-        if(stateName.length() == 0 || !stateName.equals("姝e父")) {
+        if (stateName.length() == 0 || !stateName.equals("姝e父")) {
             return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -375,27 +375,28 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
         clientId = Long.parseLong(map.get("clientId").toString());
 
         /**
-         * 淇敼鍐滄埛鍗′俊鎭細
+         * 淇敼鍐滄埛鍗′俊鎭紝閫氱煡鏃跺啀澶勭悊
          *      娉ㄩ攢鏃堕棿
          *      鏈�鍚庢搷浣滅被鍨�-4
+
+         SeClientCard seClientCard = new SeClientCard();
+         seClientCard.setId(cardId);
+         seClientCard.setCanceldt(cancelTime);
+         seClientCard.setMoney(0f);
+         seClientCard.setState(CardStateENUM.CANCELLED.getCode());
+         seClientCard.setLastoper(LastOperateENUM.CANCEL.getCode());
+         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
+         if(rec_updateClientCard == 0) {
+         return BaseResponseUtils.buildErrorMsg(SellResultCode.CANCEL_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
+         }
          */
-        SeClientCard seClientCard = new SeClientCard();
-        seClientCard.setId(cardId);
-        seClientCard.setCanceldt(cancelTime);
-        seClientCard.setMoney(0f);
-        seClientCard.setState(CardStateENUM.CANCELLED.getCode());
-        seClientCard.setLastoper(LastOperateENUM.CANCEL.getCode());
-        Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
-            return BaseResponseUtils.buildErrorMsg(SellResultCode.CANCEL_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
-        }
 
         /**
          * 娣诲姞娉ㄩ攢鎿嶄綔璁板綍
@@ -405,14 +406,15 @@
         seCardOperate.setCardId(cardId);
         seCardOperate.setClientId(clientId);
         seCardOperate.setTradeAmount(-refund);
-        seCardOperate.setPaymentId(1L);
+        seCardOperate.setPaymentId(refundType);
         seCardOperate.setOperateType(OperateTypeENUM.CANCEL.getCode());
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(cancelTime);
+        seCardOperate.setOperateValid((byte) 1);
 
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CANCEL_FAIL_WRITE_CANCELL_ERROR.getMessage());
         }
 
@@ -420,11 +422,12 @@
         map_response.put("projectNo", String.format("%02x", projectNo));
         map_response.put("orderNumber", rec);
         map_response.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
     }
 
     /**
-     * 鎸傚け
+     * 鎸傚け锛屼笉闇�瑕佷簩娆¢�氱煡
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -432,8 +435,8 @@
     @PostMapping(path = "loss", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_loss(@RequestBody @Valid DtoLoss po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_loss(@RequestBody @Valid DtoLoss po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -458,7 +461,7 @@
 
         // 楠岃瘉姘村崱鐘舵�佹槸鍚︽敮鎸佸綋鍓嶆搷浣�
         String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
-        if(stateName.length() == 0 || !stateName.equals("姝e父")) {
+        if (stateName.length() == 0 || !stateName.equals("姝e父")) {
             return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -466,7 +469,7 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
@@ -479,6 +482,7 @@
          *  鐘舵��
          *  鏈�鍚庢搷浣滅被鍨�-6
          */
+
         SeClientCard seClientCard = new SeClientCard();
         seClientCard.setId(cardId);
         seClientCard.setMoney(money);
@@ -486,9 +490,10 @@
         seClientCard.setState(CardStateENUM.LOSS.getCode());
         seClientCard.setLastoper(LastOperateENUM.LOSS.getCode());
         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
+        if (rec_updateClientCard == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.LOSS_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
         }
+
 
         /**
          * 娣诲姞鎸傚け璁板綍
@@ -504,8 +509,9 @@
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(lossTime);
+        seCardOperate.setOperateValid((byte) 2);
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.LOSS_FAIL_WRITE_LOSS_ERROR.getMessage());
         }
 
@@ -513,11 +519,12 @@
         map_response.put("projectNo", String.format("%02x", projectNo));
         map_response.put("orderNumber", rec);
         map_response.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
     }
 
     /**
-     * 鍐叉
+     * 鍐叉锛�2024-09-30 浣滃簾锛屽啿姝e姛鑳界敱鍏呭�煎姛鑳戒唬鏇�
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -525,8 +532,8 @@
     @PostMapping(path = "reversal", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_reversal(@RequestBody @Valid DtoReversal po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_reversal(@RequestBody @Valid DtoReversal po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -551,7 +558,7 @@
 
         // 楠岃瘉姘村崱鐘舵�佹槸鍚︽敮鎸佸綋鍓嶆搷浣�
         String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
-        if(stateName.length() == 0 || !stateName.equals("姝e父")) {
+        if (stateName.length() == 0 || !stateName.equals("姝e父")) {
             return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -559,7 +566,7 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
@@ -567,8 +574,8 @@
 
         /**
          * 淇敼鍐滄埛鍗′俊鎭細
-         *      鎸傚け鏃堕棿
-         *      鏈�鍚庢搷浣滅被鍨�-4
+         *      鍐叉鏃堕棿
+         *      鏈�鍚庢搷浣滅被鍨�-7
          */
         SeClientCard seClientCard = new SeClientCard();
         seClientCard.setId(cardId);
@@ -576,7 +583,7 @@
         seClientCard.setMoney(cardBalance);
         seClientCard.setLastoper(LastOperateENUM.REVERSAL.getCode());
         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
+        if (rec_updateClientCard == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
         }
 
@@ -592,8 +599,9 @@
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(reversalTime);
+        seCardOperate.setOperateValid((byte) 2);
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.REVERSAL_FAIL_WRITE_REVERSAL_ERROR.getMessage());
         }
 
@@ -601,12 +609,13 @@
         map_response.put("projectNo", String.format("%02x", projectNo));
         map_response.put("orderNumber", rec);
         map_response.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
 
     }
 
     /**
      * 琛ユ墸
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -614,8 +623,8 @@
     @PostMapping(path = "refund", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_refund(@RequestBody @Valid DtoRefund po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_refund(@RequestBody @Valid DtoRefund po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -640,7 +649,7 @@
 
         // 楠岃瘉姘村崱鐘舵�佹槸鍚︽敮鎸佸綋鍓嶆搷浣�
         String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
-        if(stateName.length() == 0 || !stateName.equals("姝e父")) {
+        if (stateName.length() == 0 || !stateName.equals("姝e父")) {
             return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -648,26 +657,27 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
         clientId = Long.parseLong(map.get("clientId").toString());
 
         /**
-         * 淇敼鍐滄埛鍗′俊鎭細
-         *      鎸傚け鏃堕棿
-         *      鏈�鍚庢搷浣滅被鍨�-4
+         * 淇敼鍐滄埛鍗′俊鎭紝閫氱煡鏃跺鐞�
+         *      琛ユ墸鏃堕棿
+         *      鏈�鍚庢搷浣滅被鍨�-5
+
+         SeClientCard seClientCard = new SeClientCard();
+         seClientCard.setId(cardId);
+         seClientCard.setRefunddt(refundTime);
+         seClientCard.setMoney(money + refund);
+         seClientCard.setLastoper(LastOperateENUM.REFUND.getCode());
+         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
+         if(rec_updateClientCard == 0) {
+         return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
+         }
          */
-        SeClientCard seClientCard = new SeClientCard();
-        seClientCard.setId(cardId);
-        seClientCard.setRefunddt(refundTime);
-        seClientCard.setMoney(money + refund);
-        seClientCard.setLastoper(LastOperateENUM.REFUND.getCode());
-        Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
-            return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
-        }
 
         /**
          * 娣诲姞琛ユ墸鎿嶄綔璁板綍
@@ -681,16 +691,18 @@
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(refundTime);
+        seCardOperate.setOperateValid((byte) 1);
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.REFUND_FAIL_WRITE_REFUND_ERROR.getMessage());
         }
 
-        return BaseResponseUtils.buildSuccess(true) ;
+        return BaseResponseUtils.buildSuccess(true);
     }
 
     /**
-     * 瑙i攣
+     * 瑙i攣锛屼笉闇�瑕佷簩娆¢�氱煡
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -698,8 +710,8 @@
     @PostMapping(path = "unlock", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add_unlock(@RequestBody @Valid DtoUnlock po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> add_unlock(@RequestBody @Valid DtoUnlock po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -721,7 +733,7 @@
         Date unlockTime = new Date();
 
         // 鍒ゆ柇褰撳墠姘村崱鏄惁涓烘寕澶辩姸鎬佷笖鏈ˉ鍗★紝浠呭凡缁忔寕澶卞叾鏈ˉ鍗$殑鍙互瑙i攣
-        if(!cardOperateSv.isLostAndUnreplaced(cardNum)) {
+        if (!cardOperateSv.isLostAndUnreplaced(cardNum)) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -729,7 +741,7 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
@@ -747,7 +759,7 @@
         seClientCard.setState(CardStateENUM.NORMAL.getCode());
         seClientCard.setLastoper(LastOperateENUM.UNLOCK.getCode());
         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
+        if (rec_updateClientCard == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.UNLOCK_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
         }
 
@@ -762,8 +774,9 @@
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(unlockTime);
+        seCardOperate.setOperateValid((byte) 2);
         Long rec = Optional.ofNullable(cardOperateSv.add(seCardOperate)).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.UNLOCK_FAIL_WRITE_UNLOCK_ERROR.getMessage());
         }
 
@@ -771,12 +784,110 @@
         map_response.put("projectNo", String.format("%02x", projectNo));
         map_response.put("orderNumber", rec);
         map_response.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
+    }
 
+    /**
+     * 鎿嶄綔鎵ц鍥炶皟
+     *
+     * @param po
+     * @param bindingResult
+     * @return
+     */
+    @PostMapping(path = "call_back", consumes = MediaType.APPLICATION_JSON_VALUE)
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<Boolean> callBack(@RequestBody @Valid CallBack po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
+            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+
+        String cardAddr = po.getCardAddr();
+        Integer operateType = po.getOperateType();
+
+        // 姝ゆ椂鏃犻渶鍒ゆ柇鍗$墖鐘舵��
+        Long cardId = cardOperateSv.getCardIdByAddr(cardAddr);
+        if (cardId == null || cardId.equals(0)) {
+            return BaseResponseUtils.buildErrorMsg("鎮ㄦ寚瀹氱殑姘村崱涓嶅瓨鍦�");
+        }
+
+        if (operateType == 1) {
+            /**
+             * 寮�鍗℃搷浣滄墽琛岄�氱煡
+             *  1.渚濇嵁姘村崱鍦板潃灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鎸囧畾鎿嶄綔璁板綍鏀逛负鏈夋晥
+             *  2.渚濇嵁姘村崱ID灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑姘村崱璁板綍鏀逛负鏈夋晥
+             *  3.濡傛灉寮�鍗″悓姝ュ厖鍊�
+             *      淇敼鍏呭�兼搷浣滆褰曚负鏈夋晥
+             *      淇敼鍏呭�煎巻鍙茶褰曚负鏈夋晥
+             *      淇敼姘村崱琛ㄧ殑鎿嶄綔淇℃伅
+             */
+            Integer rec_card = Optional.ofNullable(cardOperateSv.turnCardValidByAddr(cardAddr, operateType)).orElse(0);
+            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
+            if (rec_card == 0 || rec_ope == 0) {
+                return BaseResponseUtils.buildErrorMsg("涓嶅瓨鍦ㄦ湭鐢熸晥鐨勬按鍗�");
+            }
+
+            Boolean isMergeRecharge = cardOperateSv.isMergeRecharge(cardId);
+            if (isMergeRecharge) {
+                cardOperateSv.turnOperateValidByCardId(cardId, 2);
+                cardOperateSv.turnRechargeHistoryValidByCardId(cardId);
+                cardOperateSv.updateCard(cardId);
+            }
+
+        } else if (operateType == 2) {
+            /**
+             * 鍏呭�兼搷浣滄墽琛岄�氱煡
+             *  1.鎿嶄綔璁板綍鏀逛负鏈夋晥-cardId
+             *  2.鍏呭�煎巻鍙茶褰曟敼涓烘湁鏁�-cardId
+             *  3.浼戞按鍗¤〃鐨勬搷浣滀俊鎭強浣欓-cardId銆侊紙mondy銆乤mount銆乬ift浠庡厖鍊煎巻鍙茶〃涓幏鍙栵級
+             */
+
+            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
+            Integer rec_recharge = cardOperateSv.turnRechargeHistoryValidByCardId(cardId);
+            if (rec_recharge == 0 || rec_ope == 0) {
+                return BaseResponseUtils.buildErrorMsg("涓嶅瓨鍦ㄦ湭鐢熸晥鐨勬按鍗�");
+            }
+            cardOperateSv.updateCard(cardId);
+
+        } else if (operateType == 3) {
+            /**
+             * 閿�鍗℃搷浣滄墽琛岄�氱煡
+             *  1.鎿嶄綔璁板綍鏀逛负鏈夋晥-cardId
+             *  2.淇敼姘村崱琛ㄧ殑璁板綍鍙婁綑棰濓紙0锛�
+             */
+            cardOperateSv.turnOperateValidByCardId(cardId, operateType);
+            cardOperateSv.updateCancels(operateType, cardId);
+        } else if (operateType == 4) {
+            /**
+             * 琛ュ崱鎿嶄綔鎵ц閫氱煡
+             *  1.鏂版按鍗¤褰曟敼涓烘湁鏁�-cardId
+             *  2.寮�鍗℃搷浣滆褰曟敼涓烘湁鏁�-cardId
+             *  3.濡傛灉瀛樺湪閫�杩橀噾棰�
+             *      娓呯┖鍘熷崱浣欓
+             */
+            Integer rec_card = Optional.ofNullable(cardOperateSv.turnCardValidByAddr(cardAddr, operateType)).orElse(0);
+            Integer rec_ope = Optional.ofNullable(cardOperateSv.turnOperateValidByCardId(cardId, operateType)).orElse(0);
+            if (rec_card == 0 || rec_ope == 0) {
+                return BaseResponseUtils.buildErrorMsg("涓嶅瓨鍦ㄦ湭鐢熸晥鐨勬按鍗�");
+            }
+            cardOperateSv.emptyCardBalance(operateType, cardId);
+
+        } else if (operateType == 5) {
+            /**
+             * 琛ユ墸鎿嶄綔鎵ц閫氱煡
+             *  1.鎿嶄綔璁板綍鏀逛负鏈夋晥
+             *  2.淇敼姘村崱琛ㄧ殑鎿嶄綔淇℃伅鍙婁綑棰�-浠庢搷浣滆褰曚腑鍙杕oney銆乺efund
+             */
+            cardOperateSv.turnOperateValidByCardId(cardId, operateType);
+            cardOperateSv.updateRefund(operateType, cardId);
+        }
+
+        return BaseResponseUtils.buildSuccess();
     }
 
     /**
      * 鍒涘缓绠$悊鍗�
+     *
      * @param po
      * @param bindingResult
      * @return
@@ -784,8 +895,8 @@
     @PostMapping(path = "create_manager_card", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> createManagerCard(@RequestBody @Valid ManagerCard po, BindingResult bindingResult){
-        if(bindingResult != null && bindingResult.hasErrors()){
+    public BaseResponse<Boolean> createManagerCard(@RequestBody @Valid ManagerCard po, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
             return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
 
@@ -796,10 +907,10 @@
          * cardNum涓烘柊鐨勫崱鍙�
          */
         String cardNum = Optional.ofNullable(cardOperateSv.getManagerCardNumOfMax(divisionCode)).orElse("");
-        if(cardNum != null && cardNum.trim().length() > 0) {
+        if (cardNum != null && cardNum.trim().length() > 0) {
             Integer number = Integer.parseInt(cardNum.substring(12));
             number = number + 1;
-            if(number > 65535) {
+            if (number > 65535) {
                 return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_OVERRUN.getMessage());
             }
             cardNum = cardNum.substring(0, 12) + String.format("%05d", number);
@@ -814,7 +925,7 @@
         seManagerCard.setCreateTime(new Date());
         seManagerCard.setRemarks(po.getRemarks());
         Long managerCardId = cardOperateSv.addManagerCard(seManagerCard);
-        if(managerCardId == 0) {
+        if (managerCardId == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CREATE_MANAGER_CARD_ERROR.getMessage());
         }
 
@@ -828,6 +939,7 @@
 
     /**
      * 鑾峰彇鍏呭�艰褰�
+     *
      * @param vo
      * @return
      */
@@ -842,85 +954,90 @@
     })
     @GetMapping(path = "/getRecharges")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoRecharge>>> get(QoRecharge vo){
+    public BaseResponse<QueryResultVo<List<VoRecharge>>> get(QoRecharge vo) {
         try {
             QueryResultVo<List<VoRecharge>> res = cardOperateSv.getRecharges(vo);
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇鍏呭�艰褰曞紓甯�", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鑾峰彇鍏呭�艰褰曪紝绠$悊骞冲彴鍏呭�煎垪琛ㄤ娇鐢紝APP鏈娇鐢�
+     *
      * @param vo
      * @return
      */
     @GetMapping(path = "/getRechargesNew")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoRechargeNew>>> getRechargesNew(QoRecharge vo){
+    public BaseResponse<QueryResultVo<List<VoRechargeNew>>> getRechargesNew(QoRecharge vo) {
         try {
             QueryResultVo<List<VoRechargeNew>> res = cardOperateSv.getRechargesNew(vo);
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇鍏呭�艰褰曞紓甯�", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鑾峰彇杩旇繕璁板綍锛岀鐞嗗钩鍙板厖鍊煎垪琛ㄤ娇鐢�
+     *
      * @param vo
      * @return
      */
     @GetMapping(path = "/refunds")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoRefund>>> getRefunds(QoRecharge vo){
+    public BaseResponse<QueryResultVo<List<VoRefund>>> getRefunds(QoRecharge vo) {
         try {
             QueryResultVo<List<VoRefund>> res = cardOperateSv.getRefunds(vo);
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇杩旇繕璁板綍寮傚父", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鑾峰彇姘村崱娑堣垂璁板綍锛岀鐞嗗钩鍙颁娇鐢�
+     *
      * @param vo
      * @return
      */
     @GetMapping(path = "/expends")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoExpend>>> getExpends(QoRecharge vo){
+    public BaseResponse<QueryResultVo<List<VoExpend>>> getExpends(QoRecharge vo) {
         try {
             QueryResultVo<List<VoExpend>> res = cardOperateSv.getExpends(vo);
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇娑堣垂璁板綍寮傚父", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇浜ゆ槗鏄庣粏
+     *
      * @param vo
      * @return
      */
     @GetMapping(path = "getTransactions")
     @SsoAop()
-    public BaseResponse<Map> getOperates(QoTransaction vo){
+    public BaseResponse<Map> getOperates(QoTransaction vo) {
         try {
             return BaseResponseUtils.buildSuccess(cardOperateSv.getTransactions(vo));
         } catch (Exception e) {
             log.error("鏌ヨ浜ゆ槗璁板綍寮傚父", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇寮�鍗¤褰�
+     *
      * @param vo
      * @return
      */
@@ -935,7 +1052,7 @@
     })
     @GetMapping(path = "/getActiveCards")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoActiveCard>>> getActiveCards(QoActiveCard vo){
+    public BaseResponse<QueryResultVo<List<VoActiveCard>>> getActiveCards(QoActiveCard vo) {
         try {
             QueryResultVo<List<VoActiveCard>> res = cardOperateSv.getActiveCards(vo);
 //            if(res.itemTotal == 0) {
@@ -944,12 +1061,13 @@
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇寮�鍗¤褰曞紓甯�", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍
+     *
      * @param vo
      * @return
      */
@@ -964,7 +1082,7 @@
     })
     @GetMapping(path = "/getReissueCards")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoReissueCard>>> getReissueCards(QoReissueCard vo){
+    public BaseResponse<QueryResultVo<List<VoReissueCard>>> getReissueCards(QoReissueCard vo) {
         try {
             QueryResultVo<List<VoReissueCard>> res = cardOperateSv.getReissueCards(vo);
 //            if(res.itemTotal == 0) {
@@ -973,7 +1091,7 @@
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇琛ュ崱璁板綍寮傚父", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
@@ -981,6 +1099,7 @@
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇閫氱敤鎿嶄綔璁板綍
      * 娉ㄩ攢銆佹寕澶便�佸啿姝c�佽В閿侀�氱敤
      * 娉ㄩ攢-3锛屾寕澶�-6锛屽啿姝�-7锛岃В閿�-8
+     *
      * @param vo
      * @return
      */
@@ -995,10 +1114,10 @@
     })
     @GetMapping(path = "/getOptions")
     @SsoAop()
-    public BaseResponse<QueryResultVo<List<VoOperate>>> getCommonOperations(QoCommonOperate vo){
+    public BaseResponse<QueryResultVo<List<VoOperate>>> getCommonOperations(QoCommonOperate vo) {
         // 楠岃瘉鎿嶄綔绫诲瀷鏄惁姝g‘
         Integer operateType = Optional.ofNullable(vo.getOperateType()).orElse(0);
-        if(operateType != 3 && operateType != 6 && operateType != 7 && operateType != 8) {
+        if (operateType != 3 && operateType != 6 && operateType != 7 && operateType != 8) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.PARAMS_ERROR.getMessage());
         }
 
@@ -1010,12 +1129,13 @@
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
             log.error("鑾峰彇寮�鍗¤褰曞紓甯�", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鍒楄〃
+     *
      * @param vo
      * @return
      */
@@ -1030,21 +1150,18 @@
     })
     @GetMapping(path = "/get_receipts")
     @SsoAop()
-    public BaseResponse<Map> getReceipts(QoReceipt vo){
+    public BaseResponse<Map> getReceipts(QoReceipt vo) {
         try {
-        //    Map res = Optional.ofNullable(cardOperateSv.getReceipts(vo)).orElse(new HashMap());
-        //    if(res.size() == 0) {
-        //        return BaseResponseUtils.buildErrorMsg(SellResultCode.No_RECEIPTS.getMessage());
-        //    }
             return BaseResponseUtils.buildSuccess(cardOperateSv.getReceipts(vo));
         } catch (Exception e) {
             log.error("鑾峰彇鐢靛瓙閽卞寘璐︽埛璁板綍", e);
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
     }
 
     /**
      * 閲戦杞ぇ鍐�
+     *
      * @param amount
      * @return
      */
@@ -1054,9 +1171,9 @@
         try {
             AmountToChinese amountToChinese = new AmountToChinese();
             String chinese = amountToChinese.toChinese(amount);
-            return BaseResponseUtils.buildSuccess(chinese) ;
+            return BaseResponseUtils.buildSuccess(chinese);
         } catch (Exception e) {
-            return BaseResponseUtils.buildException(e.getMessage()) ;
+            return BaseResponseUtils.buildException(e.getMessage());
         }
 
     }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java
index 283c37e..7f438a3 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/CardOperateSv.java
@@ -9,12 +9,16 @@
 import com.dy.pipIrrGlobal.daoBa.BaSettingsMapper;
 import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveHistoryMapper;
 import com.dy.pipIrrGlobal.daoSe.*;
-import com.dy.pipIrrGlobal.pojoSe.*;
+import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
+import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
+import com.dy.pipIrrGlobal.pojoSe.SeManagerCard;
+import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
 import com.dy.pipIrrGlobal.voRm.VoExpend;
 import com.dy.pipIrrGlobal.voSe.*;
 import com.dy.pipIrrSell.cardOperate.dto.DtoRecharge;
 import com.dy.pipIrrSell.cardOperate.enums.OperateTypeENUM;
 import com.dy.pipIrrSell.cardOperate.qo.*;
+import com.dy.pipIrrSell.clientCard.CardStateENUM;
 import com.dy.pipIrrSell.clientCard.ClientCardSv;
 import com.dy.pipIrrSell.clientCard.LastOperateENUM;
 import com.dy.pipIrrSell.result.SellResultCode;
@@ -25,6 +29,7 @@
 import org.springframework.stereotype.Service;
 
 import java.text.DecimalFormat;
+import java.time.Duration;
 import java.util.*;
 
 /**
@@ -72,6 +77,7 @@
 
     /**
      * 娣诲姞寮�鍗¤褰�
+     *
      * @param po 姘村崱鎿嶄綔瀵硅薄
      * @return 寮�鍗¤褰曚富閿�
      */
@@ -82,6 +88,7 @@
 
     /**
      * 鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍唬鐮侊紝寮�鍗′娇鐢�
+     *
      * @param clientNum 鍐滄埛缂栧彿
      * @return 5绾ц鏀垮尯鍒掍唬鐮�
      */
@@ -95,6 +102,7 @@
 
     /**
      * 鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode锛岃ˉ鍗¤繃绋嬩腑寮�鏂板崱浣跨敤
+     *
      * @param clientId
      * @return
      */
@@ -104,6 +112,7 @@
 
     /**
      * 鏍规嵁琛屾斂鍖哄垝涓叉ā鍧楁煡璇㈡按鍗$紪鍙凤紝寮�鍗′娇鐢�
+     *
      * @param areaCode
      * @return
      */
@@ -113,6 +122,7 @@
 
     /**
      * 鏍规嵁琛屾斂鍖哄垝涓叉ā绯婃煡璇㈢鐞嗗崱缂栧彿锛屽垱寤虹鐞嗗崱浣跨敤
+     *
      * @param areaCode
      * @return
      */
@@ -122,6 +132,7 @@
 
     /**
      * 鍒涘缓绠$悊鍗�
+     *
      * @param po
      * @return
      */
@@ -132,6 +143,7 @@
 
     /**
      * 鏍规嵁鍐滄埛缂栧彿鑾峰彇鍐滄埛ID锛屽紑鍗′娇鐢�
+     *
      * @param clientNum
      * @return
      */
@@ -141,6 +153,7 @@
 
     /**
      * 娣诲姞姘村崱鎿嶄綔瀵硅薄锛屽悇鎿嶄綔閮戒娇鐢�
+     *
      * @param po 姘村崱鎿嶄綔瀵硅薄
      * @return 鎿嶄綔璁板綍涓婚敭
      */
@@ -152,10 +165,11 @@
     /**
      * 娣诲姞鍏呭�艰褰�
      * 淇敼鍐滄埛淇℃伅銆佹坊鍔犳按鍗℃搷浣滆褰曘�佹坊鍔犲厖鍊艰褰�
+     *
      * @param po
      * @return
      */
-    public BaseResponse<Boolean> addRecharge(DtoRecharge po){
+    public BaseResponse<Boolean> addRecharge(DtoRecharge po) {
         /**
          * cardId           姘村崱缂栧彿锛堜緷鎹按鍗$紪鍙疯幏鍙栵級
          * clientId         鍐滄埛缂栧彿锛堜緷鎹按鍗$紪鍙疯幏鍙栵級
@@ -183,9 +197,16 @@
         Long operator = po.getOperator();
         Date rechargeTime = new Date();
 
-        // 楠岃瘉姘村崱鐘舵�佹槸鍚︽敮鎸佸綋鍓嶆搷浣�
+        // 鑾峰彇姘村崱鐘舵��
         String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(cardNum)).orElse("");
-        if(stateName.length() == 0 || !stateName.equals("姝e父")) {
+
+        // 鍗曠嫭鍏呭�兼椂鍗$墖蹇呴』涓烘甯�
+        if (remarks.trim().equals("鍏呭��") && !stateName.equals("姝e父")) {
+            return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
+        }
+
+        // 寮�鍗″悓姝ュ厖鍊兼椂鍏佽鍗$墖涓烘棤鏁堢姸鎬侊紝寰楀埌閫氱煡鍚庤嚜鍔ㄥ彉鏇翠负鏈夋晥
+        if (!remarks.trim().equals("鍏呭��") && !stateName.equals("姝e父") && !stateName.equals("鏃犳晥鍗$墖")) {
             return BaseResponseUtils.buildErrorMsg(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
         }
 
@@ -193,36 +214,24 @@
          * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
          */
         Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
-        if(map == null || map.size() <= 0) {
+        if (map == null || map.size() <= 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
         }
         cardId = Long.parseLong(map.get("cardId").toString());
         clientId = Long.parseLong(map.get("clientId").toString());
 
         /**
-         * 淇敼鍐滄埛鍗′俊鎭細
-         *      琛ュ崱鏃堕棿
-         *      鏈�鍚庢搷浣滅被鍨�-2
+         * 鍏呭�兼椂涓嶄慨鏀瑰啘鎴峰崱淇℃伅锛屾敹鍒版垚鍔熼�氱煡鍚庡啀淇敼锛氫綑棰濄�佸厖鍊兼椂闂淬�佹渶鍚庢搷浣滅被鍨�
+         SeClientCard seClientCard = new SeClientCard();
+         seClientCard.setId(cardId);
+         seClientCard.setMoney(afterRecharge);
+         seClientCard.setRechargedt(rechargeTime);
+         seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
+         Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
+         if(rec_updateClientCard == 0) {
+         return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
+         }
          */
-
-        // 鏍规嵁鏀粯鏂瑰紡ID鑾峰彇鏀粯鏂瑰紡鍚嶇О
-        SePaymentMethod sePaymentMethod = sePaymentMethodMapper.selectByPrimaryKey(paymentId);
-        String paymentName = sePaymentMethod.getName();
-
-        SeClientCard seClientCard = new SeClientCard();
-        seClientCard.setId(cardId);
-        seClientCard.setMoney(afterRecharge);
-        seClientCard.setRechargedt(rechargeTime);
-        //if(paymentName != null && paymentName.equals("鎹㈠崱")) {
-        //    seClientCard.setLastoper(LastOperateENUM.CHANGE_RECHARGE.getCode ());
-        //}else {
-        //    seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
-        //}
-        seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
-        Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
-        if(rec_updateClientCard == 0) {
-            return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
-        }
 
         /**
          * 娣诲姞姘村崱鍏呭�兼搷浣滆褰�
@@ -233,21 +242,16 @@
         seCardOperate.setMoney(money);
         seCardOperate.setTradeAmount(amount);
         seCardOperate.setGift(gift);
-        //if(paymentName != null && paymentName.equals("鎹㈠崱")) {
-        //    seCardOperate.setOperateType(OperateTypeENUM.CHANGE_RECHARGE.getCode());
-        //}else {
-        //    seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
-        //}
         seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
         seCardOperate.setPaymentId(paymentId);
         seCardOperate.setPrice(price);
         seCardOperate.setRemarks(remarks);
         seCardOperate.setOperator(operator);
         seCardOperate.setOperateDt(rechargeTime);
-
+        seCardOperate.setOperateValid((byte) 1);
         seCardOperateMapper.insert(seCardOperate);
         Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
-        if(rec == 0) {
+        if (rec == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_RECHARGE_ERROR.getMessage());
         }
 
@@ -266,9 +270,10 @@
         seRechargeHistory.setRemarks(remarks);
         seRechargeHistory.setOperator(operator);
         seRechargeHistory.setOperatedt(rechargeTime);
+        seRechargeHistory.setOperateValid((byte) 1);
         seRechargeHistoryMapper.insert(seRechargeHistory);
         Long rec_seRechargeHistory = Optional.ofNullable(seRechargeHistory.getId()).orElse(0L);
-        if(rec_seRechargeHistory == 0) {
+        if (rec_seRechargeHistory == 0) {
             return BaseResponseUtils.buildErrorMsg(SellResultCode.RECHARGE_FAIL_WRITE_RECHARGE_HISTORY_ERROR.getMessage());
         }
 
@@ -276,11 +281,12 @@
         map_response.put("projectNo", String.format("%02x", projectNo));
         map_response.put("orderNumber", rec);
         map_response.put("cardNum", cardNum);
-        return BaseResponseUtils.buildSuccess(map_response) ;
+        return BaseResponseUtils.buildSuccess(map_response);
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鍏呭�艰褰�
+     *
      * @param queryVo
      * @return
      */
@@ -301,17 +307,18 @@
 
         Long itemTotal = seCardOperateMapper.getRecordCount(params);
 
-        QueryResultVo<List<VoRecharge>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        QueryResultVo<List<VoRecharge>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getRecharges(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鑾峰彇鍏呭�艰褰曪紝绠$悊骞冲彴鍏呭�煎垪琛ㄤ娇鐢紝APP鏈娇鐢�
+     *
      * @param queryVo
      * @return
      */
@@ -320,17 +327,18 @@
 
         Long itemTotal = seCardOperateMapper.getRechargesCountNew(params);
 
-        QueryResultVo<List<VoRechargeNew>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        QueryResultVo<List<VoRechargeNew>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getRechargesNew(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鑾峰彇杩旇繕璁板綍锛岀鐞嗗钩鍙板厖鍊煎垪琛ㄤ娇鐢�
+     *
      * @param queryVo
      * @return
      */
@@ -339,17 +347,18 @@
 
         Long itemTotal = seCardOperateMapper.getRefundsCount(params);
 
-        QueryResultVo<List<VoRefund>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        QueryResultVo<List<VoRefund>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getRefunds(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鑾峰彇姘村崱娑堣垂璁板綍锛岀鐞嗗钩鍙颁娇鐢�
+     *
      * @param queryVo
      * @return
      */
@@ -358,48 +367,49 @@
 
         Long itemTotal = rmOpenCloseValveHistoryMapper.getExpendsCount(params);
 
-        QueryResultVo<List<VoExpend>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        QueryResultVo<List<VoExpend>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = rmOpenCloseValveHistoryMapper.getExpends(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇浜ゆ槗璁板綍
+     *
      * @param vo
      * @return
      */
-    public Map getTransactions(QoTransaction vo){
+    public Map getTransactions(QoTransaction vo) {
         DecimalFormat df = new DecimalFormat("0.00");
         // 琛ラ綈鏌ヨ鏃堕棿
         String operateTimeStart = vo.operateTimeStart;
         String operateTimeStop = vo.operateTimeStop;
-        if(operateTimeStart != null) {
+        if (operateTimeStart != null) {
             operateTimeStart = operateTimeStart + " 00:00:00";
             vo.setOperateTimeStart(operateTimeStart);
         }
-        if(operateTimeStop != null) {
+        if (operateTimeStop != null) {
             operateTimeStop = operateTimeStop + " 23:59:59";
             vo.setOperateTimeStop(operateTimeStop);
         }
 
         // 鐢熸垚鏌ヨ鍙傛暟
-        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo) ;
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
 
         // 鑾峰彇绗﹀悎鏉′欢鐨勮褰曟暟
         Long itemTotal = Optional.ofNullable(seCardOperateMapper.getTransactionRecordCount(params)).orElse(0L);
 
-        QueryResultVo<List<VoTradeDetails>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = vo.pageSize ;
-        rsVo.pageCurr = vo.pageCurr ;
+        QueryResultVo<List<VoTradeDetails>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = vo.pageSize;
+        rsVo.pageCurr = vo.pageCurr;
         rsVo.calculateAndSet(itemTotal, params);
 
         rsVo.obj = seCardOperateMapper.getTransactions(params);
         List<VoTradeDetails> list = rsVo.obj;
-        if(list.size() == 0) {
+        if (list.size() == 0) {
             return new HashMap();
         }
 
@@ -409,8 +419,8 @@
         Double totalGift = 0.0;
         Double totalRefund = 0.0;
 
-        JSONArray array= JSONArray.parseArray(JSON.toJSONString(list));
-        for(int i = 0; i < array.size(); i++) {
+        JSONArray array = JSONArray.parseArray(JSON.toJSONString(list));
+        for (int i = 0; i < array.size(); i++) {
             JSONObject job = array.getJSONObject(i);
             Double waterCost = Optional.ofNullable(job.getDouble("waterCost")).orElse(0.0);
             Double cardCost = Optional.ofNullable(job.getDouble("cardCost")).orElse(0.0);
@@ -439,6 +449,7 @@
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇寮�鍗¤褰�
+     *
      * @param queryVo
      * @return
      */
@@ -446,11 +457,11 @@
         //瀹屽杽鏌ヨ鍏呭�艰褰曠殑璧锋鏃堕棿
         String activeTimeStart = queryVo.activeTimeStart;
         String activeTimeStop = queryVo.activeTimeStop;
-        if(activeTimeStart != null) {
+        if (activeTimeStart != null) {
             activeTimeStart = activeTimeStart + " 00:00:00";
             queryVo.setActiveTimeStart(activeTimeStart);
         }
-        if(activeTimeStop != null) {
+        if (activeTimeStop != null) {
             activeTimeStop = activeTimeStop + " 23:59:59";
             queryVo.setActiveTimeStop(activeTimeStop);
         }
@@ -459,18 +470,19 @@
 
         Long itemTotal = seCardOperateMapper.getActiveCardRecordCount(params);
 
-        QueryResultVo<List<VoActiveCard>> rsVo = new QueryResultVo<>() ;
+        QueryResultVo<List<VoActiveCard>> rsVo = new QueryResultVo<>();
 
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getActiveCards(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇琛ュ崱璁板綍
+     *
      * @param queryVo
      * @return
      */
@@ -478,11 +490,11 @@
         //瀹屽杽鏌ヨ鍏呭�艰褰曠殑璧锋鏃堕棿
         String reissueCardTimeStart = queryVo.reissueCardTimeStart;
         String reissueCardTimeStop = queryVo.reissueCardTimeStop;
-        if(reissueCardTimeStart != null) {
+        if (reissueCardTimeStart != null) {
             reissueCardTimeStart = reissueCardTimeStart + " 00:00:00";
             queryVo.setReissueCardTimeStart(reissueCardTimeStart);
         }
-        if(reissueCardTimeStop != null) {
+        if (reissueCardTimeStop != null) {
             reissueCardTimeStop = reissueCardTimeStop + " 23:59:59";
             queryVo.setReissueCardTimeStop(reissueCardTimeStop);
         }
@@ -491,18 +503,19 @@
 
         Long itemTotal = seCardOperateMapper.getReissueCardRecordCount(params);
 
-        QueryResultVo<List<VoReissueCard>> rsVo = new QueryResultVo<>() ;
+        QueryResultVo<List<VoReissueCard>> rsVo = new QueryResultVo<>();
 
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getReissueCards(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇閫氱敤鎿嶄綔璁板綍
+     *
      * @param queryVo
      * @return
      */
@@ -510,11 +523,11 @@
         //瀹屽杽鏌ヨ鍏呭�艰褰曠殑璧锋鏃堕棿
         String timeStart = queryVo.getTimeStart();
         String timeStop = queryVo.getTimeStop();
-        if(timeStart != null) {
+        if (timeStart != null) {
             timeStart = timeStart + " 00:00:00";
             queryVo.setTimeStart(timeStart);
         }
-        if(timeStop != null) {
+        if (timeStop != null) {
             timeStop = timeStop + " 23:59:59";
             queryVo.setTimeStop(timeStop);
         }
@@ -523,26 +536,27 @@
 
         Long itemTotal = Optional.ofNullable(seCardOperateMapper.getCommonOperationRecordCount(params)).orElse(0L);
 
-        QueryResultVo<List<VoOperate>> rsVo = new QueryResultVo<>() ;
+        QueryResultVo<List<VoOperate>> rsVo = new QueryResultVo<>();
 
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         rsVo.obj = seCardOperateMapper.getCommonOperations(params);
-        return rsVo ;
+        return rsVo;
     }
 
     /**
      * 鏍规嵁鎸囧畾鏉′欢鑾峰彇鏀舵嵁鍒楄〃
+     *
      * @param queryVo
      * @return
      */
     public Map getReceipts(QoReceipt queryVo) {
-        if (queryVo.getTimeStart() != null && queryVo.getTimeStart() != ""){
+        if (queryVo.getTimeStart() != null && queryVo.getTimeStart() != "") {
             queryVo.setTimeStart(queryVo.getTimeStart() + " 00:00:00");
         }
-        if (queryVo.getTimeStop() != null && queryVo.getTimeStop() != ""){
+        if (queryVo.getTimeStop() != null && queryVo.getTimeStop() != "") {
             queryVo.setTimeStop(queryVo.getTimeStop() + " 23:59:59");
         }
 
@@ -553,9 +567,9 @@
 
         Long itemTotal = seCardOperateMapper.getReceiptsRecordCount(params);
 
-        QueryResultVo<List<VoReceipt>> rsVo = new QueryResultVo<>() ;
-        rsVo.pageSize = queryVo.pageSize ;
-        rsVo.pageCurr = queryVo.pageCurr ;
+        QueryResultVo<List<VoReceipt>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = queryVo.pageSize;
+        rsVo.pageCurr = queryVo.pageCurr;
 
         rsVo.calculateAndSet(itemTotal, params);
         //rsVo.obj = seCardOperateMapper.getReceipts(params);
@@ -578,13 +592,14 @@
 
     /**
      * 鍒ゆ柇鎸囧畾姘村崱鏄惁涓烘寕澶辩姸鎬佷笖鏃犺ˉ鍗¤褰�
+     *
      * @param cardNum 姘村崱缂栧彿
      * @return 鏄惁宸叉寕澶辨湭琛ュ崱
      */
     public Boolean isLostAndUnreplaced(Long cardNum) {
         Integer lostCount = seClientCardMapper.getLostCount(cardNum);
         Integer replacedCount = seClientCardMapper.getReplacedCount(cardNum);
-        if(lostCount > 0 && replacedCount == 0) {
+        if (lostCount > 0 && replacedCount == 0) {
             return true;
         }
         return false;
@@ -592,6 +607,7 @@
 
     /**
      * 淇敼鍐滄埛姘村崱
+     *
      * @param po
      * @return
      */
@@ -601,6 +617,7 @@
 
     /**
      * 鑾峰彇椤圭洰缂栧彿
+     *
      * @return
      */
     public String getProjectNo() {
@@ -609,6 +626,7 @@
 
     /**
      * 鏍规嵁姘村崱缂栧彿鑾峰彇鍏舵寕澶辨椂閫�娆鹃噾棰濓紙琛ュ崱鏃跺垽鏂娇鐢級
+     *
      * @param cardNum
      * @return
      */
@@ -618,23 +636,184 @@
 
     /**
      * 鏍规嵁姘村崱鍦板潃鍒ゆ柇璇ュ崱鏄惁鍙互寮�鍗�
+     *
      * @param cardAddr
      * @return
      */
     public Boolean canActiveCard(String cardAddr) {
 
-        // 鎸囧畾姘村崱鍦板潃鐨勬按鍗℃暟閲�
+        // 鎸囧畾姘村崱鍦板潃鐨勬按鍗℃暟閲忥紝鏃犳晥鍗$墖鎺掗櫎鍦ㄥ
         Long cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddr(cardAddr)).orElse(0L);
-        if(cardCount == 0) {
-           return true;
+        if (cardCount == 0) {
+            return true;
         }
 
         // 鎸囧畾姘村崱鍦板潃涓旀甯哥姸鎬佹垨鎸傚け鐘舵�佺殑姘村崱鏁伴噺
         cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddrAndState(cardAddr)).orElse(0L);
-        if(cardCount == 0) {
+        if (cardCount == 0) {
             return true;
         }
 
         return false;
     }
+
+    /**
+     * 渚濇嵁姘村崱鍦板潃鑾峰彇姘村崱缂栧彿
+     *
+     * @param cardAddr
+     * @return
+     */
+    public Long getCardIdByAddr(String cardAddr) {
+        return seClientCardMapper.getCardIdByAddr(cardAddr);
+    }
+
+    /**
+     * 渚濇嵁姘村崱鍦板潃灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鎸囧畾鎿嶄綔璁板綍鏀逛负鏈夋晥
+     *
+     * @param cardAddr
+     * @param operateType
+     * @return
+     */
+    public Integer turnCardValidByAddr(String cardAddr, Integer operateType) {
+        return seClientCardMapper.turnCardValidByAddr(cardAddr, operateType);
+    }
+
+    /**
+     * 鏍规嵁姘村崱ID銆佹搷浣滅被鍨嬭幏鍙栬幏鍙栨渶鍚庝竴鏉¤褰曪紝鍒ゆ柇寮�鍗℃槸鍚﹀悓姝ュ厖鍊间娇鐢�
+     *
+     * @param cardId
+     * @return
+     */
+    public Integer turnOperateValidByCardId(Long cardId, Integer operateType) {
+        return seCardOperateMapper.turnOperateValidByCardId(cardId, operateType);
+    }
+
+    /**
+     * 渚濇嵁姘村崱ID灏嗘渶鍚庝竴鏉℃棤鏁堢姸鎬佺殑鍏呭�煎巻鍙茶褰曟敼涓烘湁鏁�
+     *
+     * @param cardId
+     * @return
+     */
+    public Integer turnRechargeHistoryValidByCardId(Long cardId) {
+        return seRechargeHistoryMapper.turnRechargeHistoryValidByCardId(cardId);
+    }
+
+    /**
+     * 鏍规嵁姘村崱ID鍒ゆ柇鏄惁涓哄紑鍗℃椂鍚屾鍏呭��
+     * 璇ユ按鍗D涓嶅瓨鍦ㄥ紑鍗¤褰曟垨鍏呭�艰褰曞垯杩斿洖false
+     * 濡傛灉寮�鍗℃搷浣滀笌鍏呭�兼搷浣滄椂闂撮棿闅旇秴杩�30绉掑垯杩斿洖false
+     * 濡傛灉鍏呭�奸噾棰濆ぇ浜�0涓斿厖鍊煎墠浣欓涓�0鍒欒繑鍥瀟rue
+     *
+     * @param cardId
+     * @return
+     */
+    public Boolean isMergeRecharge(Long cardId) {
+        SeCardOperate activeCard = seCardOperateMapper.getCardOperate(1, cardId);
+        SeCardOperate recharge = seCardOperateMapper.getCardOperate(2, cardId);
+        if (activeCard == null || recharge == null) {
+            return false;
+        }
+
+        Duration duration = Duration.between(activeCard.getOperateDt().toInstant(), recharge.getOperateDt().toInstant());
+        if (duration.toSeconds() > 30) {
+            return false;
+        }
+
+        Float money = Optional.ofNullable(recharge.getMoney()).orElse(0f);
+        Float tradeAmount = Optional.ofNullable(recharge.getTradeAmount()).orElse(0f);
+
+        if (tradeAmount > 0 && money == 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁姘村崱ID浠庢搷浣滆褰曡〃涓彇鍑猴細浣欓銆佷氦鏄撻噾棰濄�佽禒閫侀噾棰濓紝姹傚拰寰楀埌姘村崱浣欓
+     * 灏嗕綑棰濇洿鏂板埌姘村崱琛ㄤ腑
+     *
+     * @param cardId
+     * @return
+     */
+    public Boolean updateCard(Long cardId) {
+        SeCardOperate recharge = seCardOperateMapper.getCardOperate(2, cardId);
+        if (recharge == null) {
+            return false;
+        }
+        Float money = Optional.ofNullable(recharge.getMoney()).orElse(0f);
+        Float amount = Optional.ofNullable(recharge.getTradeAmount()).orElse(0f);
+        Float gift = Optional.ofNullable(recharge.getGift()).orElse(0f);
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setMoney(money + amount + gift);
+        clientCard.setRechargedt(recharge.getOperateDt());
+        clientCard.setLastoper(LastOperateENUM.RECHARGE.getCode());
+        Integer rec_updateClientCard = seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+        if (rec_updateClientCard == null || rec_updateClientCard == 0) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 濡傛灉琛ュ崱鏃惰浆绉讳簡閫�杩橀噾棰濓紝娓呯┖鎸傚け鍗′綑棰�
+     * @param operateType
+     * @param cardId
+     */
+    public void emptyCardBalance(Integer operateType, Long cardId) {
+        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
+        if(cardOperate != null) {
+            Float noTradeAmount = cardOperate.getNoTradeAmount();
+            if(noTradeAmount != null && noTradeAmount > 0) {
+                Long originalCardId = seClientCardMapper.getOriginalCardIdByCardId(cardId);
+                if(originalCardId != null) {
+                    SeClientCard clientCard = new SeClientCard();
+                    clientCard.setId(cardId);
+                    clientCard.setMoney(0f);
+                    seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 淇敼娉ㄩ攢姘村崱琛ㄧ殑璁板綍鍙婁綑棰濓紙0锛�
+     * @param cardId
+     * @return
+     */
+    public Integer updateCancels(Integer operateType, Long cardId) {
+        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
+        Date cancelTime = Optional.ofNullable(cardOperate.getOperateDt()).orElse(new Date());
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setCanceldt(cancelTime);
+        clientCard.setMoney(0f);
+        clientCard.setState(CardStateENUM.CANCELLED.getCode());
+        clientCard.setLastoper(LastOperateENUM.CANCEL.getCode());
+        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+    }
+
+    /**
+     * 淇敼琛ユ墸姘村崱琛ㄧ殑鎿嶄綔淇℃伅鍙婁綑棰�
+     * @param operateType
+     * @param cardId
+     * @return
+     */
+    public Integer updateRefund(Integer operateType, Long cardId) {
+        SeCardOperate cardOperate = seCardOperateMapper.getCardOperate(operateType, cardId);
+        Date refundTime = Optional.ofNullable(cardOperate.getOperateDt()).orElse(new Date());
+        Float money = cardOperate.getMoney();
+        Float refund = cardOperate.getRefundAmount();
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setRefunddt(refundTime);
+        clientCard.setMoney(money + refund);
+        clientCard.setLastoper(LastOperateENUM.REFUND.getCode());
+        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+    }
 }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java
new file mode 100644
index 0000000..a3a89ae
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/CallBack.java
@@ -0,0 +1,30 @@
+package com.dy.pipIrrSell.cardOperate.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-09-30 15:05
+ * @LastEditTime 2024-09-30 15:05
+ * @Description 鎿嶄綔鎵ц鍥炶皟锛氬紑鍗°�佸厖鍊笺�佽ˉ鍗°�侀攢鍗°�佽ˉ鎵�
+ */
+
+@Data
+public class CallBack {
+    public static final long serialVersionUID = 202409301507001L;
+
+    /**
+     * 姘村崱鍦板潃
+     */
+    @NotBlank(message = "姘村崱鍦板潃涓嶈兘涓虹┖")
+    private String cardAddr;
+
+    /**
+     * 鎿嶄綔绫诲瀷锛�1-寮�鍗★紝2-鍏呭�硷紝3-閿�鍗★紝4-琛ュ崱锛�5-琛ユ墸
+     */
+    @NotNull(message = "鎿嶄綔绫诲瀷涓嶈兘涓虹┖")
+    private Integer operateType;
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java
index 54909b0..99d476d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/cardOperate/dto/DtoCancel.java
@@ -43,11 +43,11 @@
     private Float refund;
 
     /**
-     * 閫�娆炬柟寮�;1-鐜伴噾
+     * 閫�娆炬柟寮�;
      */
     @Schema(description = "閫�娆炬柟寮�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
     @Positive(message = "閫�娆炬柟寮忓繀椤讳负澶т簬0鐨勬暣鏁�")
-    private Byte refundType;
+    private Long refundType;
 
     /**
      * 澶囨敞淇℃伅
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java
index 09ef48d..f2b9ae2 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/CardStateENUM.java
@@ -15,7 +15,8 @@
 public enum CardStateENUM {
     NORMAL((byte)1, "姝e父"),
     CANCELLED((byte)2, "宸叉敞閿�"),
-    LOSS((byte)3, "宸叉寕澶�");
+    LOSS((byte)3, "宸叉寕澶�"),
+    INVALID((byte)4, "鏃犳晥鐨�");
 
     private final Byte code;
     private final String message;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java
index 8d6b05c..dda7296 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/clientCard/ClientCardCtrl.java
@@ -11,7 +11,6 @@
 import com.dy.pipIrrGlobal.voSe.VoCards2;
 import com.dy.pipIrrSell.clientCard.qo.QoCards;
 import com.dy.pipIrrSell.clientCard.qo.QoCards2;
-import com.dy.pipIrrSell.result.SellResultCode;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -182,11 +181,12 @@
     public BaseResponse<QueryResultVo<List<VoCards2>>> getCardsByClientNameAndPhone(QoCards2 vo){
         try {
             QueryResultVo<List<VoCards2>> res = clientCardSv.getCardsByClientNameAndPhone(vo);
-            if(res.itemTotal != null && res.itemTotal > 0) {
-                return BaseResponseUtils.buildSuccess(res);
-            }else {
-                return BaseResponseUtils.buildFail(SellResultCode.THE_CARD_NOT_EXIST.getMessage());
-            }
+            return BaseResponseUtils.buildSuccess(res);
+            //if(res.itemTotal != null && res.itemTotal > 0) {
+            //    return BaseResponseUtils.buildSuccess(res);
+            //}else {
+            //    return BaseResponseUtils.buildFail(SellResultCode.THE_CARD_NOT_EXIST.getMessage());
+            //}
         } catch (Exception e) {
             log.error("鏌ヨ姘村崱寮傚父", e);
             return BaseResponseUtils.buildException(e.getMessage()) ;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java
index 9349b5e..932eb21 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/general/GeneralSv.java
@@ -160,8 +160,6 @@
 
         // 鑾峰彇鍚勬敮浠樻柟寮廔D
         Long paymentId_cash = 0L;
-        //Long paymentId_wechat = 0L;
-        //Long paymentId_alipay = 0L;
         Long paymentId_pos = 0L;
         Long paymentId_transfer = 0L;
         List<SePaymentMethod> list_payment = sePaymentMethodMapper.getPaymentMethods();
@@ -170,19 +168,12 @@
             if(paymentMethod.getName().equals("鐜伴噾")) {
                 paymentId_cash = paymentMethod.getId();
             }
-            //if(paymentMethod.getName().equals("寰俊鏀粯")) {
-            //    paymentId_wechat = paymentMethod.getId();
-            //}
-            //if(paymentMethod.getName().equals("鏀粯瀹濇敮浠�")) {
-            //    paymentId_alipay = paymentMethod.getId();
-            //}
             if(paymentMethod.getName().equals("POS鏈�")) {
                 paymentId_pos = paymentMethod.getId();
             }
             if(paymentMethod.getName().equals("閾惰杞处")) {
                 paymentId_transfer = paymentMethod.getId();
             }
-
         }
 
         // 鎺ユ敹浼犲叆鍙傛暟锛氫氦鏄撹捣姝㈡棩鏈熴�佹敹閾跺憳ID
@@ -197,22 +188,19 @@
             String tradeDate = dateFormat.format(calendar.getTime()) ;
             if(cashierId != 1000000L) {
                 Float receivedCash = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId, paymentId_cash)).orElse(0f);
-                //Float receivedWechat = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_wechat)).orElse(0f);
-                //Float receivedAlipay = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_alipay)).orElse(0f);
                 Float receivedPos = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId,paymentId_pos)).orElse(0f);
                 Float receivedTransfer = Optional.ofNullable(seGeneralMapper.getPaymentSums(tradeDate, cashierId, paymentId_transfer)).orElse(0f);
 
                 JSONObject job = new JSONObject();
                 job.put("tradeDate", tradeDate);
                 job.put("receivedCash", receivedCash);
-                //job.put("receivedWechat", receivedWechat);
-                //job.put("receivedAlipay", receivedAlipay);
                 job.put("receivedPos", receivedPos);
                 job.put("receivedTransfer", receivedTransfer);
                 array_paymentSums.add(job);
 
             }else {
                 // 鍒嗙骇璁$畻鎸囧畾鏃ユ湡寰俊鏀堕��娆惧悎璁★紝鍐嶈绠楀疄鏀堕噾棰�
+                // 姝ゅ搴旂敤鏃跺啀浼樺寲
                 Double rechargeWeChat = Optional.ofNullable(seWalletRechargeMapper.getRechargeSum(tradeDate)).orElse(0.0);
                 Double refundWeChat = Optional.ofNullable(seRefundMapper.getRefundSum(tradeDate)).orElse(0.0);
                 Double receiveWeChat = rechargeWeChat - refundWeChat;

--
Gitblit v1.8.0