This commit is contained in:
2024-12-09 14:51:10 +08:00
parent 9696e6e9de
commit 318d252a32
7 changed files with 219 additions and 28 deletions

View File

@@ -4,6 +4,7 @@ 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.annotation.Debounce;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
@@ -42,6 +43,7 @@ import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
@@ -59,9 +61,6 @@ public class DiscSpinningController {
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,
@@ -196,29 +195,23 @@ public class DiscSpinningController {
draws(amount, orderId, userId, maps == null || maps.get("source") == null ? "order" : maps.get("source").toString()));
}
@PostMapping("/app/discSpinning/receive")
@ApiOperation("大转盘奖项领取")
@Debounce(interval = 3000, value = "#receive.id")
@PostMapping("/app/discSpinning/receive")
public Result receive(@RequestBody DiscSpinningRecord receive) {
// 每秒允许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("操作过于频繁,请稍后再试");
DiscSpinningRecord record = recordService.getById(receive.getId());
CompletableFuture.runAsync(() -> {
receiveAsync(record);
});
return Result.success();
}
@Transactional
public void receiveAsync(DiscSpinningRecord receive) {
UserEntity userInfo = userService.queryByUserId(receive.getUserId());
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
receive.getUserId(),null,null,"[现金大转盘]",5,1,2,
receive.getNumber(),"现金红包奖励" + receive.getNumber() + "");
receive.getUserId(), null, null, "[现金大转盘]", 5, 1, 2,
receive.getNumber(), "现金红包奖励" + receive.getNumber() + "");
userMoneyDetailsService.save(userMoneyDetails);
receive.setTarget("2");
receive.setTargetId(userMoneyDetails.getId());
@@ -247,8 +240,8 @@ public class DiscSpinningController {
cashOut.setCreateAt(DateUtil.now());
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
userInfo.getUserId(),null,null,"[现金大转盘]",4,2,1,
new BigDecimal(money),"现金红包自动提现" + money + "");
userInfo.getUserId(), null, null, "[现金大转盘]", 4, 2, 1,
new BigDecimal(money), "现金红包自动提现" + money + "");
userMoneyDetailsService.save(userMoneyDetails);
//减去余额 钱
userMoneyService.updateAmount(2, userInfo.getUserId(), money);