TASK: 子账号积分刷新沿用上月分配的积分

BUGFIX: 获取作品详情
This commit is contained in:
2025-09-11 16:01:25 +08:00
parent e3b0d3bc0a
commit 5d8bdf9ecc
3 changed files with 26 additions and 19 deletions

View File

@@ -25,7 +25,8 @@ public class AccountTask {
* 每个月月初只刷新教育子账号的积分 * 每个月月初只刷新教育子账号的积分
*/ */
// @Scheduled(cron = "59 59 23 * * ?") // @Scheduled(cron = "59 59 23 * * ?")
@Scheduled(cron = "0 0 0 1 * ?") @Scheduled(cron = "0 15 16 * * ?")
// @Scheduled(cron = "0 0 0 1 * ?")
public void refreshCreditsMonthly() { public void refreshCreditsMonthly() {
log.info("每月1号0点 重置教育版子账号为默认积分"); log.info("每月1号0点 重置教育版子账号为默认积分");
accountService.refreshCreditsMonthly(); accountService.refreshCreditsMonthly();

View File

@@ -1705,13 +1705,18 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
continue; continue;
} }
BigDecimal averageCredits = adminAccount.getCreditsUsageLimit().divide(new BigDecimal(adminAccount.getSubAccountNum()), RoundingMode.FLOOR); // BigDecimal averageCredits = adminAccount.getCreditsUsageLimit().divide(new BigDecimal(adminAccount.getSubAccountNum()), RoundingMode.FLOOR);
// 批量更新子账号积分 // 批量更新子账号积分
int processedCount = batchUpdateSubAccountsCredits(subAccounts, averageCredits); int processedCount = batchUpdateSubAccountsCredits(subAccounts);
totalProcessed += processedCount; totalProcessed += processedCount;
adminAccount.setCreditsUsage(averageCredits.multiply(new BigDecimal(processedCount))); BigDecimal sum = subAccounts.stream()
.filter(Objects::nonNull)
.map(Account::getCreditsUsageLimit)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
adminAccount.setCreditsUsage(sum);
adminAccount.setCredits(adminAccount.getCreditsUsageLimit().subtract(adminAccount.getCreditsUsage())); adminAccount.setCredits(adminAccount.getCreditsUsageLimit().subtract(adminAccount.getCreditsUsage()));
adminAccount.setUpdateDate(new Date()); adminAccount.setUpdateDate(new Date());
updateById(adminAccount); updateById(adminAccount);
@@ -1740,13 +1745,13 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
/** /**
* 批量更新子账号积分 * 批量更新子账号积分
*/ */
private int batchUpdateSubAccountsCredits(List<Account> subAccounts, BigDecimal averageCredits) { private int batchUpdateSubAccountsCredits(List<Account> subAccounts/*, BigDecimal averageCredits*/) {
List<Account> accountsToUpdate = new ArrayList<>(); List<Account> accountsToUpdate = new ArrayList<>();
Date now = new Date(); Date now = new Date();
for (Account subAcc : subAccounts) { for (Account subAcc : subAccounts) {
try { try {
Account updatedAccount = calculateNewCredits(subAcc, now, averageCredits); Account updatedAccount = calculateNewCredits(subAcc, now);
accountsToUpdate.add(updatedAccount); accountsToUpdate.add(updatedAccount);
} catch (Exception e) { } catch (Exception e) {
@@ -1764,28 +1769,29 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
/** /**
* 计算新的积分值 * 计算新的积分值
* 默认积分为学校总积分数 / 学校可使用子账号数 * 默认积分为上月分配的积分
*/ */
private Account calculateNewCredits(Account subAcc, Date updateTime, BigDecimal averageCredits) { private Account calculateNewCredits(Account subAcc, Date updateTime/*, BigDecimal averageCredits*/) {
BigDecimal creditsUsageLimit = subAcc.getCreditsUsageLimit(); BigDecimal creditsUsageLimit = subAcc.getCreditsUsageLimit();
// 使用 Optional 替代 ObjectUtils.defaultIfNull // 使用 Optional 替代 ObjectUtils.defaultIfNull
BigDecimal creditsUsage = Optional.ofNullable(subAcc.getCreditsUsage()).orElse(BigDecimal.ZERO); BigDecimal creditsUsage = Optional.ofNullable(subAcc.getCreditsUsage()).orElse(BigDecimal.ZERO);
BigDecimal currentCredits = Optional.ofNullable(subAcc.getCredits()).orElse(BigDecimal.ZERO); BigDecimal currentCredits = Optional.ofNullable(subAcc.getCredits()).orElse(BigDecimal.ZERO);
// 计算学校分配积分的剩余量 // 计算学校分配积分的剩余量
BigDecimal schoolCreditRemaining = creditsUsageLimit.subtract(creditsUsage); /*BigDecimal schoolCreditRemaining = creditsUsageLimit.subtract(creditsUsage);
// 计算个人充值的积分(总积分减去学校分配的剩余积分) // 计算个人充值的积分(总积分减去学校分配的剩余积分)
BigDecimal personalCredits = currentCredits.subtract( BigDecimal personalCredits = currentCredits.subtract(
schoolCreditRemaining.compareTo(BigDecimal.ZERO) > 0 ? schoolCreditRemaining.compareTo(BigDecimal.ZERO) > 0 ?
schoolCreditRemaining : BigDecimal.ZERO schoolCreditRemaining : BigDecimal.ZERO
); );*/
BigDecimal personalCredits = currentCredits.add(creditsUsage).subtract(creditsUsageLimit);
// 确保个人积分不为负数 // 确保个人积分不为负数
personalCredits = personalCredits.max(BigDecimal.ZERO); personalCredits = personalCredits.max(BigDecimal.ZERO);
// 新的总积分 = 个人积分 + 学校分配的新积分额度 (重新分配的积分是使用上个月分配的积分还是默认积分,暂时使用平均积分) // 新的总积分 = 个人积分 + 学校分配的新积分额度 (重新分配的积分是使用上个月分配的积分还是默认积分,暂时使用平均积分)
BigDecimal newTotalCredits = personalCredits.add(averageCredits); BigDecimal newTotalCredits = personalCredits.add(creditsUsageLimit);
// 记录积分变更日志(可选) // 记录积分变更日志(可选)
logCreditChange(subAcc, currentCredits, newTotalCredits, creditsUsage); logCreditChange(subAcc, currentCredits, newTotalCredits, creditsUsage);
@@ -1795,7 +1801,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
updatedAccount.setId(subAcc.getId()); updatedAccount.setId(subAcc.getId());
updatedAccount.setCredits(newTotalCredits); updatedAccount.setCredits(newTotalCredits);
updatedAccount.setCreditsUsage(BigDecimal.ZERO); // 重置已使用积分 updatedAccount.setCreditsUsage(BigDecimal.ZERO); // 重置已使用积分
updatedAccount.setCreditsUsageLimit(averageCredits); // 重置为默认积分 // updatedAccount.setCreditsUsageLimit(averageCredits); // 分配的积分沿用上次分配的积分
updatedAccount.setUpdateDate(updateTime); updatedAccount.setUpdateDate(updateTime);
return updatedAccount; return updatedAccount;

View File

@@ -525,7 +525,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
@Override @Override
public PortfolioVO detail(PortfolioDTO portfolioDTO) { public PortfolioVO detail(PortfolioDTO portfolioDTO) {
AuthPrincipalVo userHolder = UserContext.getUserHolder(); // AuthPrincipalVo userHolder = UserContext.getUserHolder();
Portfolio portfolio = portfolioMapper.selectById(portfolioDTO.getId()); Portfolio portfolio = portfolioMapper.selectById(portfolioDTO.getId());
PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class); PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class);
if (vo.getOpenSource() == 1) { if (vo.getOpenSource() == 1) {
@@ -556,19 +556,19 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
vo.setLikeNum(redisUtil.getLikeCount(vo.getId())); vo.setLikeNum(redisUtil.getLikeCount(vo.getId()));
String avatar; String avatar;
Account account = accountMapper.selectById(vo.getAccountId()); Account account = accountMapper.selectById(vo.getAccountId());
if (userHolder == null) { if (Objects.isNull(portfolioDTO.getAccountId())) {
vo.setIsLike(0); vo.setIsLike(0);
vo.setIsFollow(0); vo.setIsFollow(0);
avatar = CommonConstant.DEFAULT_AVATAR; avatar = CommonConstant.DEFAULT_AVATAR;
} else { } else {
boolean postLikedByUser = redisUtil.isPostLikedByUser(portfolioDTO.getId(), userHolder.getId()); boolean postLikedByUser = redisUtil.isPostLikedByUser(portfolioDTO.getId(), portfolioDTO.getAccountId());
if (postLikedByUser) { if (postLikedByUser) {
vo.setIsLike(1); vo.setIsLike(1);
} else { } else {
vo.setIsLike(0); vo.setIsLike(0);
} }
// 设置当前用户是否关注了所查看作品的作者 // 设置当前用户是否关注了所查看作品的作者
Integer ifFollowed = getIfFollowed(portfolio.getAccountId(), userHolder.getId()); Integer ifFollowed = getIfFollowed(portfolio.getAccountId(), portfolioDTO.getAccountId());
vo.setIsFollow(ifFollowed); vo.setIsFollow(ifFollowed);
avatar = StringUtil.isNullOrEmpty(account.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : account.getAvatar(); avatar = StringUtil.isNullOrEmpty(account.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : account.getAvatar();
} }
@@ -589,17 +589,17 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
} }
} }
} }
if (userHolder == null) { if (Objects.isNull(portfolioDTO.getAccountId())) {
vo.setIsMine(0); vo.setIsMine(0);
vo.setSelected(0); vo.setSelected(0);
} else { } else {
if (Objects.equals(vo.getAccountId(), userHolder.getId()) || Objects.equals(vo.getOriginalAccountId(), userHolder.getId())) { if (Objects.equals(vo.getAccountId(), portfolioDTO.getAccountId()) || Objects.equals(vo.getOriginalAccountId(), portfolioDTO.getAccountId())) {
vo.setIsMine(1); vo.setIsMine(1);
vo.setSelected(1); vo.setSelected(1);
} else { } else {
vo.setIsMine(0); vo.setIsMine(0);
QueryWrapper<UserLikeGroup> getSelectedQw = new QueryWrapper<>(); QueryWrapper<UserLikeGroup> getSelectedQw = new QueryWrapper<>();
getSelectedQw.lambda().eq(UserLikeGroup::getAccountId, userHolder.getId()); getSelectedQw.lambda().eq(UserLikeGroup::getAccountId, portfolioDTO.getAccountId());
getSelectedQw.lambda().eq(UserLikeGroup::getOriginalPortfolioId, vo.getId()); getSelectedQw.lambda().eq(UserLikeGroup::getOriginalPortfolioId, vo.getId());
List<UserLikeGroup> userLikeGroups = userLikeGroupMapper.selectList(getSelectedQw); List<UserLikeGroup> userLikeGroups = userLikeGroupMapper.selectList(getSelectedQw);
if (CollectionUtils.isEmpty(userLikeGroups)) { if (CollectionUtils.isEmpty(userLikeGroups)) {