Explorar el Código

渠道申请提现

chunping hace 3 años
padre
commit
c2ffe35972

+ 129 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java

@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.channel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.param.ChannelCartParam;
+import com.qs.mp.channel.domain.param.ChannelWithdrawParam;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.channel.service.IChannelBankCardService;
+import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.param.BatchLongIdsParam;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel")
+@Api(tags = "渠道提现接口")
+@AllArgsConstructor
+public class ChannelWithdrawController extends BaseApiController {
+
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private IChannelBankCardService channelBankCardService;
+
+  @Autowired
+  private RedisCache redisCache;
+
+  private final String CHANNEL_WITHDRAW_CACHE_KEY = "channel_settle_withdraw_";
+
+  /**
+   * 渠道提现计算手续费
+   */
+  @PostMapping("/withdraw/settle")
+  @ApiOperation(value = "提现" , notes = "提现计费")
+  public AjaxResult settle(@Valid @RequestBody ChannelWithdrawParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelWithdraw channelWithdraw = new ChannelWithdraw();
+    channelWithdraw.setMoney(param.getMoney());
+    channelWithdraw.setChargeAmt(0);
+    channelWithdraw.setUserName(param.getUserName());
+    channelWithdraw.setCardNo(param.getCardNo());
+    channelWithdraw.setBranchName(param.getBranchName());
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId, channelWithdraw, 1, TimeUnit.MINUTES);
+
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("chargeAmt", channelWithdraw.getChargeAmt());
+    return AjaxResult.success(jsonObject);
+  }
+
+  /**
+   * 渠道提现申请提交
+   */
+  @PostMapping("/withdraw/apply")
+  @ApiOperation(value = "提交提现申请" , notes = "确认服务费后提交")
+  public AjaxResult apply(@RequestBody ChannelWithdrawParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelWithdraw channelWithdraw = redisCache.getCacheObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId);
+    if (null == channelWithdraw) {
+      return AjaxResult.error("申请已过期,请重新提交");
+    }
+    Channel channel = channelService.getById(channelId);
+    if (channelWithdraw.getMoney() > channel.getMoney() ) {
+      return AjaxResult.error("提现金额超出账户余额");
+    }
+
+    channelWithdraw.setChannelId(channelId);
+    channelWithdraw.setLogMoney(channel.getMoney());
+
+    channelWithdrawService.apply(channel, channelWithdraw);
+
+    // 缓存提现结算对象
+    redisCache.deleteObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId);
+
+    return AjaxResult.success("提现申请成功");
+  }
+
+  /**
+   * 渠道提现查询银行卡
+   */
+  @PostMapping("/withdraw/card/query")
+  @ApiOperation(value = "查询银行卡" , notes = "查询银行卡信息")
+  public AjaxResult queryCard(@RequestBody ChannelWithdrawParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelBankCard bankCard = channelBankCardService.getOne(new LambdaQueryWrapper<ChannelBankCard>()
+        .eq(ChannelBankCard::getChannelId, channelId));
+
+    return AjaxResult.success(bankCard);
+  }
+}

