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 = "0 0 0 1 * ?")
@Scheduled(cron = "0 15 16 * * ?")
// @Scheduled(cron = "0 0 0 1 * ?")
public void refreshCreditsMonthly() {
log.info("每月1号0点 重置教育版子账号为默认积分");
accountService.refreshCreditsMonthly();

View File

@@ -1705,13 +1705,18 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
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;
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.setUpdateDate(new Date());
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<>();
Date now = new Date();
for (Account subAcc : subAccounts) {
try {
Account updatedAccount = calculateNewCredits(subAcc, now, averageCredits);
Account updatedAccount = calculateNewCredits(subAcc, now);
accountsToUpdate.add(updatedAccount);
} 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();
// 使用 Optional 替代 ObjectUtils.defaultIfNull
BigDecimal creditsUsage = Optional.ofNullable(subAcc.getCreditsUsage()).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(
schoolCreditRemaining.compareTo(BigDecimal.ZERO) > 0 ?
schoolCreditRemaining : BigDecimal.ZERO
);
);*/
BigDecimal personalCredits = currentCredits.add(creditsUsage).subtract(creditsUsageLimit);
// 确保个人积分不为负数
personalCredits = personalCredits.max(BigDecimal.ZERO);
// 新的总积分 = 个人积分 + 学校分配的新积分额度 (重新分配的积分是使用上个月分配的积分还是默认积分,暂时使用平均积分)
BigDecimal newTotalCredits = personalCredits.add(averageCredits);
BigDecimal newTotalCredits = personalCredits.add(creditsUsageLimit);
// 记录积分变更日志(可选)
logCreditChange(subAcc, currentCredits, newTotalCredits, creditsUsage);
@@ -1795,7 +1801,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
updatedAccount.setId(subAcc.getId());
updatedAccount.setCredits(newTotalCredits);
updatedAccount.setCreditsUsage(BigDecimal.ZERO); // 重置已使用积分
updatedAccount.setCreditsUsageLimit(averageCredits); // 重置为默认积分
// updatedAccount.setCreditsUsageLimit(averageCredits); // 分配的积分沿用上次分配的积分
updatedAccount.setUpdateDate(updateTime);
return updatedAccount;

View File

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