diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamMemberWorkQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamMemberWorkQryExe.java index 0324872c..3a2c190a 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamMemberWorkQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamMemberWorkQryExe.java @@ -104,7 +104,8 @@ public class TeamMemberWorkQryExe { teamBillCycle -> Objects.equals(teamBillCycle.getStatus(), TeamBillCycleStatus.UNPAID)) .collect(Collectors.toList()); - Map regionPolicy = teamPolicyManagerService.mapRegionRelease( + // 使用新的方法,支持 countryCode + Map regionPolicy = teamPolicyManagerService.mapRegionReleaseWithCountry( unpaidBillCycles.stream().map(TeamBillCycle::getRegion).collect(Collectors.toSet()) ); @@ -153,12 +154,17 @@ public class TeamMemberWorkQryExe { return co; } - TeamPolicyManager policy = regionPolicy.get(bill.getRegion()); + // 使用 target 自身的 region 和 countryCode 查找匹配的 policy + TeamPolicyManager policy = TeamBillCycleUtils.getPolicyFromMap( + regionPolicy, + target.getRegion(), + target.getCountryCode()); + if (Objects.isNull(policy)) { return co; } - TeamBillMemberTarget teamBillMemberTarget = calculatorTarget(target, policy); + TeamBillMemberTarget teamBillMemberTarget = TeamBillCycleUtils.calculatorPolicyTarget(target, policy); co.getTarget().setSettlementResult( teamAppConvertor.toTeamMemberTargetSettlementResultCO(teamBillMemberTarget) ); @@ -190,12 +196,12 @@ public class TeamMemberWorkQryExe { private TeamBillMemberTarget calculatorTarget(TeamMemberTarget target, TeamPolicyManager policy) { - //2fun新增钻石政策 + if (Objects.isNull(policy.getPolicyType()) || Objects.equals("MONEY", policy.getPolicyType())) { return TeamBillCycleUtils.calculatorPolicyTarget(target, policy); } - BillDiamondBalance billDiamondBalance = billDiamondBalanceService.getEntityByBillBelongAndUserId(target.getSysOrigin(), target.getBillBelong(), target.getUserId()); + BillDiamondBalance billDiamondBalance = billDiamondBalanceService.getEntityByBillBelongAndUserId(target.getSysOrigin(), target.getBillBelong(), target.getUserId()); return TeamBillCycleUtils.calculatorPolicyDiamondTarget(target, policy, Objects.nonNull(billDiamondBalance) ? billDiamondBalance.getConsumptionPoints() : BigDecimal.ZERO); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/team/team/TeamMemberTarget.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/team/team/TeamMemberTarget.java index 10db288e..ddce5f38 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/team/team/TeamMemberTarget.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/team/team/TeamMemberTarget.java @@ -45,6 +45,16 @@ public class TeamMemberTarget implements Serializable { */ private String sysOrigin; + /** + * 区域ID + */ + private String region; + + /** + * 国家code + */ + private String countryCode; + /** * 团队id. */ 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 7f6b4df4..2618ce44 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 @@ -15,6 +15,7 @@ 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; +import com.red.circle.tool.core.text.StringUtils; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,6 +37,58 @@ public final class TeamBillCycleUtils { private static final Logger log = LoggerFactory.getLogger(TeamBillCycleUtils.class); + /** + * Policy Map Key 分隔符. + */ + public static final String POLICY_KEY_DELIMITER = "_"; + + /** + * 默认国家代码(通用政策). + */ + public static final String DEFAULT_COUNTRY_CODE = "DEFAULT"; + + /** + * 构建 policy map 的 key. + * + * @param region 区域 + * @param countryCode 国家代码 + * @return map key,格式:region_countryCode 或 region_DEFAULT + */ + public static String buildPolicyMapKey(String region, String countryCode) { + return region + POLICY_KEY_DELIMITER + + (StringUtils.isNotBlank(countryCode) ? countryCode : DEFAULT_COUNTRY_CODE); + } + + /** + * 从 policy map 中获取匹配的政策(支持 fallback). + * + * @param policyMap 政策 Map + * @param region 区域 + * @param countryCode 国家代码 + * @return 匹配的政策,优先返回精确匹配的,没有则返回通用政策(countryCode=null) + */ + public static TeamPolicyManager getPolicyFromMap( + Map policyMap, + String region, + String countryCode) { + + if (policyMap == null || region == null) { + return null; + } + + // 1. 先找精确匹配 countryCode 的政策 + String key = buildPolicyMapKey(region, countryCode); + TeamPolicyManager policy = policyMap.get(key); + + // 2. Fallback:如果没找到,查找通用政策(countryCode = null) + if (policy == null) { + key = buildPolicyMapKey(region, null); + policy = policyMap.get(key); + } + + return policy; + } + /** * 团队周期数. */ @@ -247,6 +300,66 @@ public final class TeamBillCycleUtils { }).filter(Objects::nonNull).collect(Collectors.toList()); } + /** + * 计算成员工作情况(Map版本 - 支持多region和countryCode). + * + * @param targets 目标列表,每个target包含region和countryCode + * @param policyMap 政策Map,key格式:region_countryCode + * @return 计算结果列表 + */ + public static List calculatorPolicyTargetWithMap( + List targets, + Map policyMap) { + + if (CollectionUtils.isEmpty(targets)) { + return Lists.newArrayList(); + } + + // 按 region + countryCode 分组 + Map> groupedTargets = targets.stream() + .filter(target -> !Boolean.TRUE.equals(target.getHistory())) + .collect(Collectors.groupingBy(target -> + buildPolicyMapKey(target.getRegion(), target.getCountryCode()))); + + List allResults = new ArrayList<>(); + + // 对每组使用对应的 policy 计算 + groupedTargets.forEach((policyKey, groupTargets) -> { + // 取第一个 target 只是为了获取 region 和 countryCode(同一组的都相同) + TeamMemberTarget firstTarget = groupTargets.get(0); + // 从 map 中获取对应的 policy(自动 fallback) + TeamPolicyManager policy = getPolicyFromMap( + policyMap, + firstTarget.getRegion(), + firstTarget.getCountryCode()); + + if (policy != null) { + // 使用原有的单 policy 计算逻辑,传入整个 groupTargets 列表 + List results = calculatorPolicyTarget(groupTargets, policy); + allResults.addAll(results); + } else { + // 没有匹配的政策,返回默认值 + groupTargets.forEach(target -> { + TeamBillMemberTarget defaultTarget = new TeamBillMemberTarget() + .setTargetId(target.getTimeId()) + .setSysOrigin(target.getSysOrigin()) + .setUserId(target.getUserId()) + .setAcceptGiftValue(target.sumAcceptGiftValue()) + .setGiveGiftValue(target.sumGiveGiftValue()) + .setRoomValue(target.sumRoomValue()) + .setOnlineTime(target.sumAllTargetTime()) + .setMemberSalary(BigDecimal.ZERO) + .setOwnSalary(BigDecimal.ZERO) + .setTotalSalary(BigDecimal.ZERO) + .setSatisfyLevel(Boolean.FALSE); + allResults.add(defaultTarget); + }); + } + }); + + return allResults; + } + /** * 计算上月溢出值. */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/TeamPolicyManagerService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/TeamPolicyManagerService.java index 693abdb9..8877dac3 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/TeamPolicyManagerService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/TeamPolicyManagerService.java @@ -61,6 +61,14 @@ public interface TeamPolicyManagerService { */ Map mapRegionRelease(Set regions); + /** + * 批量查询已发布政策(支持多countryCode). + * + * @param regions 区域集合 + * @return Map,key格式:region_countryCode 或 region_DEFAULT + */ + Map mapRegionReleaseWithCountry(Set regions); + /** * 根据id查询对象. */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/impl/TeamPolicyManagerServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/impl/TeamPolicyManagerServiceImpl.java index 6c7cc1e7..3af49186 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/impl/TeamPolicyManagerServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/team/team/impl/TeamPolicyManagerServiceImpl.java @@ -122,6 +122,42 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService { .collect(Collectors.toMap(TeamPolicyManager::getRegion, v -> v)); } + @Override + public Map mapRegionReleaseWithCountry(Set regions) { + + if (CollectionUtils.isEmpty(regions)) { + return Maps.newHashMap(); + } + + // 查询所有 region 的已发布政策(所有 countryCode) + List policies = mongoTemplate.find( + Query.query(Criteria.where("region").in(regions) + .and("release").is(Boolean.TRUE)), + TeamPolicyManager.class); + + if (CollectionUtils.isEmpty(policies)) { + return Maps.newHashMap(); + } + + // 构建Map,key = region + "_" + countryCode + return policies.stream() + .collect(Collectors.toMap( + policy -> buildPolicyMapKey(policy.getRegion(), policy.getCountryCode()), + policy -> policy, + (existing, replacement) -> existing + )); + } + + /** + * 构建policy map的key. + */ + private String buildPolicyMapKey(String region, String countryCode) { + String delimiter = "_"; + String defaultCountry = "DEFAULT"; + return region + delimiter + + (StringUtils.isNotBlank(countryCode) ? countryCode : defaultCountry); + } + @Override public TeamPolicyManager getById(Long id) { return mongoTemplate.findOne(Query.query(Criteria.where("id").is(id)), TeamPolicyManager.class);