package com.yami.trading.api.controller;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.yami.trading.bean.ico.domain.Ico;
|
import com.yami.trading.bean.ico.domain.UserSubscription;
|
import com.yami.trading.bean.item.query.ItemQuery;
|
import com.yami.trading.common.domain.Result;
|
import com.yami.trading.common.exception.YamiShopBindException;
|
import com.yami.trading.common.query.QueryWrapperGenerator;
|
import com.yami.trading.security.common.util.SecurityUtils;
|
import com.yami.trading.service.ico.IcoService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.redisson.api.RLock;
|
import org.redisson.api.RedissonClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.validation.Valid;
|
import java.util.concurrent.TimeUnit;
|
|
@RestController
|
@RequestMapping("api/ico")
|
@Api(tags = "新币申购")
|
@Slf4j
|
public class ApiIcoController {
|
|
@Autowired
|
IcoService icoService;
|
|
@Autowired
|
private RedissonClient redissonClient;
|
|
@ApiOperation(value = "新币列表,配置列表")
|
@GetMapping("list")
|
public Result<Page<Ico>> list(ItemQuery itemQuery, Page<Ico> page) throws Exception {
|
QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (itemQuery, ItemQuery.class);
|
Page<Ico> result = icoService.page(page, queryWrapper);
|
return Result.ok(result);
|
}
|
|
@ApiOperation(value = "新币申购")
|
@PostMapping("subscribe")
|
@ResponseBody
|
public Result<String> subscribe(@Valid UserSubscription model) {
|
String partyId = SecurityUtils.getUser().getUserId();
|
if (StringUtils.isEmpty(partyId)) {
|
throw new YamiShopBindException("请重新登录");
|
}
|
RLock rLock = redissonClient.getLock("subscribe" + partyId);
|
boolean lockAcquired = false;
|
try {
|
// 尝试获取锁,最多等待5秒
|
lockAcquired = rLock.tryLock(5, TimeUnit.SECONDS);
|
if (!lockAcquired) {
|
log.warn("无法获取锁: subscribe{}", partyId);
|
throw new YamiShopBindException("请稍后再试");
|
}
|
model.setUserId(partyId);
|
icoService.subscribe(model);
|
} catch (YamiShopBindException e) {
|
log.error("错误信息: {}", e.getMessage(), e);
|
throw e; // 重新抛出自定义异常
|
} catch (Exception e) {
|
log.error("系统异常: {}", e.getMessage(), e);
|
throw new YamiShopBindException("操作失败,请稍后再试");
|
} finally {
|
// 确保释放锁
|
if (lockAcquired && rLock.isHeldByCurrentThread()) {
|
rLock.unlock();
|
}
|
}
|
return Result.succeed(null, "ok");
|
}
|
|
}
|