package com.punchsettle.server.task; import com.punchsettle.server.atomic.entity.Account; import com.punchsettle.server.atomic.entity.AccountTransferHistory; import com.punchsettle.server.atomic.entity.SettleUserHistory; import com.punchsettle.server.atomic.entity.User; import com.punchsettle.server.atomic.service.IAccountService; import com.punchsettle.server.atomic.service.IAccountTransferHistoryService; import com.punchsettle.server.atomic.service.ISettleUserHistoryService; import com.punchsettle.server.atomic.service.IUserService; import com.punchsettle.server.constant.AccountCategoryEnum; import com.punchsettle.server.constant.TransferCategoryEnum; import com.punchsettle.server.pojo.account.AccountQuery; import com.punchsettle.server.pojo.settle.SettleUserHistoryQuery; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.time.LocalDate; import java.util.ArrayList; 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; /** * @author tyuio * @version 1.0.0 * @date 2025/5/6 19:31 * @description 积分分发 定时任务 */ @Slf4j @Component public class PointsDistributeTask { @Autowired private ISettleUserHistoryService settleUserHistoryService; @Autowired private IUserService userService; @Autowired private IAccountService accountService; @Autowired private IAccountTransferHistoryService accountTransferHistoryService; public void execute() { log.info("========== 积分分发定时任务 开始执行 =========="); // 结算日期 LocalDate settleDate = LocalDate.now().minusDays(1); // 查询结算记录 SettleUserHistoryQuery settleUserHistoryQuery = new SettleUserHistoryQuery(); settleUserHistoryQuery.setSettleDate(settleDate.toString()); List settleUserHistories = settleUserHistoryService.querySettleUserHistory(settleUserHistoryQuery); if (CollectionUtils.isEmpty(settleUserHistories)) { log.info("========== 积分分发定时任务,没有可分发的积分 结束执行 =========="); return; } // 用户ID-用户结算记录关联 Map settleUserHistoryMap = settleUserHistories.stream().collect(Collectors.toMap(SettleUserHistory::getUserId, Function.identity(), (key1, key2) -> key1)); // 用户ID列表 Set userIds = settleUserHistories.stream().map(SettleUserHistory::getUserId).collect(Collectors.toSet()); // 用户信息, 用户ID-用户信息关联 List users = userService.listByIds(userIds); Map userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1)); // 获取账户信息,用户ID-账户信息关联 AccountQuery accountQuery = new AccountQuery(); accountQuery.setAccountCategory(AccountCategoryEnum.BASIC); accountQuery.setUserIds(userIds); List accounts = accountService.getAccountByCondition(accountQuery); Map accountMap = accounts.stream().collect(Collectors.toMap(Account::getUserId, Function.identity(), (key1, key2) -> key1)); // 用户信息 更新列表 List updateUserList = new ArrayList<>(); // 账户信息 更新列表 List updateAccountList = new ArrayList<>(); // 转账记录 新增列表 List addAccountTransferHistories = new ArrayList<>(); // 结算用户信息 更新列表 List updateSettleUserHistories = new ArrayList<>(); for (Long userId : userIds) { // 用户信息 User user = userMap.get(userId); // 账户信息 Account account = accountMap.get(userId); // 结算信息 SettleUserHistory settleUserHistory = settleUserHistoryMap.get(userId); // 结算积分 Integer settlePoints = Optional.ofNullable(settleUserHistory.getSettlePoints()).orElse(0); // 获取并设置用户信息 Integer beforeTotalPoints = Optional.ofNullable(user.getTotalPoints()).orElse(0); Integer beforeUnusedPoints = Optional.ofNullable(user.getUnusedPoints()).orElse(0); User updateUser = new User(); updateUser.setId(user.getId()); updateUser.setTotalPoints(beforeTotalPoints + settlePoints); updateUser.setUnusedPoints(beforeUnusedPoints + settlePoints); updateUserList.add(user); // 更新账户信息 Integer beforeAccountPoints = Optional.ofNullable(account.getPoints()).orElse(0); account.setPoints(beforeAccountPoints + settlePoints); updateAccountList.add(account); // 增加账户转账记录 AccountTransferHistory accountTransferHistory = new AccountTransferHistory(); accountTransferHistory.setTransferPoints(settlePoints); accountTransferHistory.setTransferCategory(TransferCategoryEnum.SETTLE); accountTransferHistory.setRecipientAccountId(account.getId()); accountTransferHistory.setRaPointsAfterTransfer(beforeAccountPoints); accountTransferHistory.setRaPointsAfterTransfer(account.getPoints()); addAccountTransferHistories.add(accountTransferHistory); // 设置结算积分记录 SettleUserHistory updateSettleUserHistory = new SettleUserHistory(); updateSettleUserHistory.setBeforeSettlePoints(beforeTotalPoints); updateSettleUserHistory.setAfterSettlePoints(beforeTotalPoints + settlePoints); updateSettleUserHistories.add(updateSettleUserHistory); } if (!CollectionUtils.isEmpty(updateUserList)) { userService.batchUpdate(updateUserList); } if (!CollectionUtils.isEmpty(updateAccountList)) { accountService.batchUpdate(updateAccountList); } if (!CollectionUtils.isEmpty(addAccountTransferHistories)) { accountTransferHistoryService.insertList(addAccountTransferHistories); } if (!CollectionUtils.isEmpty(updateSettleUserHistories)) { settleUserHistoryService.insertList(updateSettleUserHistories); } log.info("========== 积分分发定时任务 结束执行 =========="); } }