From bc958e6f7341714e40da74722c4f2208f192fe61 Mon Sep 17 00:00:00 2001
From: zhubaomin <zhubaomin>
Date: 星期一, 21 十月 2024 16:21:50 +0800
Subject: [PATCH] 2024-10-21 朱宝民 虚拟卡销卡接口、获取虚拟卡充值记录接口

---
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java   |   28 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java           |    2 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml                                      |    8 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java                  |   15 ++
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml                                 |   93 +++++++++----
 /dev/null                                                                                                       |   15 --
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java |   20 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java                       |    7 +
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java     |   45 +++---
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java |   53 +++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java   |   26 +++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java                          |   66 +++++---
 pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml                                                |   10 
 13 files changed, 280 insertions(+), 108 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
index 6d453c3..002de4d 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
@@ -114,4 +114,19 @@
      * @param money
      */
     void updateMoney(@Param("id")Long id , @Param("money")Double money);
+
+    /**
+     * 鏍规嵁鍐滄埛ID鍙婅櫄鎷熷崱ID鑾峰彇姝e父鐘舵�佺殑铏氭嫙鍗″璞★紝閿�鍗′娇鐢�
+     * @param clientId
+     * @param vcId
+     * @return
+     */
+    SeVirtualCard getVcByClientIdAndVcId(@Param("clientId")Long clientId, @Param("vcId")Long vcId);
+
+    /**
+     * 娉ㄩ攢铏氭嫙鍗�
+     * @param vcId
+     * @return
+     */
+    Integer cancelVc(@Param("clientId")Long clientId, @Param("vcId")Long vcId);
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
index bb3b69b..8a895fb 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
@@ -64,6 +64,13 @@
     private Double money;
 
     /**
+     * 姘村崱鐘舵�侊紱1-姝e父锛�2-宸叉敞閿�
+     */
+    @Min(value = 1, message = "姘村崱鐘舵�佷笉鑳藉皬浜�1")
+    @Max(value = 2, message = "姘村崱鐘舵�佷笉鑳藉ぇ浜�2")
+    private Byte state;
+
+    /**
      * 鏈�鍚庢搷浣�;1-寮�鎴凤紝2-鍏呭�硷紝3-娑堣垂锛�4-鐢宠閫�娆撅紝5-閫�娆惧鏍�
      */
     @Schema(description = "鎿嶄綔绫诲瀷", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java
index 0e9c043..9f955ca 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java
@@ -1,8 +1,12 @@
 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 com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
@@ -13,39 +17,47 @@
  * @Description
  */
 @Data
+@JsonPropertyOrder({"vcId", "clientId", "rechargeTime", "rechargeAmount", "afterRecharge", "rechargeType"})
 public class VoVcRecharge implements BaseEntity {
+    private static final long serialVersionUID = 202410211420001L;
 
-    @Schema(title = "鍏呭�糏D")
-    private Long id;
-
-    @Schema(description = "铏氭嫙鍗D")
+    /**
+     * 铏氭嫙鍗D
+     */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
     private Long vcId;
 
-    @Schema(description = "鍐滄埛ID")
+    /**
+     * 鍐滄埛ID
+     */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
     private Long clientId;
 
-
-    @Schema(description = "閽卞寘浣欓")
-    private Double money;
-
-    @Schema(description = "鍏呭�煎悗浣欓")
-    private Double afterRecharge;
-
-    @Schema(description = "璁㈠崟鍙�")
-    private String orderNumber;
-
-    @Schema(description = "鍏呭�奸噾棰�")
-    private Integer rechargeAmount;
-
-    @Schema(description = "涓嬪崟鏃堕棿")
-    private Date orderTime;
-
-    @Schema(description = "鍏呭�煎畬鎴愭椂闂�")
+    /**
+     * 鍏呭�煎畬鎴愭椂闂�
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date rechargeTime;
 
-    @Schema(description = "璁㈠崟鐘舵��")
-    private Byte orderState;
+    /**
+     * 鍏呭�奸噾棰�
+     */
+    private Integer rechargeAmount;
 
-    @Schema(description = "璁㈠崟鐘舵��")
-    private String orderStateName;
+    /**
+     * 鍏呭�煎悗浣欓
+     */
+    private Double afterRecharge;
+
+    /**
+     * 鍏呭�肩被鍨�
+     */
+    private String rechargeType;
+
+    /**
+     * 铏氭嫙鍗$姸鎬侊紝鏆傛椂涓嶇敤锛岀洿鎺ヨ繃婊ゆ帀宸叉敞閿�铏氭嫙鍗�
+     */
+    //private String cardState;
+
 }
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 00d6993..eecab7f 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml
@@ -69,9 +69,8 @@
             <user name="瓒呯骇绠$悊鍛�" phone="admin" password="admin" supperAdmin="1" />
             <payments>
                 <item1 name="鐜伴噾"/>
-                <item2 name="寰俊鏀粯"/>
-                <item3 name="鏀粯瀹濇敮浠�"/>
-                <item4 name="閾惰杞处"/>
+                <item2 name="POS鏈�"/>
+                <item3 name="閾惰杞处"/>
             </payments>
             <settings>
                 <item1 item_name="lng" item_value="101.87345" remarks="缁忓害"/>
@@ -118,9 +117,8 @@
             <user name="瓒呯骇绠$悊鍛�" phone="admin" password="admin" supperAdmin="1" />
             <payments>
                 <item1 name="鐜伴噾"/>
-                <item2 name="寰俊鏀粯"/>
-                <item3 name="鏀粯瀹濇敮浠�"/>
-                <item4 name="閾惰杞处"/>
+                <item2 name="POS鏈�"/>
+                <item3 name="閾惰杞处"/>
             </payments>
             <settings>
                 <item1 item_name="lng" item_value="101.87345" remarks="缁忓害"/>
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
index fefa9d6..e1d1b20 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
@@ -411,7 +411,7 @@
 
   <!--鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍唬鐮�-->
   <select id="getAreaCodeByNum" resultType="java.lang.Long">
-    SELECT districtNum FROM se_client WHERE clientNum = ${clientNum} LIMIT 0,1
+    SELECT districtNum FROM se_client WHERE clientNum = #{clientNum} LIMIT 0,1
   </select>
 
   <!--鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode锛岃ˉ鍗¤繃绋嬩腑寮�鏂板崱浣跨敤-->
@@ -421,7 +421,7 @@
 
   <!--鏍规嵁鍐滄埛缂栧彿鑾峰彇鍐滄埛ID-->
   <select id="getClientIdByNum" resultType="java.lang.Long">
-    SELECT id FROM se_client WHERE clientNum = ${clientNum} LIMIT 0,1
+    SELECT id FROM se_client WHERE clientNum = #{clientNum} LIMIT 0,1
   </select>
 
   <!--鏍规嵁鐢佃瘽鍙风爜鑾峰彇鍐滄埛ID-->
@@ -434,14 +434,14 @@
     update se_client set deleted = 1
     <where>
       <if test = "id != null and id > 0">
-        AND id = ${id}
+        AND id = #{id}
       </if>
     </where>
   </update>
 
   <!--鏍规嵁涓婚敭鑾峰彇鏉慖D-->
   <select id="getVillageIdById" parameterType="java.lang.Long" resultType="java.lang.Long">
-    SELECT villageId FROM se_client WHERE id = ${id}
+    SELECT villageId FROM se_client WHERE id = #{id}
   </select>
 
   <!--鑾峰彇铏氭嫙鍗″彿鏈�澶у��-->
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
index cdc44c2..734119c 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
@@ -8,6 +8,7 @@
     <result column="vc_num" jdbcType="BIGINT" property="vcNum" />
     <result column="client_id" jdbcType="BIGINT" property="clientId" />
     <result column="money" jdbcType="FLOAT" property="money" />
+    <result column="state" jdbcType="TINYINT" property="state" />
     <result column="last_operate" jdbcType="TINYINT" property="lastOperate" />
     <result column="last_operate_time" jdbcType="TIMESTAMP" property="lastOperateTime" />
     <result column="in_use" jdbcType="TINYINT" property="inUse" />
@@ -16,7 +17,7 @@
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
-    id, vc_num, client_id, money, last_operate, last_operate_time, in_use, intake_id, create_time
+    id, vc_num, client_id, money, state, last_operate, last_operate_time, in_use, intake_id, create_time
   </sql>
   <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -34,10 +35,10 @@
   <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
     <!--@mbg.generated-->
     insert into se_virtual_card (id, vc_num, client_id, 
-      money, last_operate, last_operate_time, 
+      money, state, last_operate, last_operate_time,
       in_use, intake_id, create_time)
     values (#{id,jdbcType=BIGINT}, #{vcNum,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, 
-      #{money,jdbcType=FLOAT}, #{lastOperate,jdbcType=TINYINT}, #{lastOperateTime,jdbcType=TIMESTAMP}, 
+      #{money,jdbcType=FLOAT}, #{state,jdbcType=TINYINT}, #{lastOperate,jdbcType=TINYINT}, #{lastOperateTime,jdbcType=TIMESTAMP},
       #{inUse,jdbcType=TINYINT}, #{intakeId,jdbcType=BIGINT},#{createTime,jdbcType=TIMESTAMP})
   </insert>
   <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
@@ -55,6 +56,9 @@
       </if>
       <if test="money != null">
         money,
+      </if>
+      <if test="state != null">
+        state,
       </if>
       <if test="lastOperate != null">
         last_operate,
@@ -84,6 +88,9 @@
       </if>
       <if test="money != null">
         #{money,jdbcType=FLOAT},
+      </if>
+      <if test="state != null">
+        #{state,jdbcType=TINYINT},
       </if>
       <if test="lastOperate != null">
         #{lastOperate,jdbcType=TINYINT},
@@ -115,6 +122,9 @@
       <if test="money != null">
         money = #{money,jdbcType=FLOAT},
       </if>
+      <if test="state != null">
+        state = #{state,jdbcType=TINYINT},
+      </if>
       <if test="lastOperate != null">
         last_operate = #{lastOperate,jdbcType=TINYINT},
       </if>
@@ -139,6 +149,7 @@
     set vc_num = #{vcNum,jdbcType=BIGINT},
       client_id = #{clientId,jdbcType=BIGINT},
       money = #{money,jdbcType=FLOAT},
+      state = #{state,jdbcType=TINYINT},
       last_operate = #{lastOperate,jdbcType=TINYINT},
       last_operate_time = #{lastOperateTime,jdbcType=TIMESTAMP},
       in_use = #{inUse,jdbcType=TINYINT},
@@ -162,6 +173,7 @@
     SELECT COUNT(*) AS recordCount
     FROM se_virtual_card
     <where>
+      AND state = 1
       <if test = "clientId != null and clientId > 0">
         AND client_id = #{clientId}
       </if>
@@ -185,6 +197,7 @@
       END) AS isAlarmValue
     FROM se_virtual_card
     <where>
+      AND state = 1
       <if test = "clientId != null">
         AND client_id = #{clientId}
       </if>
@@ -204,19 +217,19 @@
             WHEN in_use = 1 THEN '浣跨敤涓�'
         END) AS inUseName
     FROM se_virtual_card
