|
@@ -3,6 +3,7 @@ package com.xs.core.service.Impl.coin;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.xs.core.common.constant.GoldCoinConstant;
|
|
|
import com.xs.core.common.content.UserContext;
|
|
|
import com.xs.core.common.content.UserContextHolder;
|
|
@@ -10,11 +11,9 @@ import com.xs.core.common.enums.CoinTransactionCategoryEnum;
|
|
|
import com.xs.core.common.enums.CoinTransactionTypeEnum;
|
|
|
import com.xs.core.common.validation.CheckUtils;
|
|
|
import com.xs.core.model.coin.dto.GoldRateUpgradesState;
|
|
|
-import com.xs.core.model.coin.entity.CoinSpeedUpgradesRules;
|
|
|
-import com.xs.core.model.coin.entity.GoldCoinProdRecord;
|
|
|
+import com.xs.core.model.coin.entity.*;
|
|
|
import com.xs.core.model.coin.msg.CoinProducerMessage;
|
|
|
-import com.xs.core.model.coin.entity.GoldCoinProdState;
|
|
|
-import com.xs.core.model.coin.entity.UserCoinSpeedUpgradesRecord;
|
|
|
+import com.xs.core.model.coin.msg.TeamShareMessage;
|
|
|
import com.xs.core.model.coin.req.CoinSpeedUpgradesRulesReq;
|
|
|
import com.xs.core.model.coin.req.TemporaryRateReq;
|
|
|
import com.xs.core.model.coin.resp.BoostResidueTimesResp;
|
|
@@ -36,6 +35,7 @@ import java.math.RoundingMode;
|
|
|
import java.time.Instant;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
|
|
|
@Service
|
|
|
@Slf4j
|
|
@@ -61,6 +61,9 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
@Autowired
|
|
|
private ICoinSpeedUpgradesRulesService speedRulesService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IBoostTemporaryRateRecordService boostTemporaryRateRecordService;
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void startProductGoldCoin() {
|
|
@@ -83,13 +86,15 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
//4、发送延时循环计算的消息
|
|
|
CoinProducerMessage message = new CoinProducerMessage();
|
|
|
BeanUtils.copyProperties(goldCoinProdState, message);
|
|
|
+ //生成唯一的消息id
|
|
|
+ message.setMsgId(IdWorker.getIdStr());
|
|
|
messageProducer.sendDelayCalculationMessage(message);
|
|
|
}
|
|
|
|
|
|
private void checkProductState(GoldCoinProdState goldCoinProdState, UserContext userContext) {
|
|
|
CheckUtils.throwIf(Boolean.TRUE.equals(goldCoinProdState.getRunning()), "金币产出中,不能重复开启");
|
|
|
//若是非运行状态 则检查待领取的金币
|
|
|
- GoldCoinProdRecord record = recordService.getNoReciviedGoldCoinProdRecordByUserId(userContext.getId());
|
|
|
+ GoldCoinProdRecord record = recordService.getNoReceivedGoldCoinProdRecordByUserId(userContext.getId());
|
|
|
CheckUtils.throwIf(ObjUtil.isNotNull(record) && !record.getReceiving(), "待领取的金币未领取,不能重复开启");
|
|
|
}
|
|
|
|
|
@@ -108,10 +113,13 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
goldCoinProdState.setLastTimestamp(secondsTimestamp);
|
|
|
goldCoinProdState.setResidueTimestamp(GoldCoinConstant.GOLD_COIN_PRODUCT_TIME);
|
|
|
goldCoinProdState.setCurrentValue(BigDecimal.ZERO);
|
|
|
+ goldCoinProdState.setTemporaryRate("0");
|
|
|
//2、获取永久速率
|
|
|
UserCoinSpeedUpgradesRecord speedUpgradesRecord = speedRecordService.getSpeedUpgradesRecordByUserId(userContext.getId());
|
|
|
goldCoinProdState.setCurrentRate(speedUpgradesRecord.getProductRate());
|
|
|
goldCoinProdState.setDurableRate(speedUpgradesRecord.getProductRate());
|
|
|
+ //设置批次id
|
|
|
+ goldCoinProdState.setBatchId(IdWorker.getIdStr());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -145,6 +153,8 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
goldCoinProdState.setLastTimestamp(secondsTimestamp);
|
|
|
goldCoinProdState.setDurableRate(speedUpgradesRecord.getProductRate());
|
|
|
goldCoinProdState.setTemporaryRate("0");
|
|
|
+ //设置批次id
|
|
|
+ goldCoinProdState.setBatchId(IdWorker.getIdStr());
|
|
|
return goldCoinProdState;
|
|
|
}
|
|
|
|
|
@@ -158,7 +168,7 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
public void collectGoldCoin() {
|
|
|
UserContext userContext = UserContextHolder.getContext();
|
|
|
//先查询是否存在待领取的金币
|
|
|
- GoldCoinProdRecord record = recordService.getNoReciviedGoldCoinProdRecordByUserId(userContext.getId());
|
|
|
+ GoldCoinProdRecord record = recordService.getNoReceivedGoldCoinProdRecordByUserId(userContext.getId());
|
|
|
GoldCoinProdState state = stateService.getGoldCoinProdStateByUser(userContext.getId());
|
|
|
CheckUtils.throwIfNull(record, "没有待领取的金币");
|
|
|
//把金币结算到用户的账户中
|
|
@@ -169,10 +179,19 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
record.setReceivedTime(LocalDateTime.now());
|
|
|
stateService.updateById(state);
|
|
|
recordService.updateById(record);
|
|
|
+ //推送一条团队奖励消息
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
+ //推送一条团队奖励消息
|
|
|
+ TeamShareMessage teamShareMessage = new TeamShareMessage();
|
|
|
+ BeanUtils.copyProperties(record, teamShareMessage, "msgId");
|
|
|
+ teamShareMessage.setMsgId(IdWorker.getIdStr());
|
|
|
+ messageProducer.sendTeamShareMessage(teamShareMessage);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
private void resetGoldCoinProdState(GoldCoinProdState state) {
|
|
|
state.setCurrentValue(BigDecimal.ZERO);
|
|
|
+ state.setStartTimestamp(null);
|
|
|
state.setLastTimestamp(null);
|
|
|
state.setEndTimestamp(null);
|
|
|
state.setResidueTimestamp(null);
|
|
@@ -282,6 +301,14 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
upgradesState.setRateUpdateFlag(1);
|
|
|
redisService.set(rateTemporarilyKey, upgradesState);
|
|
|
}
|
|
|
+ //异步记录临时速率升级记录
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
+ BoostTemporaryRateRecord record = new BoostTemporaryRateRecord();
|
|
|
+ record.setUserId(context.getId());
|
|
|
+ record.setTemporaryRate(rateNum.toPlainString());
|
|
|
+ record.setBoostTime(LocalDateTime.now());
|
|
|
+ boostTemporaryRateRecordService.save(record);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -308,6 +335,8 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
|
|
|
//生成金币生产记录
|
|
|
GoldCoinProdRecord goldCoinProdRecord = new GoldCoinProdRecord();
|
|
|
+ // 生成批次id
|
|
|
+ goldCoinProdRecord.setBatchId(coinProdState.getBatchId());
|
|
|
goldCoinProdRecord.setUserId(coinProdState.getUserId());
|
|
|
goldCoinProdRecord.setGoldCoinYieldTotal(coinProdState.getCurrentValue());
|
|
|
goldCoinProdRecord.setReceiving(false);
|
|
@@ -315,10 +344,18 @@ public class GoldCoinServiceImpl implements GoldCoinService {
|
|
|
goldCoinProdRecord.setStartTimestamp(coinProdState.getStartTimestamp());
|
|
|
goldCoinProdRecord.setEndTimestamp(coinProdState.getEndTimestamp());
|
|
|
|
|
|
+ log.info("生成金币生产记录");
|
|
|
// 重置金币产出状态
|
|
|
coinProdState.setCompleted(Boolean.TRUE);
|
|
|
coinProdState.setRunning(Boolean.FALSE);
|
|
|
- recordService.save(goldCoinProdRecord);
|
|
|
+ //保存之前先检查是否存在一个批次的记录
|
|
|
+ GoldCoinProdRecord record = recordService.getGoldCoinProdRecordByBatchId(coinProdState.getBatchId());
|
|
|
+ if (ObjUtil.isNotNull(record)) {
|
|
|
+ //更新金币产出记录
|
|
|
+ record.setGoldCoinYieldTotal(coinProdState.getCurrentValue());
|
|
|
+ } else {
|
|
|
+ recordService.save(goldCoinProdRecord);
|
|
|
+ }
|
|
|
stateService.updateById(coinProdState);
|
|
|
//清除redis中的金币产出状态
|
|
|
redisService.del(productKey);
|