diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamMemberTargetIndex.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamMemberTargetIndex.java index 3e67d849..66d032e2 100644 --- a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamMemberTargetIndex.java +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/enums/team/TeamMemberTargetIndex.java @@ -43,6 +43,11 @@ public class TeamMemberTargetIndex implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long acceptGiftValue; + /** + * 溢出值 + */ + private Long overFlowGiftValue; + /** * 送出等礼物. */ diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/team/TeamBillSettleListener.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/team/TeamBillSettleListener.java index b4163eae..5561a16f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/team/TeamBillSettleListener.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/team/TeamBillSettleListener.java @@ -226,16 +226,6 @@ public class TeamBillSettleListener implements MessageListener { return teamMemberTargets; } - private List calculatorTarget(List teamMemberTargets, - TeamPolicyManager regionPolicyManager) { - //2fun新增钻石政策 - if (Objects.isNull(regionPolicyManager.getPolicyType()) || Objects.equals("MONEY", regionPolicyManager.getPolicyType())) { - return TeamBillCycleUtils.calculatorPolicyTarget(teamMemberTargets, regionPolicyManager); - } - - return TeamBillCycleUtils.calculatorPolicyDiamondTarget(teamMemberTargets, regionPolicyManager); - } - private Map getMetadata(SysRegionConfig regionConfig) { return Optional.ofNullable(regionConfig) .map(SysRegionConfig::getMetadata).orElseGet(CollectionUtils::newHashMap); diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/TeamBillCycleUtils.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/TeamBillCycleUtils.java index 28198850..84f10b64 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/TeamBillCycleUtils.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/TeamBillCycleUtils.java @@ -11,6 +11,7 @@ import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyMana import com.red.circle.other.infra.database.mongo.entity.user.region.SysRegionConfig; import com.red.circle.other.infra.database.rds.entity.team.BillDiamondBalance; import com.red.circle.other.inner.enums.team.TeamMemberTargetIndex; +import com.red.circle.other.inner.enums.team.TeamMemberTargetStatus; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import com.red.circle.tool.core.num.NumUtils; @@ -20,6 +21,7 @@ import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.math.RoundingMode; +import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; @@ -191,7 +193,13 @@ public final class TeamBillCycleUtils { .collect(Collectors.toList()) : Lists.newArrayList(); - return targets.stream().map(target -> { + // 计算上月溢出值并应用到当前月 + Map userOverflowMap = calculateLastMonthOverflow(targets, teamPolicies); + applyOverflowToCurrentMonth(targets, userOverflowMap); + + return targets.stream() + .filter(target -> !Boolean.TRUE.equals(target.getHistory())) + .map(target -> { long targetTimeHours = target.sumAllTargetTime() / 60; Long acceptGiftValue = target.sumAcceptGiftValue(); Integer effectiveDay = calculateEffectiveDay(target); @@ -238,6 +246,110 @@ public final class TeamBillCycleUtils { }).filter(Objects::nonNull).collect(Collectors.toList()); } + /** + * 计算上月溢出值. + */ + private static Map calculateLastMonthOverflow(List targets, + List teamPolicies) { + + Map userOverflowMap = new HashMap<>(); + + // 按用户分组 + Map> userTargetMap = targets.stream() + .collect(Collectors.groupingBy(TeamMemberTarget::getUserId)); + + userTargetMap.forEach((userId, userTargets) -> { + // 找到所有上月历史已结算数据 (history = true) + List historyTargets = userTargets.stream() + .filter(t -> Boolean.TRUE.equals(t.getHistory())) + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(historyTargets)) { + // 汇总所有历史记录的 acceptGiftValue + Long totalAcceptGiftValue = historyTargets.stream() + .map(TeamMemberTarget::sumAcceptGiftValue) + .filter(Objects::nonNull) + .reduce(0L, Long::sum); + + // 查找该用户达到的最大等级目标值 + Long levelTargetValue = findLevelTargetValue(totalAcceptGiftValue, teamPolicies); + + // 计算溢出部分 + long overflow = totalAcceptGiftValue - levelTargetValue; + if (overflow > 0) { + userOverflowMap.put(userId, overflow); + } + } + }); + + return userOverflowMap; + } + + + /** + * 根据总收礼物值查找达到的等级目标值. + * + * @param totalAcceptGiftValue 总收礼物值 + * @param teamPolicies 团队政策列表(已按level倒序排序) + * @return 达到的等级目标值 + */ + private static Long findLevelTargetValue(Long totalAcceptGiftValue, List teamPolicies) { + if (totalAcceptGiftValue == null || totalAcceptGiftValue <= 0) { + return 0L; + } + + for (TeamPolicy teamPolicy : teamPolicies) { + if (totalAcceptGiftValue >= teamPolicy.getTarget()) { + return teamPolicy.getTarget(); + } + } + + return 0L; + } + + /** + * 将上月溢出值应用到当前月数据并持久化. + * + * @param targets 目标数据列表 + * @param userOverflowMap 用户溢出值映射 + */ + private static void applyOverflowToCurrentMonth(List targets, + Map userOverflowMap) { + + if (userOverflowMap.isEmpty()) { + return; + } + + targets.stream() + .filter(target -> !Boolean.TRUE.equals(target.getHistory())) + .filter(target -> userOverflowMap.containsKey(target.getUserId())) + .forEach(target -> { + Long overflow = userOverflowMap.get(target.getUserId()); + + // 获取dailyTargets列表 + List dailyTargets = target.getDailyTargets(); + + if (CollectionUtils.isNotEmpty(dailyTargets)) { + // 获取最后一个元素 + TeamMemberTargetIndex lastTarget = dailyTargets.get(dailyTargets.size() - 1); + + // 设置溢出值 + lastTarget.setOverFlowGiftValue(overflow); + lastTarget.setAcceptGiftValue(lastTarget.getAcceptGiftValue() + overflow); + lastTarget.setUpdateTime(new Timestamp(System.currentTimeMillis())); + } + + // 添加备注 + if (target.getRemarks() == null) { + target.setRemarks(new ArrayList<>()); + } + target.getRemarks().add("上半月溢出值: " + overflow); + + // 更新修改时间 + target.setUpdateTime(new Timestamp(System.currentTimeMillis())); + }); + } + /** * 计算成员工作情况-钻石政策. */