+ 3 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -46,6 +46,7 @@ import io.swagger.annotations.ApiOperation;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -132,7 +133,7 @@ public class ChannelOrderController extends BaseApiController {
    */
   @PostMapping("/order/settle")
   @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
-  public AjaxResult settle(@RequestBody ChannelOrderParam param) {
+  public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
     Long channelId = SecurityUtils.getLoginUser().getChannelId();
     Channel channel = channelService.getById(channelId);
     if (channel.getCertifyStatus() != ChannelCertifyStatusEnum.CERTIFIED) {
@@ -218,7 +219,7 @@ public class ChannelOrderController extends BaseApiController {
    */
   @PostMapping("/order/pay")
   @ApiOperation(value = "订单支付" , notes = "在订单列表页面支付")
-  public AjaxResult pay(@RequestBody ChannelOrderPayParam param) {
+  public AjaxResult pay(@Valid @RequestBody ChannelOrderPayParam param) {
     String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
     ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
     JSONObject jsonObject = walletService.channelPay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), openId, channelOrder.getPayAmt());

+ 80 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelBankCard.java

@@ -0,0 +1,80 @@
+package com.qs.mp.channel.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @describe 渠道银行卡信息实体类
+ * @auther quanshu
+ * @create 2022-03-04 17:11:47
+ */
+@TableName("mp_channel_bank_card")
+@Data
+public class ChannelBankCard implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  @TableId(value = "id" , type = IdType.AUTO)
+  private Long id;
+
+  /**
+   * 渠道id
+   */
+  @TableField("channel_id")
+  private Long channelId;
+
+  /**
+   * 持卡人
+   */
+  @TableField("user_name")
+  private String userName;
+
+  /**
+   * 卡号
+   */
+  @TableField("card_no")
+  private String cardNo;
+
+  /**
+   * 银行卡所属银行
+   */
+  @TableField("bank_name")
+  private String bankName;
+
+  /**
+   * 开户行
+   */
+  @TableField("branch_name")
+  private String branchName;
+
+  /**
+   * 预留手机号码
+   */
+  @TableField("mobile")
+  private String mobile;
+
+  /**
+   * 1默认
+   */
+  @TableField("default_card")
+  private Integer defaultCard;
+
+  /**
+   * 添加时间
+   */
+  @TableField("create_time")
+  private Date createTime;
+
+  /**
+   * 修改时间
+   */
+  @TableField("update_time")
+  private Date updateTime;
+
+
+}

+ 116 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java

@@ -0,0 +1,116 @@
+package com.qs.mp.channel.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @describe 渠道提现表实体类
+ * @auther quanshu
+ * @create 2022-03-04 17:11:47
+ */
+@TableName("mp_channel_withdraw")
+@Data
+public class ChannelWithdraw implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  @TableId(value = "id" , type = IdType.AUTO)
+  private Long id;
+
+  /**
+   * 渠道id
+   */
+  @TableField("channel_id")
+  private Long channelId;
+
+  /**
+   * 提现金额
+   */
+  @TableField("money")
+  private Integer money;
+
+  /**
+   * 手续费
+   */
+  @TableField("charge_amt")
+  private Integer chargeAmt;
+
+  /**
+   * 当前可用资金
+   */
+  @TableField("log_money")
+  private Integer logMoney;
+
+  /**
+   * 支付类型 1支付宝,2微信,3银行卡
+   */
+  @TableField("pay_type")
+  private String payType;
+
+  /**
+   * 持卡人
+   */
+  @TableField("user_name")
+  private String userName;
+
+  /**
+   * 卡号
+   */
+  @TableField("card_no")
+  private String cardNo;
+
+  /**
+   * 银行卡所属银行
+   */
+  @TableField("bank_name")
+  private String bankName;
+
+  /**
+   * 开户行
+   */
+  @TableField("branch_name")
+  private String branchName;
+
+  /**
+   * 提现状态 1申请,2审核通过,3审核拒绝
+   */
+  @TableField("status")
+  private String status;
+
+  /**
+   * 转账凭证
+   */
+  @TableField("transfer_img")
+  private String transferImg;
+
+  /**
+   * 审核内容备注
+   */
+  @TableField("verify_content")
+  private String verifyContent;
+
+  /**
+   * 审核人用户名
+   */
+  @TableField("verifier")
+  private String verifier;
+
+  /**
+   * 创建时间
+   */
+  @TableField("create_time")
+  private Date createTime;
+
+  /**
+   * 修改时间
+   */
+  @TableField("update_time")
+  private Date updateTime;
+
+
+}

+ 40 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelWithdrawParam.java

@@ -0,0 +1,40 @@
+package com.qs.mp.channel.domain.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.Date;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @describe 渠道提现参数
+ * @auther zhongcp
+ * @create 2022-03-04 17:11:47
+ */
+@Data
+public class ChannelWithdrawParam {
+
+
+  @NotNull(message = "提现金额为空")
+  @ApiModelProperty(value = "提现金额",required=true)
+  private Integer money;
+
+  @NotNull(message = "持卡人不能为空")
+  @ApiModelProperty(value = "持卡人",required=true)
+  private String userName;
+
+  @NotNull(message = "卡号不能为空")
+  @ApiModelProperty(value = "卡号",required=true)
+  private String cardNo;
+
+  @ApiModelProperty(value = "银行名",required=false)
+  private String bankName;
+
+  @NotNull(message = "开户行不能为空")
+  @ApiModelProperty(value = "开户行",required=true)
+  private String branchName;
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelBankCardMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.mapper;
+
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-03-04 17:11:47
+ * @describe 渠道银行卡信息mapper类
+ */
+public interface ChannelBankCardMapper extends BaseMapper<ChannelBankCard> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelWithdrawMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.mapper;
+
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-03-04 17:11:47
+ * @describe 渠道提现表mapper类
+ */
+public interface ChannelWithdrawMapper extends BaseMapper<ChannelWithdraw> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelBankCardService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 渠道银行卡信息 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-04
+ */
+public interface IChannelBankCardService extends IService<ChannelBankCard> {
+
+}

+ 24 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelWithdrawService.java

@@ -0,0 +1,24 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 渠道提现表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-04
+ */
+public interface IChannelWithdrawService extends IService<ChannelWithdraw> {
+
+  /**
+   * 提现申请
+   * @param channel
+   * @param channelWithdraw
+   * @return
+   */
+  boolean apply(Channel channel, ChannelWithdraw channelWithdraw);
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelBankCardServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.service.impl;
+
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.qs.mp.channel.mapper.ChannelBankCardMapper;
+import com.qs.mp.channel.service.IChannelBankCardService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 渠道银行卡信息 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-04
+ */
+@Service
+public class ChannelBankCardServiceImpl extends ServiceImpl<ChannelBankCardMapper, ChannelBankCard> implements IChannelBankCardService {
+
+}

+ 64 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java

@@ -0,0 +1,64 @@
+package com.qs.mp.channel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.mapper.ChannelWithdrawMapper;
+import com.qs.mp.channel.service.IChannelBankCardService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * 渠道提现表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-04
+ */
+@Service
+public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMapper, ChannelWithdraw> implements IChannelWithdrawService {
+
+  @Autowired
+  private IChannelBankCardService channelBankCardService;
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Override
+  @Transactional
+  public boolean apply(Channel channel, ChannelWithdraw channelWithdraw) {
+    // 更新用户的银行卡信息
+    ChannelBankCard bankCard = channelBankCardService.getOne(new LambdaQueryWrapper<ChannelBankCard>()
+        .eq(ChannelBankCard::getChannelId, channel.getChannelId()));
+    if (null == bankCard) {
+      bankCard = new ChannelBankCard();
+      bankCard.setCardNo(channelWithdraw.getCardNo());
+      bankCard.setBankName(channelWithdraw.getBankName());
+      bankCard.setBranchName(channelWithdraw.getBranchName());
+      bankCard.setUserName(channelWithdraw.getUserName());
+      channelBankCardService.save(bankCard);
+    } else {
+      bankCard.setCardNo(channelWithdraw.getCardNo());
+      bankCard.setBankName(channelWithdraw.getBankName());
+      bankCard.setBranchName(channelWithdraw.getBranchName());
+      bankCard.setUserName(channelWithdraw.getUserName());
+      channelBankCardService.updateById(bankCard);
+    }
+
+    // 冻结账户余额,乐观锁
+    channelService.update(new LambdaUpdateWrapper<Channel>()
+        .set(Channel::getFrozenMoney, channel.getFrozenMoney() + channelWithdraw.getMoney())
+        .set(Channel::getMoney, channel.getMoney() - channelWithdraw.getMoney())
+        .eq(Channel::getChannelId, channel.getChannelId()).eq(Channel::getMoney, channel.getMoney()));
+
+    // 创建提现记录
+    return save(channelWithdraw);
+  }
+}

+ 24 - 0
mp-service/src/main/resources/mapper/channel/ChannelBankCardMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelBankCardMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelBankCard">
+        <id column="id" property="id" />
+        <result column="channel_id" property="channelId" />
+        <result column="user_name" property="userName" />
+        <result column="card_no" property="cardNo" />
+        <result column="bank_name" property="bankName" />
+        <result column="branch_name" property="branchName" />
+        <result column="mobile" property="mobile" />
+        <result column="default_card" property="defaultCard" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, channel_id, user_name, card_no, bank_name, branch_name, mobile, default_card, create_time, update_time
+    </sql>
+
+</mapper>

+ 30 - 0
mp-service/src/main/resources/mapper/channel/ChannelWithdrawMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelWithdrawMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelWithdraw">
+        <id column="id" property="id" />
+        <result column="channel_id" property="channelId" />
+        <result column="money" property="money" />
+        <result column="charge_amt" property="chargeAmt" />
+        <result column="log_money" property="logMoney" />
+        <result column="pay_type" property="payType" />
+        <result column="user_name" property="userName" />
+        <result column="card_no" property="cardNo" />
+        <result column="bank_name" property="bankName" />
+        <result column="branch_name" property="branchName" />
+        <result column="status" property="status" />
+        <result column="transfer_img" property="transferImg" />
+        <result column="verify_content" property="verifyContent" />
+        <result column="verifier" property="verifier" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, channel_id, money, charge_amt, log_money, pay_type, user_name, card_no, bank_name, branch_name, status, transfer_img, verify_content, verifier, create_time, update_time
+    </sql>
+
+</mapper>