-    WHERE id = #{vcId}
+    WHERE state = 1 AND id = #{vcId}
   </select>
 
   <!--鏍规嵁铏氭嫙鍗$紪鍙疯幏鍙栬櫄鎷熷崱-->
   <select id="getVcCardByNum" resultType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
     select
     <include refid="Base_Column_List" />
-    FROM se_virtual_card WHERE vc_num = #{vcNum}
+    FROM se_virtual_card WHERE state = 1 AND vc_num = #{vcNum}
   </select>
 
   <!--鏍规嵁铏氭嫙鍗$紪鍙疯幏鍙栬櫄鎷熷崱ID-->
   <select id="getVcIdByNum" resultType="java.lang.Long">
-    SELECT id FROM se_virtual_card WHERE vc_num = #{vcNum}
+    SELECT id FROM se_virtual_card WHERE state = 1 AND vc_num = #{vcNum}
   </select>
 
   <!--鏍规嵁铏氭嫙鍗$紪鍙疯幏鍙栬櫄鎷熷崱ID-->
@@ -226,7 +239,7 @@
     cli.name AS clientName
     FROM se_virtual_card card
     INNER JOIN se_client cli ON card.client_id = cli.id
-    WHERE card.vc_num = #{vcNum}
+    WHERE card.state = 1 AND card.vc_num = #{vcNum}
   </select>
 
   <!-- 鏍规嵁姘村崱缂栧彿鑾峰彇铏氭嫙姘村崱 -->
