新代理政策-新增国家code区分

This commit is contained in:
tianfeng 2026-02-03 15:26:24 +08:00
parent 532a3167a9
commit 95e5fffe0c
5 changed files with 178 additions and 5 deletions

View File

@ -104,7 +104,8 @@ public class TeamMemberWorkQryExe {
teamBillCycle -> Objects.equals(teamBillCycle.getStatus(), TeamBillCycleStatus.UNPAID))
.collect(Collectors.toList());
Map<String, TeamPolicyManager> regionPolicy = teamPolicyManagerService.mapRegionRelease(
// 使用新的方法支持 countryCode
Map<String, TeamPolicyManager> 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);
}

View File

@ -45,6 +45,16 @@ public class TeamMemberTarget implements Serializable {
*/
private String sysOrigin;
/**
* 区域ID
*/
private String region;
/**
* 国家code
*/
private String countryCode;
/**
* 团队id.
*/

View File

@ -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<String, TeamPolicyManager> 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 政策Mapkey格式region_countryCode
* @return 计算结果列表
*/
public static List<TeamBillMemberTarget> calculatorPolicyTargetWithMap(
List<TeamMemberTarget> targets,
Map<String, TeamPolicyManager> policyMap) {
if (CollectionUtils.isEmpty(targets)) {
return Lists.newArrayList();
}
// region + countryCode 分组
Map<String, List<TeamMemberTarget>> groupedTargets = targets.stream()
.filter(target -> !Boolean.TRUE.equals(target.getHistory()))
.collect(Collectors.groupingBy(target ->
buildPolicyMapKey(target.getRegion(), target.getCountryCode())));
List<TeamBillMemberTarget> 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<TeamBillMemberTarget> 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;
}
/**
* 计算上月溢出值.
*/

View File

@ -61,6 +61,14 @@ public interface TeamPolicyManagerService {
*/
Map<String, TeamPolicyManager> mapRegionRelease(Set<String> regions);
/**
* 批量查询已发布政策支持多countryCode.
*
* @param regions 区域集合
* @return Mapkey格式region_countryCode region_DEFAULT
*/
Map<String, TeamPolicyManager> mapRegionReleaseWithCountry(Set<String> regions);
/**
* 根据id查询对象.
*/

View File

@ -122,6 +122,42 @@ public class TeamPolicyManagerServiceImpl implements TeamPolicyManagerService {
.collect(Collectors.toMap(TeamPolicyManager::getRegion, v -> v));
}
@Override
public Map<String, TeamPolicyManager> mapRegionReleaseWithCountry(Set<String> regions) {
if (CollectionUtils.isEmpty(regions)) {
return Maps.newHashMap();
}
// 查询所有 region 的已发布政策所有 countryCode
List<TeamPolicyManager> policies = mongoTemplate.find(
Query.query(Criteria.where("region").in(regions)
.and("release").is(Boolean.TRUE)),
TeamPolicyManager.class);
if (CollectionUtils.isEmpty(policies)) {
return Maps.newHashMap();
}
// 构建Mapkey = 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);