소스 검색

提现申请

chunping 3 년 전
부모
커밋
f9acc14405

+ 21 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelMoneyController.java

@@ -12,13 +12,18 @@ package com.qs.mp.web.controller.api.channel;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.channel.domain.ChannelMoneyLog;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.vo.ChannelMoneyLogVO;
 import com.qs.mp.channel.service.IChannelMoneyLogService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelMoneyEnum;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import java.util.List;
 import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -36,6 +41,12 @@ public class ChannelMoneyController extends BaseApiController {
   @Autowired
   private IChannelMoneyLogService channelMoneyLogService;
 
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
   @RequestMapping(value = "/money/log", method = RequestMethod.POST)
   @ResponseBody
   public TableDataInfo listMoneyLog(@RequestBody ChannelMoneyLog channelMoneyLog) {
@@ -45,6 +56,15 @@ public class ChannelMoneyController extends BaseApiController {
     queryWrapper.lambda().orderByDesc(ChannelMoneyLog::getBizTime);
     startPage();
     List<ChannelMoneyLog> list = channelMoneyLogService.list(queryWrapper);
-    return getDataTable(list);
+    List<ChannelMoneyLogVO> channelMoneyLogVOS = mapperFacade.mapAsList(list, ChannelMoneyLogVO.class);
+    for (ChannelMoneyLogVO logVO : channelMoneyLogVOS) {
+      if (logVO.getType() == ChannelMoneyEnum.WITHDRAW) {
+        ChannelWithdraw channelWithdraw = channelWithdrawService.getById(logVO.getRefId());
+        logVO.setMemo(channelWithdraw.getStatus().getDesc());
+      }
+    }
+    TableDataInfo resp = getDataTable(list);
+    resp.setRows(channelMoneyLogVOS);
+    return resp;
   }
 }

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

@@ -88,12 +88,23 @@ public class ChannelWithdrawController extends BaseApiController {
   @ApiOperation(value = "提现" , notes = "提现计费")
   public AjaxResult settle(@Valid @RequestBody ChannelWithdrawParam param) {
     String feeRateValue = configService.selectConfigByKey(FEE_RATE_CONFIG_KEY);
-    BigDecimal feeRate = new BigDecimal(StringUtils.isNotBlank(feeRateValue) ? feeRateValue : FEE_RATE_DEFAULT_VALUE);
+    BigDecimal feeRate = new BigDecimal(
+        StringUtils.isNotBlank(feeRateValue) ? feeRateValue : FEE_RATE_DEFAULT_VALUE);
     Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Channel channel = channelService.getById(channelId);
+    if (channel.getMoney() < 50000) {
+      return AjaxResult.error("账户余额不足500元");
+    }
+    int feeAmt = new BigDecimal(param.getMoney()).multiply(feeRate)
+        .divide(new BigDecimal(100), 0, RoundingMode.HALF_UP).intValue();
     ChannelWithdraw channelWithdraw = new ChannelWithdraw();
-    channelWithdraw.setMoney(param.getMoney());
-    BigDecimal feeAmt = new BigDecimal(param.getMoney()).multiply(feeRate).divide(new BigDecimal(100), 2, RoundingMode.DOWN);
-    channelWithdraw.setChargeAmt(feeAmt.intValue());
+    if (param.getMoney() + feeAmt > channel.getMoney()) {
+      channelWithdraw.setMoney(new BigDecimal(channel.getMoney()).divide(new BigDecimal(1).add(feeRate.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP)), 0, RoundingMode.HALF_UP).intValue());
+      channelWithdraw.setChargeAmt(channel.getMoney() - channelWithdraw.getMoney());
+    } else {
+      channelWithdraw.setMoney(param.getMoney());
+      channelWithdraw.setChargeAmt(feeAmt);
+  }
     channelWithdraw.setUserName(param.getUserName());
     channelWithdraw.setCardNo(param.getCardNo());
     channelWithdraw.setBranchName(param.getBranchName());
@@ -119,12 +130,12 @@ public class ChannelWithdrawController extends BaseApiController {
       return AjaxResult.error("申请已过期,请重新提交");
     }
     Channel channel = channelService.getById(channelId);
-    if (channelWithdraw.getMoney() > channel.getMoney() ) {
+    if (channelWithdraw.getMoney() + channelWithdraw.getChargeAmt() > channel.getMoney() ) {
       return AjaxResult.error("提现金额超出账户余额");
     }
 
     channelWithdraw.setChannelId(channelId);
-    channelWithdraw.setLogMoney(channel.getMoney());
+    channelWithdraw.setAvailableMoney(channel.getMoney());
 
     channelWithdrawService.apply(channel, channelWithdraw);
 

+ 54 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java

@@ -0,0 +1,54 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelWithdrawStatusEnum implements IEnum<Integer> {
+
+  WITHDRAWING(1, "提现中"),
+  FINISHED(2, "已完成"),
+  FAILED(3, "提现失败");
+
+
+  private final int value;
+  private final String desc;
+
+  ChannelWithdrawStatusEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  public static ChannelWithdrawStatusEnum getChannelMoneyTypeEnum(int value) {
+    for (ChannelWithdrawStatusEnum channelMoneyTypeEnum : ChannelWithdrawStatusEnum.values()) {
+      if (channelMoneyTypeEnum.getValue() == value) {
+        return channelMoneyTypeEnum;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  public String getDesc() {
+    return desc;
+  }
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 7 - 3
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java

@@ -1,9 +1,12 @@
 package com.qs.mp.channel.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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 com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -43,8 +46,8 @@ public class ChannelWithdraw implements Serializable {
   /**
    * 当前可用资金
    */
-  @TableField("log_money")
-  private Integer logMoney;
+  @TableField("available_money")
+  private Integer availableMoney;
 
   /**
    * 支付类型 1支付宝,2微信,3银行卡
@@ -80,7 +83,8 @@ public class ChannelWithdraw implements Serializable {
    * 提现状态 1申请,2审核通过,3审核拒绝
    */
   @TableField("status")
-  private String status;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private ChannelWithdrawStatusEnum status;
 
   /**
    * 转账凭证

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMoneyLogVO.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.qs.mp.channel.domain.ChannelMoneyLog;
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/18
+ */
+@Data
+public class ChannelMoneyLogVO extends ChannelMoneyLog {
+  private String memo;
+}

+ 2 - 5
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java

@@ -41,6 +41,7 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
   @Override
   @Transactional
   public boolean apply(Channel channel, ChannelWithdraw channelWithdraw) {
+
     // 更新用户的银行卡信息
     ChannelBankCard bankCard = channelBankCardService.getOne(new LambdaQueryWrapper<ChannelBankCard>()
         .eq(ChannelBankCard::getChannelId, channel.getChannelId()));
@@ -60,11 +61,6 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
       channelBankCardService.updateById(bankCard);
     }
     boolean rst = save(channelWithdraw);
-    // 冻结账户余额,乐观锁
-    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()));
 
     ChannelMoneyLog moneyLog = new ChannelMoneyLog();
     moneyLog.setChannelId(channel.getChannelId());
@@ -72,6 +68,7 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
     moneyLog.setLogMoney(channelWithdraw.getMoney());
     moneyLog.setBizTime(new Date());
     moneyLog.setRefId(String.valueOf(channelWithdraw.getId()));
+    moneyLog.setLogText("银行卡尾号 " + channelWithdraw.getCardNo().substring(channelWithdraw.getCardNo().length() - 4));
     channelMoneyLogService.changeMoney(moneyLog);
 
     if (channelWithdraw.getChargeAmt() > 0) {

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

@@ -8,7 +8,7 @@
         <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="available_money" property="availableMoney" />
         <result column="pay_type" property="payType" />
         <result column="user_name" property="userName" />
         <result column="card_no" property="cardNo" />
@@ -24,7 +24,7 @@
 
     <!-- 通用查询结果列 -->
     <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
+        id, channel_id, money, charge_amt, available_money, pay_type, user_name, card_no, bank_name, branch_name, status, transfer_img, verify_content, verifier, create_time, update_time
     </sql>
 
 </mapper>