From b870e916f7fe86a9b7b49422af61af0c43c16b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Thu, 9 Jan 2025 18:35:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E7=8E=B0=E7=AD=96=E7=95=A5=E6=94=B9?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sqx/modules/job/task/CashOutTask.java | 78 ---------------- .../sqx/modules/job/task/CashOutTask2.java | 93 ------------------- .../pay/controller/app/AppCashController.java | 8 -- .../pay/service/impl/CashOutServiceImpl.java | 21 +++-- .../com/sqx/modules/pay/wuyou/WuyouPay.java | 53 ++++++++--- 5 files changed, 55 insertions(+), 198 deletions(-) delete mode 100644 src/main/java/com/sqx/modules/job/task/CashOutTask.java delete mode 100644 src/main/java/com/sqx/modules/job/task/CashOutTask2.java diff --git a/src/main/java/com/sqx/modules/job/task/CashOutTask.java b/src/main/java/com/sqx/modules/job/task/CashOutTask.java deleted file mode 100644 index 73398c7a..00000000 --- a/src/main/java/com/sqx/modules/job/task/CashOutTask.java +++ /dev/null @@ -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 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); - } -} diff --git a/src/main/java/com/sqx/modules/job/task/CashOutTask2.java b/src/main/java/com/sqx/modules/job/task/CashOutTask2.java deleted file mode 100644 index 34d91db6..00000000 --- a/src/main/java/com/sqx/modules/job/task/CashOutTask2.java +++ /dev/null @@ -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 cashOuts = cashOutDao.selectList(new QueryWrapper() - .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; - } - } -} diff --git a/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java b/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java index 72b91702..47b4fd77 100644 --- a/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java +++ b/src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java @@ -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); diff --git a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java index daeb20fe..92f61baa 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java @@ -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 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 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 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 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 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); diff --git a/src/main/java/com/sqx/modules/pay/wuyou/WuyouPay.java b/src/main/java/com/sqx/modules/pay/wuyou/WuyouPay.java index ccde6ce8..786d8109 100644 --- a/src/main/java/com/sqx/modules/pay/wuyou/WuyouPay.java +++ b/src/main/java/com/sqx/modules/pay/wuyou/WuyouPay.java @@ -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 params = pay.getBaseParams();