大转盘 领取奖励修改

提现 修改
任务中心 记录 领取记录 是否可领取
This commit is contained in:
2024-12-09 11:05:08 +08:00
parent 02dd3b4587
commit 03526f7c4a
16 changed files with 311 additions and 125 deletions

View File

@@ -1,7 +1,9 @@
package com.sqx.modules.discSpinning.controller;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.util.concurrent.RateLimiter;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
@@ -23,6 +25,7 @@ import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.service.CashOutService;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.WuyouPay;
import com.sqx.modules.taskCenter.service.TaskCenterService;
import com.sqx.modules.utils.AliPayOrderUtil;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
@@ -38,6 +41,7 @@ import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@RestController
@@ -53,11 +57,19 @@ public class DiscSpinningController {
private final UserMoneyDetailsService userMoneyDetailsService;
private final UserService userService;
private final CashOutService cashOutService;
private final TaskCenterService taskCenterService;
// 以id为键对应的RateLimiter实例为值用于不同id的防抖控制
private static final ConcurrentHashMap<Long, RateLimiter> rateLimiterMap = new ConcurrentHashMap<>();
@Autowired
public DiscSpinningController(CommonInfoService commonRepository, DiscSpinningService discSpinningService,
UserMoneyDetailsService userMoneyDetailsService, CashOutService cashOutService,
OrdersService ordersService, DiscSpinningRecordService recordService, UserMoneyService userMoneyService, UserService userService) {
OrdersService ordersService, DiscSpinningRecordService recordService,
UserMoneyService userMoneyService, UserService userService,
TaskCenterService taskCenterService
) {
this.commonRepository = commonRepository;
this.discSpinningService = discSpinningService;
this.ordersService = ordersService;
@@ -66,6 +78,7 @@ public class DiscSpinningController {
this.userMoneyDetailsService = userMoneyDetailsService;
this.userService = userService;
this.cashOutService = cashOutService;
this.taskCenterService = taskCenterService;
}
@@ -144,7 +157,7 @@ public class DiscSpinningController {
map.put("sum", drawCount);
if (maps != null && maps.containsKey("source") && "task".equals(maps.get("source"))) {
//任务可抽奖次数
map.put("count", taskCenterService.countTaskDisc(userId));
} else {
int i = recordService.countDraw(userId);
if (drawCount - i > 0) {
@@ -186,87 +199,74 @@ public class DiscSpinningController {
@PostMapping("/app/discSpinning/receive")
@ApiOperation("大转盘奖项领取")
public Result receive(@RequestBody DiscSpinningRecord receive) {
CompletableFuture.runAsync(() -> {
receiveAsync(receive);
});
return Result.success();
// 每秒允许0.6次操作
RateLimiter rateLimiter = rateLimiterMap.computeIfAbsent(receive.getId(), k -> RateLimiter.create(0.6));
if (rateLimiter.tryAcquire()) {
CompletableFuture.runAsync(() -> {
DiscSpinningRecord record = recordService.getById(receive.getId());
CompletableFuture.runAsync(() -> {
receiveAsync(record);
});
});
return Result.success();
}
return Result.error("操作过于频繁,请稍后再试");
}
@Transactional
public void receiveAsync(DiscSpinningRecord receive) {
UserEntity userInfo = userService.queryByUserId(receive.getUserId());
if (receive.getNumber().compareTo(new BigDecimal("0.1")) > 0 && StringUtils.isNotBlank(userInfo.getZhiFuBao()) && StringUtils.isNotBlank(userInfo.getZhiFuBaoName())) {
receive.setTarget("1");
//提现
String result = withdraw(receive, receive.getUserId(), receive.getNumber().doubleValue());
recordService.updateById(receive);
if (StringUtils.isBlank(result)) {
// return Result.success();
return;
}
if ("提现成功,将在三个工作日内到账,请耐心等待!".equals(result)) {
// return Result.success(result);
return;
}
}
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setClassify(5);
userMoneyDetails.setMoney(receive.getNumber());
userMoneyDetails.setUserId(receive.getUserId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date()));
userMoneyDetails.setContent("现金红包奖励" + receive.getNumber() + "");
userMoneyDetails.setTitle("[现金大转盘]");
userMoneyDetails.setState(2);
userMoneyDetails.setType(1);
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
receive.getUserId(),null,null,"[现金大转盘]",5,1,2,
receive.getNumber(),"现金红包奖励" + receive.getNumber() + "");
userMoneyDetailsService.save(userMoneyDetails);
receive.setTarget("2");
receive.setTargetId(userMoneyDetails.getId());
recordService.updateById(receive);
//存入余额 钱
userMoneyService.updateAmount(1, receive.getUserId(), receive.getNumber().doubleValue());
receive.setTarget("2");
userMoneyDetailsService.save(userMoneyDetails);
receive.setTargetId(userMoneyDetails.getId());
recordService.updateById(receive);
if (receive.getNumber().compareTo(new BigDecimal("0.1")) > 0 && StringUtils.isNotBlank(userInfo.getZhiFuBao()) && StringUtils.isNotBlank(userInfo.getZhiFuBaoName())) {
//提现
withdraw(userInfo, receive.getNumber().doubleValue());
}
}
@Transactional
public String withdraw(DiscSpinningRecord record, Long userId, Double money) {
UserEntity userInfo = userService.queryByUserId(userId);
//最高提现金额
CommonInfo one2 = commonRepository.findOne(910);
public void withdraw(UserEntity userInfo, Double money) {
CashOut cashOut = new CashOut();
cashOut.setIsOut(false);
cashOut.setMoney(money.toString());
cashOut.setUserId(userInfo.getUserId());
cashOut.setZhifubao(userInfo.getZhiFuBao());
cashOut.setZhifubaoName(userInfo.getZhiFuBaoName());
cashOut.setState(0);
cashOut.setRate(0.00);
cashOut.setUserType(1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
cashOut.setCreateAt(date);
if (one2 != null && money >= Double.parseDouble(one2.getValue())) {
cashOutService.saveBody(cashOut);
return "提现成功,将在三个工作日内到账,请耐心等待!";
}
cashOut.setCreateAt(DateUtil.now());
String outOrderNo = AliPayOrderUtil.createOrderId();
cashOut.setOrderNumber(outOrderNo);
BaseResp baseResp = WuyouPay.extractOrder(outOrderNo, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName());
if (baseResp.getStatus() != null && baseResp.getStatus().equals(2)) {
cashOut.setState(1);
} else if (StringUtils.isNotBlank(baseResp.getErrorMsg())) {
return baseResp.getErrorMsg();
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
userInfo.getUserId(),null,null,"[现金大转盘]",4,2,1,
new BigDecimal(money),"现金红包自动提现" + money + "");
userMoneyDetailsService.save(userMoneyDetails);
//减去余额 钱
userMoneyService.updateAmount(2, userInfo.getUserId(), money);
//最高提现金额
CommonInfo one2 = commonRepository.findOne(910);
if (one2 == null || money <= Double.parseDouble(one2.getValue())) {
String outOrderNo = AliPayOrderUtil.createOrderId();
cashOut.setOrderNumber(outOrderNo);
BaseResp baseResp = WuyouPay.extractOrder(outOrderNo, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName());
if (baseResp.getStatus() != null && baseResp.getStatus().equals(2)) {
cashOut.setState(1);
} else if (StringUtils.isNotBlank(baseResp.getErrorMsg())) {
cashOut.setState(2);
cashOut.setRefund(baseResp.getErrorMsg());
}
}
cashOutService.saveBody(cashOut);
record.setTargetId(cashOut.getId());
return "";
}
@Transactional