提现策略改动

This commit is contained in:
谭凯凯
2025-01-09 18:35:58 +08:00
committed by Tankaikai
parent f06b217f97
commit b870e916f7
5 changed files with 55 additions and 198 deletions

View File

@@ -1,78 +0,0 @@
package com.sqx.modules.job.task;
import cn.hutool.core.util.StrUtil;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.entity.WithdrawTypeEnum;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.WuyouPay;
import com.sqx.modules.utils.AliPayOrderUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
@Component
public class CashOutTask {
@Resource
private CashOutDao cashOutDao;
@Resource
private UserMoneyService userMoneyService;
@Resource
private UserMoneyDetailsService userMoneyDetailsService;
@Resource
private WuyouPay wuyouPay;
private Logger logger = LoggerFactory.getLogger(getClass());
public void run(String params) {
logger.info("提现开始");
List<CashOut> cashOuts = cashOutDao.selectYesterday();
for (CashOut cashOut : cashOuts) {
if (wuyouPay.checkCanCash(cashOut.getUserId(), WithdrawTypeEnum.RED_ENVELOPE, new BigDecimal(cashOut.getMoney()))) {
cashOut.setState(4);
String outOrderNo = AliPayOrderUtil.createOrderId();
cashOut.setOrderNumber(outOrderNo);
boolean isUser = cashOut.getUserType() != 2;
boolean isHistoryData = StrUtil.isEmpty(cashOut.getBankName());
BaseResp baseResp = wuyouPay.extractOrderExt(isHistoryData, false, outOrderNo, cashOut.getUserId(), isUser, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName(), cashOut.getBankName());
if (baseResp.getStatus() != null && baseResp.getStatus().equals(2)) {
cashOut.setState(1);
} else {
cashOut.setState(2);
cashOut.setRefund(StringUtils.isNotBlank(baseResp.getMsg()) ? baseResp.getMsg() : baseResp.getErrorMsg());
if (cashOut.getRefund().contains("收款人账户号出款属性不匹配") || cashOut.getRefund().contains("已驳回")) {
cashOut.setRefund("提现失败,请检查收款账号与收款人姓名后重试。");
} else {
cashOut.setRefund(baseResp.getErrorMsg());
}
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
cashOut.getUserId(), null, null, "提现失败", 4, 1, 1,
new BigDecimal(cashOut.getMoney()), "提现失败存入余额" + cashOut.getMoney() + "", 1, cashOut.getId());
//存入余额 钱
userMoneyService.updateAmount(1, cashOut.getUserId(), Double.parseDouble(cashOut.getMoney()));
userMoneyDetailsService.save(userMoneyDetails);
}
} else {
cashOut.setState(3);
}
cashOutDao.updateById(cashOut);
}
logger.info("提现结束");
}
public void test(String name, String age) {
logger.info("name: {}, age: {}", name, age);
}
}

View File

@@ -1,93 +0,0 @@
package com.sqx.modules.job.task;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.entity.WithdrawTypeEnum;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.WuyouPay;
import com.sqx.modules.utils.AliPayOrderUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
@Component
public class CashOutTask2 {
@Resource
private CashOutDao cashOutDao;
@Resource
private UserMoneyService userMoneyService;
@Resource
private UserMoneyDetailsService userMoneyDetailsService;
@Resource
private WuyouPay wuyouPay;
private Logger logger = LoggerFactory.getLogger(getClass());
public void run(String params) {
logger.info("提现开始");
if (StringUtils.isBlank(params) || isValidDate(params)) {
params = DateUtil.today();
}
List<CashOut> cashOuts = cashOutDao.selectList(new QueryWrapper<CashOut>()
.eq("state", 0)
.gt("create_at", params + " 00:00:00")
.lt("create_at", params + " 23:59:59"));
System.out.println(cashOuts.size());
for (CashOut cashOut : cashOuts) {
if (wuyouPay.checkCanCash(cashOut.getUserId(), WithdrawTypeEnum.RED_ENVELOPE, new BigDecimal(cashOut.getMoney()))) {
cashOut.setState(4);
String outOrderNo = AliPayOrderUtil.createOrderId();
cashOut.setOrderNumber(outOrderNo);
boolean isUser = cashOut.getUserType() != 2;
boolean isHistoryData = StrUtil.isEmpty(cashOut.getBankName());
BaseResp baseResp = wuyouPay.extractOrderExt(isHistoryData, false, outOrderNo, cashOut.getUserId(), isUser, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName(), cashOut.getBankName());
if (baseResp.getStatus() != null && baseResp.getStatus().equals(2)) {
cashOut.setState(1);
} else {
cashOut.setState(2);
cashOut.setRefund(StringUtils.isNotBlank(baseResp.getMsg()) ? baseResp.getMsg() : baseResp.getErrorMsg());
if (cashOut.getRefund().contains("收款人账户号出款属性不匹配") || cashOut.getRefund().contains("已驳回")) {
cashOut.setRefund("提现失败,请检查收款账号与收款人姓名后重试。");
} else {
cashOut.setRefund(baseResp.getErrorMsg());
}
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
cashOut.getUserId(), null, null, "提现失败", 4, 1, 1,
new BigDecimal(cashOut.getMoney()), "提现失败存入余额" + cashOut.getMoney() + "", 1, cashOut.getId());
//存入余额 钱
userMoneyService.updateAmount(1, cashOut.getUserId(), Double.parseDouble(cashOut.getMoney()));
userMoneyDetailsService.save(userMoneyDetails);
}
} else {
cashOut.setState(3);
}
cashOutDao.updateById(cashOut);
}
logger.info("提现结束");
}
public static boolean isValidDate(String dateString) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
sdf.parse(dateString);
return true;
} catch (Exception e) {
return false;
}
}
}

