|
|
@@ -2,10 +2,16 @@ package com.punchsettle.server.task;
|
|
|
|
|
|
import com.punchsettle.server.atomic.entity.Account;
|
|
|
import com.punchsettle.server.atomic.entity.Reward;
|
|
|
+import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
|
|
|
+import com.punchsettle.server.atomic.entity.User;
|
|
|
import com.punchsettle.server.atomic.service.IAccountService;
|
|
|
+import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
|
|
|
import com.punchsettle.server.atomic.service.IRewardService;
|
|
|
+import com.punchsettle.server.atomic.service.IUserService;
|
|
|
import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
|
|
|
+import com.punchsettle.server.common.exception.BusinessException;
|
|
|
import com.punchsettle.server.constant.AccountCategoryEnum;
|
|
|
+import com.punchsettle.server.constant.RewardExchangeMethodEnum;
|
|
|
import com.punchsettle.server.constant.VersionStatusEnum;
|
|
|
import com.punchsettle.server.pojo.account.AccountQuery;
|
|
|
import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
|
|
|
@@ -14,10 +20,14 @@ import com.punchsettle.server.service.manager.IRewardManager;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -32,15 +42,19 @@ import java.util.stream.Collectors;
|
|
|
@Component
|
|
|
public class RewardAutoExchangeTask {
|
|
|
|
|
|
- @Autowired
|
|
|
- private IRewardManager rewardManager;
|
|
|
-
|
|
|
@Autowired
|
|
|
private IRewardService rewardService;
|
|
|
|
|
|
@Autowired
|
|
|
private IAccountService accountService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IUserService userService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRewardExchangeHistoryService rewardExchangeHistoryService;
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void execute() {
|
|
|
log.info("========== 奖励自动兑换定时任务 开始执行 ==========");
|
|
|
|
|
|
@@ -54,26 +68,111 @@ public class RewardAutoExchangeTask {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 获取账户信息
|
|
|
+ // 获取用户信息
|
|
|
Set<Long> userIds = rewards.stream().map(Reward::getUserId).collect(Collectors.toSet());
|
|
|
+ List<User> users = userService.listByIds(userIds);
|
|
|
+
|
|
|
+
|
|
|
+ // 获取账户信息
|
|
|
AccountQuery accountQuery = new AccountQuery();
|
|
|
accountQuery.setUserIds(userIds);
|
|
|
accountQuery.setAccountCategory(AccountCategoryEnum.BASIC);
|
|
|
List<Account> accounts = accountService.getAccountByCondition(accountQuery);
|
|
|
+
|
|
|
+ // 用户ID-账户
|
|
|
Map<Long, Account> accountMap = accounts.stream().collect(Collectors.toMap(Account::getUserId, Function.identity(), (key1, key2) -> key1));
|
|
|
+ // 用户ID-奖励
|
|
|
+ Map<Long, List<Reward>> rewardMap = rewards.stream().collect(Collectors.groupingBy(Reward::getUserId));
|
|
|
+
|
|
|
+ // 转账记录 新增
|
|
|
+ List<RewardExchangeHistory> addRewardExchangeHistories = new ArrayList<>();
|
|
|
+ // 用户信息 更新
|
|
|
+ List<User> updateUsers = new ArrayList<>();
|
|
|
+ // 账户信息 更新
|
|
|
+ List<Account> updateAccounts = new ArrayList<>();
|
|
|
|
|
|
- for (Reward reward : rewards) {
|
|
|
- try {
|
|
|
- Account account = accountMap.get(reward.getUserId());
|
|
|
-
|
|
|
- RewardExchangeRequest rewardExchangeRequest = new RewardExchangeRequest();
|
|
|
- rewardExchangeRequest.setRewardId(reward.getId());
|
|
|
- rewardExchangeRequest.setAccountId(account.getId());
|
|
|
- rewardExchangeRequest.setExchangeCount(reward.getAutoExchangeCount());
|
|
|
- rewardManager.exchangeReward(rewardExchangeRequest);
|
|
|
- } catch (Exception e) {
|
|
|
- log.info("自动兑换异常");
|
|
|
+ for (User user : users) {
|
|
|
+ // 获取账户信息
|
|
|
+ Account account = accountMap.get(user.getId());
|
|
|
+
|
|
|
+ // 如果用户未使用积分小于0(欠债)则停止自动兑换
|
|
|
+ if (Optional.ofNullable(account.getPoints()).orElse(0).compareTo(0) == -1) {
|
|
|
+ log.info("自动兑换:用户:{} 基本账户目前积分:{},已超支,跳过自动兑换", user.getId(), account.getPoints());
|
|
|
+ continue;
|
|
|
}
|
|
|
+
|
|
|
+ // 获取用户需要自动兑换的奖励
|
|
|
+ List<Reward> tempRewards = rewardMap.get(user.getId());
|
|
|
+
|
|
|
+ // 没有需要自动兑换的则跳过
|
|
|
+ if (CollectionUtils.isEmpty(tempRewards)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Reward reward : tempRewards) {
|
|
|
+ // 兑换所需积分
|
|
|
+ Integer exchangePoints = Optional.ofNullable(reward.getExchangePoints()).orElse(0);
|
|
|
+ // 兑换所需总积分
|
|
|
+ Integer exchangeTotalPoints = exchangePoints * reward.getAutoExchangeCount();
|
|
|
+ // 兑换前账户中的积分
|
|
|
+ Integer accountPointsBeforeExchange = Optional.ofNullable(account.getPoints()).orElse(0);
|
|
|
+ // 兑换后账户中的积分
|
|
|
+ Integer accountPointsAfterExchange = accountPointsBeforeExchange - exchangeTotalPoints;
|
|
|
+ // 兑换前未使用积分
|
|
|
+ Integer unusedPointsBeforeExchange = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
|
|
|
+ // 兑换前已使用积分
|
|
|
+ Integer usedPointsBeforeExchange = Optional.ofNullable(user.getUsedPoints()).orElse(0);
|
|
|
+ // 兑换后未使用积分
|
|
|
+ Integer unusedPointsAfterExchange = unusedPointsBeforeExchange - exchangeTotalPoints;
|
|
|
+ // 兑换后已使用积分
|
|
|
+ Integer usedPointsAfterExchange = usedPointsBeforeExchange + exchangeTotalPoints;
|
|
|
+
|
|
|
+ // 更新用户信息
|
|
|
+ user.setUnusedPoints(unusedPointsAfterExchange);
|
|
|
+ user.setUsedPoints(usedPointsAfterExchange);
|
|
|
+
|
|
|
+ // 更新账户信息
|
|
|
+ account.setPoints(accountPointsAfterExchange);
|
|
|
+
|
|
|
+ // 新增兑换记录
|
|
|
+ RewardExchangeHistory addRewardExchangeHistory = new RewardExchangeHistory();
|
|
|
+ addRewardExchangeHistory.setUserId(user.getId());
|
|
|
+ addRewardExchangeHistory.setRewardId(reward.getId());
|
|
|
+ addRewardExchangeHistory.setExchangeMethod(RewardExchangeMethodEnum.MANUAL);
|
|
|
+ addRewardExchangeHistory.setExchangeCount(reward.getAutoExchangeCount());
|
|
|
+ addRewardExchangeHistory.setExchangeTotalPoints(exchangeTotalPoints);
|
|
|
+ addRewardExchangeHistory.setAccountId(account.getId());
|
|
|
+ addRewardExchangeHistory.setAccountPointsBeforeExchange(accountPointsBeforeExchange);
|
|
|
+ addRewardExchangeHistory.setAccountPointsAfterExchange(accountPointsAfterExchange);
|
|
|
+ addRewardExchangeHistory.setUnusedPointsBeforeExchange(unusedPointsBeforeExchange);
|
|
|
+ addRewardExchangeHistory.setUnusedPointsAfterExchange(unusedPointsAfterExchange);
|
|
|
+ addRewardExchangeHistory.setUsedPointsBeforeExchange(usedPointsBeforeExchange);
|
|
|
+ addRewardExchangeHistory.setUsedPointsAfterExchange(usedPointsAfterExchange);
|
|
|
+ addRewardExchangeHistories.add(addRewardExchangeHistory);
|
|
|
+ }
|
|
|
+
|
|
|
+ User updateUser = new User();
|
|
|
+ updateUser.setId(user.getId());
|
|
|
+ updateUser.setUnusedPoints(user.getUnusedPoints());
|
|
|
+ updateUser.setUsedPoints(user.getUsedPoints());
|
|
|
+ updateUsers.add(updateUser);
|
|
|
+
|
|
|
+ Account updateAccount = new Account();
|
|
|
+ updateAccount.setId(account.getId());
|
|
|
+ updateAccount.setPoints(account.getPoints());
|
|
|
+ updateAccounts.add(updateAccount);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(addRewardExchangeHistories)) {
|
|
|
+ rewardExchangeHistoryService.batchAdd(addRewardExchangeHistories);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(updateAccounts)) {
|
|
|
+ accountService.batchUpdate(updateAccounts);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(updateUsers)) {
|
|
|
+ userService.batchUpdate(updateUsers);
|
|
|
}
|
|
|
|
|
|
log.info("========== 奖励自动兑换定时任务 结束执行 ==========");
|