zhubaomin
2024-10-21 bc958e6f7341714e40da74722c4f2208f192fe61
2024-10-21 朱宝民 虚拟卡销卡接口、获取虚拟卡充值记录接口
10个文件已修改
2个文件已添加
1个文件已删除
388 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/init-config.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardCtrl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/VirtualCardSv.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoVcRecharge.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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获取正常状态的虚拟卡对象,销卡使用
     * @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);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
@@ -64,6 +64,13 @@
    private Double money;
    /**
     * 水卡状态;1-正常,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)
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 = "充值ID")
    private Long id;
    @Schema(description = "虚拟卡ID")
    /**
     * 虚拟卡ID
     */
    @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;
}
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="经度"/>
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>
  <!--根据主键获取村ID-->
  <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>
  <!--获取虚拟卡号最大值-->
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 '正常销虚拟卡'-->
    <!--            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获取正常状态的虚拟卡对象,销卡使用-->
  <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>
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
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, "虚拟卡所属农户不存在"),
    /**
     * 位置支付
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) ;
    }
    /**
     * 根据虚拟卡ID注销虚拟卡
     * @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判断是否存在正常状态(可注销)的虚拟卡
        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) {
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获取正常状态的虚拟卡对象
     * @param clientId
     * @param vcId
     * @return
     */
    public SeVirtualCard getVcByClientIdAndVcId (Long clientId, Long vcId) {
        return seVirtualCardMapper.getVcByClientIdAndVcId(clientId, vcId);
    }
    /**
     * 根据虚拟卡ID注销虚拟卡
     * @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);
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoCancel.java
New file
@@ -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;
    /**
     * 虚拟卡ID
     */
    @NotNull(message = "虚拟卡ID不能为空")
    private Long vcId;
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/dto/DtoVcRecharge.java
File was deleted
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/virtualCard/qo/QoVcRecharge.java
New file
@@ -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 {
    /**
     * 虚拟卡ID
     */
    private Long vcId;
}