View File

@@ -110,14 +110,6 @@ public class AppCashController {
if (!in) {
return Result.error(StrUtil.format("提现时间为每天{}", info.getValue()));
}
double money = Double.parseDouble(commonInfoService.findOne(929).getValue());
Double v = cashOutService.queryUserTodayCashAmount(userId);
if (v == null) {
v = 0.0d;
}
if ((v + amount) >= money) {
return Result.error("今日提现金额已达上限");
}
Result ret = Result.error();
try {
ret = cashOutService.withdraw(userId, amount, null, false);

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
@@ -510,7 +511,7 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public Result withdraw(Long userId, Double money, String msg, boolean isSys) {
if (money == null || money <= 0.00) {
return Result.error("请不要输入小于0的数字,请输入正确的提现金额!");
@@ -604,7 +605,8 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
if (sysUserMoney.getMoney().doubleValue() < money) {
return Result.success("可提现余额不足!");
}
if (wuyouPay.checkCanCash(userId, WithdrawTypeEnum.MANUAL, new BigDecimal(money.toString()))) {
try {
wuyouPay.checkCanCash(userId, WithdrawTypeEnum.MANUAL, new BigDecimal(money.toString()));
cashOut.setStatus(4);
BaseResp baseResp = wuyouPay.extractOrder(outOrderNo, cashOut.getUserId(), false, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName(), cashOut.getBankName());
if (baseResp.getStatus() != null && (baseResp.getStatus().equals(2) || baseResp.getStatus().equals(10000))) {
@@ -612,15 +614,16 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
cashOut.setState(1);
cashOut.setOutAt(DateUtil.date().toString());
}
if (baseResp.getErrorMsg() != null) {
return Result.error(baseResp.getErrorMsg());
}
} else {
}catch (SqxException e){
return Result.error(e.getMsg());
}catch (ValidateException v){
sysUserMoneyDetails.setContent("提现:" + money);
cashOut.setState(3);
cashOut.setRelationId(v.getMessage());
}
sysUserMoneyDetailsService.save(sysUserMoneyDetails);
baseMapper.insert(cashOut);
sysUserMoneyService.updateSysMoney(2, userId, money);
@@ -648,7 +651,7 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
cashOut.setState(3);
cashOut.setRelationId("提现黑名单用户,请谨慎审核!");
} else {
if (wuyouPay.checkCanCash(userId, WithdrawTypeEnum.MANUAL, new BigDecimal(money.toString()))) {
try {
cashOut.setStatus(4);
BaseResp baseResp = wuyouPay.extractOrder(outOrderNo, cashOut.getUserId(), true, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName(), cashOut.getBankName());
if (baseResp.getStatus() != null && (baseResp.getStatus().equals(2) || baseResp.getStatus().equals(10000))) {
@@ -656,13 +659,15 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
cashOut.setState(1);
cashOut.setOutAt(DateUtil.date().toString());
}
if (baseResp.getErrorMsg() != null) {
return Result.error(baseResp.getErrorMsg());
}
} else {
}catch (SqxException e){
return Result.error(e.getMsg());
}catch (ValidateException v){
userMoneyDetails.setContent("提现:" + money);
cashOut.setState(3);
cashOut.setRelationId(v.getMessage());
}
}
userMoneyDetailsService.save(userMoneyDetails);

View File

@@ -1,13 +1,16 @@
package com.sqx.modules.pay.wuyou;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.sqx.common.exception.SqxException;
import com.sqx.modules.common.entity.CommonInfo;
import com.sqx.modules.common.service.CommonInfoService;
import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.entity.WithdrawTypeEnum;
import com.sqx.modules.pay.service.CashOutService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -32,13 +35,15 @@ public class WuyouPay {
private final CashOutDao cashOutDao;
private final CommonInfoService commonInfoService;
private final CashOutService cashOutService;
private static final Logger logger = LoggerFactory.getLogger(WuyouPay.class);
public WuyouPay(CashOutDao cashOutDao, CommonInfoService commonInfoService) {
public WuyouPay(CashOutDao cashOutDao, CommonInfoService commonInfoService, CashOutService cashOutService) {
this.cashOutDao = cashOutDao;
this.commonInfoService = commonInfoService;
this.cashOutService = cashOutService;
}
public BaseResp payOrder(String orderNo, Long userId, String amount, String userAgent, String allId, String payType) {
@@ -92,34 +97,60 @@ public class WuyouPay {
return JSONObject.parseObject(body, BaseResp.class);
}
public boolean checkCanCash(long userId, WithdrawTypeEnum type, BigDecimal money) {
public void checkCanCash(long userId, WithdrawTypeEnum type, BigDecimal money) {
if (WithdrawTypeEnum.MANUAL.equals(type)) {
// 查询当日体现次数
Integer successCashCount = cashOutDao.selectTodayCashCount(userId, 1, DateUtil.today() + " 00:00:00");
CommonInfo cashLimit = commonInfoService.findOne(922);
if (cashLimit == null || StrUtil.isBlank(cashLimit.getValue())) {
logger.warn("提现必要参数未配置,请联系管理员");
return false;
throw new ValidateException("【922】每日体现次数上限未配置");
}
if (successCashCount >= Integer.parseInt(cashLimit.getValue())) {
logger.warn("体现次数超限,当前限制{}次, 已经体现{}次", cashLimit.getValue(), successCashCount);
return false;
throw new SqxException(StrUtil.format("超过当日提现限制次数{}次,请明天再试!", cashLimit.getValue()));
}
return checkCanCashByLimit(money);
checkCanCashByLimit(money);
todayTotalLimit(userId, money.doubleValue());
}
return true;
}
public boolean checkCanCashByLimit(BigDecimal money) {
public void checkCanCashByLimit(BigDecimal money) {
CommonInfo info = commonInfoService.findOne(923);
if (info == null || StrUtil.isBlank(info.getValue())) {
logger.warn("未配置提现限制,请联系管理员配置");
return false;
throw new ValidateException("【923】单次提现超额未配置");
}
return money.compareTo(new BigDecimal(info.getValue())) <= 0;
boolean ret = money.compareTo(new BigDecimal(info.getValue())) <= 0;
if(!ret){
throw new ValidateException("单次提现超额");
}
}
/**
* 当日累计提现超过设定值时,需要人工审核
*
* @param userId
* @param amount
* @return
*/
public void todayTotalLimit(long userId, double amount) {
CommonInfo info = commonInfoService.findOne(929);
if (info == null || StrUtil.isBlank(info.getValue())) {
logger.warn("未配置提现限制,请联系管理员配置");
throw new ValidateException("【929】当日累计提现额未配置");
}
double money = Double.parseDouble(commonInfoService.findOne(929).getValue());
Double v = cashOutService.queryUserTodayCashAmount(userId);
if (v == null) {
v = 0.0d;
}
if ((v + amount) >= money) {
logger.warn("当日累计提现超过设定值时,当日累计提现金额:¥{}, 提现金额:¥{},设定值:¥{}", (v + amount), amount, money);
throw new ValidateException("当日累计提现超额");
}
}
/**
@@ -241,7 +272,7 @@ public class WuyouPay {
}
public static void main(String[] args) {
WuyouPay pay = new WuyouPay(null, null);
WuyouPay pay = new WuyouPay(null, null, null);
Map<String, Object> params = pay.getBaseParams();