@@ -235,38 +248,41 @@
     id,
     money
     FROM se_virtual_card
-    WHERE vc_num = #{cardNum}
+    WHERE state = 1 AND vc_num = #{cardNum}
   </select>
 
   <!--鏍规嵁琛屾斂鍖哄垝涓叉ā绯婃煡璇㈣櫄鎷熷崱缂栧彿-->
   <select id="getVcCardNumOfMax"  resultType="java.lang.String">
     SELECT vc_num
     FROM se_virtual_card
-    WHERE vc_num LIKE CONCAT('%',#{areaCode},'%')
+    WHERE state = 1 AND vc_num LIKE CONCAT('%',#{areaCode},'%')
     ORDER BY vc_num desc
     LIMIT 0,1
   </select>
 
-  <!--鑾峰彇铏氭嫙鍗″厖鍊艰褰�-->
+  <!--鑾峰彇铏氭嫙鍗″厖鍊艰褰曪紝涓嶅寘鎷凡宸叉敞閿�鍗$殑鍏呭�艰褰�-->
   <select id="getVcRechargeRecords" resultType="com.dy.pipIrrGlobal.voSe.VoVcRecharge" >
     SELECT
-      CAST(id AS char) AS id,
-      CAST(vc_id AS char) AS vcId,
-      CAST(client_id AS char) AS clientId,
-      money,
-      after_recharge AS afterRecharge,
-      order_number AS orderNumber,
-      recharge_amount AS rechargeAmount,
-      order_time AS orderTime,
-      recharge_time AS rechargeTime,
-      order_state AS orderState,
-      (CASE
-      WHEN order_state = 1 THEN '鏈敮浠�'
-      WHEN order_state = 2 THEN '宸叉敮浠�'
-      END) AS orderStateName
-    FROM se_vc_recharge
-    where order_state = 2
-    order by recharge_time DESC
+        rec.vc_id AS vcId,
+        rec.client_id AS clientId,
+        rec.recharge_time AS rechargeTime,
+        rec.recharge_amount AS rechargeAmount,
+        rec.after_recharge AS afterRecharge,
+        '寰俊鏀粯' AS rechargeType
+    <!--        CASE-->
+    <!--            WHEN card.state = 1 THEN '姝e父閿�铏氭嫙鍗�'-->
+    <!--            WHEN card.state = 2 THEN '宸叉敞閿�铏氭嫙鍗�'-->
+    <!--        END AS cardState,-->
+    FROM se_vc_recharge rec
+        INNER JOIN se_virtual_card card ON card.id = rec.vc_id
+    <where>
+      AND card.state = 1
+      AND rec.order_state = 2
+      <if test = "vcId != null and vcId > 0">
+        AND rec.vc_id = #{vcId}
+      </if>
+    </where>
+    order by rec.recharge_time DESC
     <if test="start != null and count != null">
       LIMIT #{start}, #{count}
     </if>
@@ -275,7 +291,26 @@
   <select id="getRechargeRecordCount" resultType="java.lang.Long">
     SELECT
       COUNT(*)
-    FROM se_vc_recharge
-    where order_state = 2
+    FROM se_vc_recharge rec
+        INNER JOIN se_virtual_card card ON card.id = rec.vc_id
+    <where>
+      AND card.state = 1
+      AND rec.order_state = 2
+      <if test = "vcId != null and vcId > 0">
+        AND rec.vc_id = #{vcId}
+      </if>
+    </where>
   </select>
+
+  <!--鏍规嵁鍐滄埛ID鍙婅櫄鎷熷崱ID鑾峰彇姝e父鐘舵�佺殑铏氭嫙鍗″璞★紝閿�鍗′娇鐢�-->
+  <select id="getVcByClientIdAndVcId" resultType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    SELECT * FROM se_virtual_card
+    WHERE state = 1 AND client_id = #{clientId} AND id = #{vcId}
+  </select>
+
+  <!--娉ㄩ攢铏氭嫙鍗�-->
+  <update id="cancelVc">
+    UPDATE se_virtual_card SET state = 2,  last_operate = 4 , last_operate_time = NOW()
+    WHERE id = #{vcId} AND client_id = #{clientId}
+  </update>
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
index 974622e..d098d1f 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
@@ -775,7 +775,7 @@
     }
 
     /**
-     * 寮哄埗鍥犳鏈叧闃�璁板綍锛氫负鎸囧畾锛堥榾鎺у櫒鍦板潃銆佹按鍗$紪鍙枫�佹棤鍏抽榾璁板綍锛夊紑鍏抽榾鏈�鏂拌褰曟坊鍔犲叧闃�鏃堕棿锛屼娇涔嬩笉鍦ㄦ湭鍏抽榾璁板綍涓樉绀�
+     * 寮哄埗闅愯棌鏈叧闃�璁板綍锛氫负鎸囧畾锛堥榾鎺у櫒鍦板潃銆佹按鍗$紪鍙枫�佹棤鍏抽榾璁板綍锛夊紑鍏抽榾鏈�鏂拌褰曟坊鍔犲叧闃�鏃堕棿锛屼娇涔嬩笉鍦ㄦ湭鍏抽榾璁板綍涓樉绀�
      * @param po
      * @param bindingResult
      * @return
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
index 4b8b279..935c64d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
@@ -37,32 +37,35 @@
     /**
      * 寰俊鐢ㄦ埛
      */
-    PHONE_NUMBER_CANNOT_BE_NULL(20001, "鎵嬫満鍙蜂笉鑳戒负绌�"),
-    SECURITY_CODE_SEND_FAIL(20001, "楠岃瘉鐮佸彂閫佸け璐�"),
-    VERIFY_PARAMS_INCOMPLETE(20001, "楠岃瘉鍙傛暟涓嶅畬鏁�"),
-    CODE_VERIFY_FAIL(20001, "楠岃瘉鐮佹牎楠屽け璐�"),
+    PHONE_NUMBER_CANNOT_BE_NULL(30001, "鎵嬫満鍙蜂笉鑳戒负绌�"),
+    SECURITY_CODE_SEND_FAIL(30002, "楠岃瘉鐮佸彂閫佸け璐�"),
+    VERIFY_PARAMS_INCOMPLETE(30003, "楠岃瘉鍙傛暟涓嶅畬鏁�"),
+    CODE_VERIFY_FAIL(30004, "楠岃瘉鐮佹牎楠屽け璐�"),
 
-    NO_SECURITY_CODE_FOR_PHONE(20002, "璇ユ墜鏈哄彿鏈彂閫侀獙璇佺爜"),
-    SECURITY_CODE_ERROR(20003, "楠岃瘉鐮侀敊璇�"),
-    VALIDATION_TIMEOUT(20004, "楠岃瘉瓒呮椂"),
-    PHONE_NUMBER_IS_ERROR(20004, "鎵嬫満鍙烽敊璇紝闈炴敞鍐屽啘鎴�"),
-    INVALID_CODE(20004, "鏃犳晥鐨勪复鏃剁櫥褰曞嚟璇�"),
-    LOGIN_FAIL(20004, "鐧诲綍澶辫触"),
+    NO_SECURITY_CODE_FOR_PHONE(30005, "璇ユ墜鏈哄彿鏈彂閫侀獙璇佺爜"),
+    SECURITY_CODE_ERROR(30006, "楠岃瘉鐮侀敊璇�"),
+    VALIDATION_TIMEOUT(30007, "楠岃瘉瓒呮椂"),
+    PHONE_NUMBER_IS_ERROR(30008, "鎵嬫満鍙烽敊璇紝闈炴敞鍐屽啘鎴�"),
+    INVALID_CODE(30009, "鏃犳晥鐨勪复鏃剁櫥褰曞嚟璇�"),
+    LOGIN_FAIL(30010, "鐧诲綍澶辫触"),
 
     /**
      * 铏氭嫙鍗�
      */
-    AREA_CODE_MISTAKE(10001, "璇ュ啘鎴疯鏀垮尯鍒掑紓甯�"),
-    ABNORMAL(10001, "閫�娆惧紓甯�"),
-    PROCESSING(10001, "閫�娆惧鐞嗕腑"),
-    VC_OPEN_ACCOUNT_FAIL(90002, "铏氭嫙鍗¤处鎴锋敞鍐屽け璐�"),
-    CARD_NUMBER_OVERRUN(10002, "姘村崱缂栧彿宸叉弧"),
-    VIRTUAL_CARD_NOT_EXIST(90006, "铏氭嫙鍗¤处鎴蜂笉瀛樺湪"),
-    RECHARGE_NOT_EXIST(90006, "鍏呭�艰褰曚笉瀛樺湪"),
-    RECHARGE_FAIL(90006, "鍏呭�煎け璐�"),
-    RECHARGE_ADD_FAIL(10001, "鍏呭�艰褰曟坊鍔犲け璐�"),
-    NO_ACCOUNT(40001, "鎮ㄦ寚瀹氱殑铏氭嫙鍗℃湭娉ㄥ唽"),
-    VIRTUAL_CARD_CLIENT_NOT_EXIST(40001, "铏氭嫙鍗℃墍灞炲啘鎴蜂笉瀛樺湪"),
+    AREA_CODE_MISTAKE(40001, "璇ュ啘鎴疯鏀垮尯鍒掑紓甯�"),
+    ABNORMAL(40002, "閫�娆惧紓甯�"),
+    PROCESSING(40003, "閫�娆惧鐞嗕腑"),
+    VC_OPEN_ACCOUNT_FAIL(40004, "铏氭嫙鍗¤处鎴锋敞鍐屽け璐�"),
+    NO_VC_FIT_THE_BILL(40004, "娌℃湁绗﹀悎鏉′欢鐨勮櫄鎷熷崱"),
+    VC_CANCEL_FAIL(40005, "铏氭嫙鍗℃敞閿�澶辫触"),
+
+    CARD_NUMBER_OVERRUN(40006, "姘村崱缂栧彿宸叉弧"),
+    VIRTUAL_CARD_NOT_EXIST(40007, "铏氭嫙鍗¤处鎴蜂笉瀛樺湪"),
+    RECHARGE_NOT_EXIST(40008, "鍏呭�艰褰曚笉瀛樺湪"),
+    RECHARGE_FAIL(40009, "鍏呭�煎け璐�"),
+    RECHARGE_ADD_FAIL(40010, "鍏呭�艰褰曟坊鍔犲け璐�"),
+    NO_ACCOUNT(40011, "鎮ㄦ寚瀹氱殑铏氭嫙鍗℃湭娉ㄥ唽"),
+    VIRTUAL_CARD_CLIENT_NOT_EXIST(40012, "铏氭嫙鍗℃墍灞炲啘鎴蜂笉瀛樺湪"),
 
     /**
      * 浣嶇疆鏀粯
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java
index 3c8baf4..b8dd640 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java
@@ -9,9 +9,10 @@
 import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
 import com.dy.pipIrrWechat.result.WechatResultCode;
 import com.dy.pipIrrWechat.util.PayHelper;
+import com.dy.pipIrrWechat.virtualCard.dto.DtoCancel;
 import com.dy.pipIrrWechat.virtualCard.dto.DtoRegist;
-import com.dy.pipIrrWechat.virtualCard.dto.DtoVcRecharge;
 import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM;
+import com.dy.pipIrrWechat.virtualCard.qo.QoVcRecharge;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
@@ -87,6 +88,7 @@
         seVirtualCard.setVcNum(Long.parseLong(vcNum));
         seVirtualCard.setClientId(clientId);
         seVirtualCard.setMoney(0d);
+        seVirtualCard.setState((byte)1);
         seVirtualCard.setLastOperate(LastOperateENUM.OPEN_ACCOUNT.getCode());
         seVirtualCard.setLastOperateTime(new Date());
         seVirtualCard.setInUse((byte) 0);
@@ -101,6 +103,49 @@
         seVcOperate.setVcId(vcId);
         seVcOperate.setClientId(clientId);
         seVcOperate.setOperateType(LastOperateENUM.OPEN_ACCOUNT.getCode());
+        seVcOperate.setOperator(clientId);
+        seVcOperate.setOperateTime(new Date());
+        Long vcOperateId = virtualCardSv.insertVcOperate(seVcOperate);
+        if(vcOperateId == null) {
+            return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage());
+        }
+
+        return BaseResponseUtils.buildSuccess(true) ;
+    }
+
+    /**
+     * 鏍规嵁铏氭嫙鍗D娉ㄩ攢铏氭嫙鍗�
+     * @param po
+     * @param bindingResult
+     * @return
+     */
+    @PostMapping(path = "cancel")
+    @Transactional(rollbackFor = Exception.class)
+    public BaseResponse<Boolean> cancelVC(@RequestBody @Valid DtoCancel po, BindingResult bindingResult) {
+        if(bindingResult != null && bindingResult.hasErrors()){
+            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+
+        Long clientId = po.getClientId();
+        Long vcId = po.getVcId();
+
+        // 鏍规嵁鍐滄埛ID鍙婅櫄鎷熷崱Id鍒ゆ柇鏄惁瀛樺湪姝e父鐘舵�侊紙鍙敞閿�锛夌殑铏氭嫙鍗�
+        SeVirtualCard seVirtualCard = virtualCardSv.getVcByClientIdAndVcId(clientId, vcId);
+        if(seVirtualCard == null) {
+            return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_VC_FIT_THE_BILL.getMessage());
+        }
+
+        // 娉ㄩ攢铏氭嫙鍗�
+        Integer rec = virtualCardSv.cancelVc(clientId, vcId);
+        if(rec == null || rec == 0) {
+            return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_CANCEL_FAIL.getMessage());
+        }
+
+        // 鐢熸垚铏氭嫙鍗℃搷浣滆褰曪紝娉ㄥ唽铏氭嫙鍗℃搷浣滀汉涓哄啘鎴�
+        SeVcOperate seVcOperate = new SeVcOperate();
+        seVcOperate.setVcId(vcId);
+        seVcOperate.setClientId(clientId);
+        seVcOperate.setOperateType(LastOperateENUM.CLOSING_ACCOUNT.getCode());
         seVcOperate.setOperator(clientId);
         seVcOperate.setOperateTime(new Date());
         Long vcOperateId = virtualCardSv.insertVcOperate(seVcOperate);
@@ -271,8 +316,12 @@
      * @return
      */
     @GetMapping(path = "/getVcRechargeRecords")
-    public BaseResponse<QueryResultVo<List<VoVcRecharge>>> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){
+    public BaseResponse<QueryResultVo<List<VoVcRecharge>>> getVcRechargeRecords(QoVcRecharge dtoVcRecharge){
         try {
+            if(dtoVcRecharge.getVcId() == null) {
+                return BaseResponseUtils.buildErrorMsg("铏氭嫙鍗′笉鑳戒负绌�");
+            }
+
             QueryResultVo<List<VoVcRecharge>> res = virtualCardSv.getVcRechargeRecords(dtoVcRecharge);
             return BaseResponseUtils.buildSuccess(res);
         } catch (Exception e) {
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java
index 334aafa..903bf55 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java
@@ -8,11 +8,11 @@
 import com.dy.pipIrrGlobal.voSe.VoOrders;
 import com.dy.pipIrrGlobal.voSe.VoVcRecharge;
 import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
-import com.dy.pipIrrWechat.virtualCard.dto.DtoVcRecharge;
+import com.dy.pipIrrWechat.result.WechatResultCode;
 import com.dy.pipIrrWechat.virtualCard.dto.DtoVirtualCard;
 import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM;
 import com.dy.pipIrrWechat.virtualCard.enums.OrderStateENUM;
-import com.dy.pipIrrWechat.result.WechatResultCode;
+import com.dy.pipIrrWechat.virtualCard.qo.QoVcRecharge;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.common.utils.PojoUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -89,6 +89,26 @@
     public Long insertVirtualCard(SeVirtualCard po) {
         seVirtualCardMapper.insert(po);
         return po.getId();
+    }
+
+    /**
+     * 鏍规嵁鍐滄埛ID鍙婅櫄鎷熷崱ID鑾峰彇姝e父鐘舵�佺殑铏氭嫙鍗″璞�
+     * @param clientId
+     * @param vcId
+     * @return
+     */
+    public SeVirtualCard getVcByClientIdAndVcId (Long clientId, Long vcId) {
+        return seVirtualCardMapper.getVcByClientIdAndVcId(clientId, vcId);
+    }
+
+    /**
+     * 鏍规嵁铏氭嫙鍗D娉ㄩ攢铏氭嫙鍗�
+     * @param clientId
+     * @param vcId
+     * @return
+     */
+    public Integer cancelVc(Long clientId, Long vcId) {
+        return seVirtualCardMapper.cancelVc(clientId, vcId);
     }
 
     /**
@@ -343,7 +363,7 @@
      * @param dtoVcRecharge
      * @return
      */
-    public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){
+    public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(QoVcRecharge dtoVcRecharge){
         Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(dtoVcRecharge);
         Long itemTotal = seVirtualCardMapper.getRechargeRecordCount(params);
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java
new file mode 100644
index 0000000..7be06bb
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrWechat.virtualCard.dto;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-10-21 10:43
+ * @LastEditTime 2024-10-21 10:43
+ * @Description 娉ㄩ攢铏氭嫙鍗″弬鏁板璞�
+ */
+
+@Data
+public class DtoCancel {
+    public static final long serialVersionUID = 202410211044001L;
+
+    /**
+     * 鍐滄埛ID
+     */
+    @NotNull(message = "鍐滄埛ID涓嶈兘涓虹┖")
+    private Long clientId;
+
+    /**
+     * 铏氭嫙鍗D
+     */
+    @NotNull(message = "铏氭嫙鍗D涓嶈兘涓虹┖")
+    private Long vcId;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoVcRecharge.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoVcRecharge.java
deleted file mode 100644
index 5956583..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoVcRecharge.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.dy.pipIrrWechat.virtualCard.dto;
-
-import com.dy.common.webUtil.QueryConditionVo;
-import lombok.Data;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-07-11 15:41
- * @LastEditTime 2024-07-11 15:41
- * @Description
- */
-
-@Data
-public class DtoVcRecharge extends QueryConditionVo {
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java
new file mode 100644
index 0000000..755ccde
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java
@@ -0,0 +1,20 @@
+package com.dy.pipIrrWechat.virtualCard.qo;
+
+import com.dy.common.webUtil.QueryConditionVo;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-07-11 15:41
+ * @LastEditTime 2024-07-11 15:41
+ * @Description 鍏呭�艰褰曟煡璇㈠璞�
+ */
+
+@Data
+public class QoVcRecharge extends QueryConditionVo {
+
+    /**
+     * 铏氭嫙鍗D
+     */
+    private Long vcId;
+}

--
Gitblit v1.8.0