增加foreverPercentage字段 计算bd下的薪资等级

This commit is contained in:
tianfeng 2025-09-26 10:32:34 +08:00
parent 7654f728af
commit e8210b967f
4 changed files with 326 additions and 6 deletions

View File

@ -8,6 +8,7 @@ import com.red.circle.other.infra.database.rds.entity.team.BusinessDevelopmentTe
import com.red.circle.other.infra.database.rds.service.team.BusinessDevelopmentTeamService; import com.red.circle.other.infra.database.rds.service.team.BusinessDevelopmentTeamService;
import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.num.NumUtils; import com.red.circle.tool.core.num.NumUtils;
import com.red.circle.other.app.util.BdSalaryPolicyUtils;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -39,11 +40,21 @@ public class BdAgentCountQryExe {
.orElseGet(CollectionUtils::newArrayList); .orElseGet(CollectionUtils::newArrayList);
Long target = teamMemberTargetService.countThisMonthTeamMemberTarget(teamIds); Long target = teamMemberTargetService.countThisMonthTeamMemberTarget(teamIds);
Long agentQuantity = businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId());
// 计算BD薪资等级
BdSalaryPolicyUtils.BdSalaryResult salaryResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(agentQuantity, target);
return new BdAgentCountCO() return new BdAgentCountCO()
.setAgentQuantity( .setAgentQuantity(agentQuantity)
businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId()))
.setThisMonthTotalTarget(target) .setThisMonthTotalTarget(target)
.setThisMonthTotalTargetFormat(NumUtils.formatLong(target)); .setThisMonthTotalTargetFormat(NumUtils.formatLong(target))
.setBdLevel(salaryResult.getLevel())
.setForeverPercentage(salaryResult.getForeverPercentage())
.setQualified(salaryResult.getQualified())
.setRequiredAgentNumber(salaryResult.getRequiredAgentNumber())
.setRequiredTeamSalary(salaryResult.getRequiredTeamSalary());
} }
public BdAgentCountCO executeLastMonth(AppExtCommand cmd) { public BdAgentCountCO executeLastMonth(AppExtCommand cmd) {
@ -57,11 +68,20 @@ public class BdAgentCountQryExe {
.orElseGet(CollectionUtils::newArrayList); .orElseGet(CollectionUtils::newArrayList);
Long target = teamMemberTargetService.countLastMonthTeamMemberTarget(teamIds); Long target = teamMemberTargetService.countLastMonthTeamMemberTarget(teamIds);
Long agentQuantity = businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId());
// 计算BD薪资等级
BdSalaryPolicyUtils.BdSalaryResult salaryResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(agentQuantity, target);
return new BdAgentCountCO() return new BdAgentCountCO()
.setAgentQuantity( .setAgentQuantity(agentQuantity)
businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId()))
.setThisMonthTotalTarget(target) .setThisMonthTotalTarget(target)
.setThisMonthTotalTargetFormat(NumUtils.formatLong(target)); .setThisMonthTotalTargetFormat(NumUtils.formatLong(target))
.setBdLevel(salaryResult.getLevel())
.setForeverPercentage(salaryResult.getForeverPercentage())
.setQualified(salaryResult.getQualified())
.setRequiredAgentNumber(salaryResult.getRequiredAgentNumber())
.setRequiredTeamSalary(salaryResult.getRequiredTeamSalary());
} }
} }

View File

@ -0,0 +1,164 @@
package com.red.circle.other.app.util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
/**
* BD薪资政策工具类.
*
* @author system
*/
public class BdSalaryPolicyUtils {
/**
* BD薪资等级枚举.
*/
@Getter
@AllArgsConstructor
public enum BdSalaryLevel {
LEVEL_1(1, 3, 50, 1),
LEVEL_2(2, 5, 500, 2),
LEVEL_3(3, 7, 1000, 3),
LEVEL_4(4, 9, 3000, 4),
LEVEL_5(5, 10, 5000, 5);
private final int level;
private final int requiredAgentNumber;
private final int requiredTeamSalary;
private final int foreverPercentage;
}
/**
* 薪资政策结果.
*/
@Data
public static class BdSalaryResult {
/**
* 等级.
*/
private Integer level;
/**
* 永久百分比.
*/
private Integer foreverPercentage;
/**
* 是否达标.
*/
private Boolean qualified;
/**
* 需要的代理数量.
*/
private Integer requiredAgentNumber;
/**
* 需要的团队薪资.
*/
private Integer requiredTeamSalary;
public BdSalaryResult(Integer level, Integer foreverPercentage, Boolean qualified,
Integer requiredAgentNumber, Integer requiredTeamSalary) {
this.level = level;
this.foreverPercentage = foreverPercentage;
this.qualified = qualified;
this.requiredAgentNumber = requiredAgentNumber;
this.requiredTeamSalary = requiredTeamSalary;
}
}
/**
* 根据代理数量和团队薪资计算BD等级和百分比.
*
* @param agentQuantity 代理数量
* @param teamSalary 团队薪资
* @return BD薪资结果
*/
public static BdSalaryResult calculateBdSalaryLevel(Long agentQuantity, Long teamSalary) {
if (agentQuantity == null || teamSalary == null) {
return new BdSalaryResult(null, null, false, null, null);
}
int agentCount = agentQuantity.intValue();
int salary = teamSalary.intValue();
// 从高等级往低等级匹配
for (int i = BdSalaryLevel.values().length - 1; i >= 0; i--) {
BdSalaryLevel level = BdSalaryLevel.values()[i];
// 代理数量和团队薪资都要达标
if (agentCount >= level.getRequiredAgentNumber() && salary >= level.getRequiredTeamSalary()) {
return new BdSalaryResult(
level.getLevel(),
level.getForeverPercentage(),
true,
level.getRequiredAgentNumber(),
level.getRequiredTeamSalary()
);
}
}
// 如果都不达标返回最低等级要求
BdSalaryLevel lowestLevel = BdSalaryLevel.LEVEL_1;
return new BdSalaryResult(
0,
0,
false,
lowestLevel.getRequiredAgentNumber(),
lowestLevel.getRequiredTeamSalary()
);
}
/**
* 获取指定等级的薪资政策信息.
*
* @param level 等级
* @return 薪资政策信息
*/
public static BdSalaryResult getBdSalaryLevelInfo(int level) {
for (BdSalaryLevel salaryLevel : BdSalaryLevel.values()) {
if (salaryLevel.getLevel() == level) {
return new BdSalaryResult(
salaryLevel.getLevel(),
salaryLevel.getForeverPercentage(),
null,
salaryLevel.getRequiredAgentNumber(),
salaryLevel.getRequiredTeamSalary()
);
}
}
return null;
}
/**
* 获取下一个等级需要达到的条件.
*
* @param currentAgentQuantity 当前代理数量
* @param currentTeamSalary 当前团队薪资
* @return 下一个等级的要求如果已经是最高等级则返回null
*/
public static BdSalaryResult getNextLevelRequirement(Long currentAgentQuantity, Long currentTeamSalary) {
if (currentAgentQuantity == null || currentTeamSalary == null) {
return getBdSalaryLevelInfo(1);
}
BdSalaryResult currentResult = calculateBdSalaryLevel(currentAgentQuantity, currentTeamSalary);
// 如果当前没有达到任何等级返回最低等级要求
if (!currentResult.getQualified()) {
return getBdSalaryLevelInfo(1);
}
// 查找下一个等级
for (BdSalaryLevel level : BdSalaryLevel.values()) {
if (level.getLevel() > currentResult.getLevel()) {
return getBdSalaryLevelInfo(level.getLevel());
}
}
// 已经是最高等级
return null;
}
}

View File

@ -34,4 +34,29 @@ public class BdAgentCountCO extends ClientObject {
*/ */
private String thisMonthTotalTargetFormat; private String thisMonthTotalTargetFormat;
/**
* BD等级.
*/
private Integer bdLevel;
/**
* 永久百分比.
*/
private Integer foreverPercentage;
/**
* 是否达标.
*/
private Boolean qualified;
/**
* 需要的代理数量.
*/
private Integer requiredAgentNumber;
/**
* 需要的团队薪资.
*/
private Integer requiredTeamSalary;
} }

View File

@ -0,0 +1,111 @@
import com.red.circle.other.app.util.BdSalaryPolicyUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
/**
* BD薪资政策工具类测试.
*
* @author system
*/
public class BdSalaryPolicyUtilsTest {
@Test
public void testCalculateBdSalaryLevel() {
// 测试等级1 - 3个代理$50团队薪资1%
BdSalaryPolicyUtils.BdSalaryResult result1 = BdSalaryPolicyUtils.calculateBdSalaryLevel(3L, 50L);
Assertions.assertEquals(1, result1.getLevel());
Assertions.assertEquals(1, result1.getForeverPercentage());
Assertions.assertTrue(result1.getQualified());
// 测试等级2 - 5个代理$500团队薪资2%
BdSalaryPolicyUtils.BdSalaryResult result2 = BdSalaryPolicyUtils.calculateBdSalaryLevel(5L, 500L);
Assertions.assertEquals(2, result2.getLevel());
Assertions.assertEquals(2, result2.getForeverPercentage());
Assertions.assertTrue(result2.getQualified());
// 测试等级3 - 7个代理$1000团队薪资3%
BdSalaryPolicyUtils.BdSalaryResult result3 = BdSalaryPolicyUtils.calculateBdSalaryLevel(7L, 1000L);
Assertions.assertEquals(3, result3.getLevel());
Assertions.assertEquals(3, result3.getForeverPercentage());
Assertions.assertTrue(result3.getQualified());
// 测试等级4 - 9个代理$3000团队薪资4%
BdSalaryPolicyUtils.BdSalaryResult result4 = BdSalaryPolicyUtils.calculateBdSalaryLevel(9L, 3000L);
Assertions.assertEquals(4, result4.getLevel());
Assertions.assertEquals(4, result4.getForeverPercentage());
Assertions.assertTrue(result4.getQualified());
// 测试等级5 - 10个代理$5000团队薪资5%
BdSalaryPolicyUtils.BdSalaryResult result5 = BdSalaryPolicyUtils.calculateBdSalaryLevel(10L, 5000L);
Assertions.assertEquals(5, result5.getLevel());
Assertions.assertEquals(5, result5.getForeverPercentage());
Assertions.assertTrue(result5.getQualified());
// 测试不达标情况 - 代理数量不足
BdSalaryPolicyUtils.BdSalaryResult resultNotQualified1 = BdSalaryPolicyUtils.calculateBdSalaryLevel(2L, 100L);
Assertions.assertNull(resultNotQualified1.getLevel());
Assertions.assertNull(resultNotQualified1.getForeverPercentage());
Assertions.assertFalse(resultNotQualified1.getQualified());
// 测试不达标情况 - 团队薪资不足
BdSalaryPolicyUtils.BdSalaryResult resultNotQualified2 = BdSalaryPolicyUtils.calculateBdSalaryLevel(5L, 30L);
Assertions.assertNull(resultNotQualified2.getLevel());
Assertions.assertNull(resultNotQualified2.getForeverPercentage());
Assertions.assertFalse(resultNotQualified2.getQualified());
// 测试边界情况 - 刚好达到等级3的要求
BdSalaryPolicyUtils.BdSalaryResult resultBoundary = BdSalaryPolicyUtils.calculateBdSalaryLevel(7L, 1000L);
Assertions.assertEquals(3, resultBoundary.getLevel());
Assertions.assertTrue(resultBoundary.getQualified());
// 测试超过最高等级的情况
BdSalaryPolicyUtils.BdSalaryResult resultMax = BdSalaryPolicyUtils.calculateBdSalaryLevel(15L, 10000L);
Assertions.assertEquals(5, resultMax.getLevel());
Assertions.assertEquals(5, resultMax.getForeverPercentage());
Assertions.assertTrue(resultMax.getQualified());
}
@Test
public void testGetBdSalaryLevelInfo() {
BdSalaryPolicyUtils.BdSalaryResult levelInfo = BdSalaryPolicyUtils.getBdSalaryLevelInfo(3);
Assertions.assertEquals(3, levelInfo.getLevel());
Assertions.assertEquals(3, levelInfo.getForeverPercentage());
Assertions.assertEquals(7, levelInfo.getRequiredAgentNumber());
Assertions.assertEquals(1000, levelInfo.getRequiredTeamSalary());
// 测试不存在的等级
BdSalaryPolicyUtils.BdSalaryResult invalidLevel = BdSalaryPolicyUtils.getBdSalaryLevelInfo(10);
Assertions.assertNull(invalidLevel);
}
@Test
public void testGetNextLevelRequirement() {
// 测试当前等级1获取等级2的要求
BdSalaryPolicyUtils.BdSalaryResult nextLevel = BdSalaryPolicyUtils.getNextLevelRequirement(3L, 50L);
Assertions.assertEquals(2, nextLevel.getLevel());
Assertions.assertEquals(5, nextLevel.getRequiredAgentNumber());
Assertions.assertEquals(500, nextLevel.getRequiredTeamSalary());
// 测试当前没达到任何等级
BdSalaryPolicyUtils.BdSalaryResult firstLevel = BdSalaryPolicyUtils.getNextLevelRequirement(1L, 10L);
Assertions.assertEquals(1, firstLevel.getLevel());
// 测试已经是最高等级
BdSalaryPolicyUtils.BdSalaryResult maxLevel = BdSalaryPolicyUtils.getNextLevelRequirement(10L, 5000L);
Assertions.assertNull(maxLevel);
}
@Test
public void testNullInputs() {
BdSalaryPolicyUtils.BdSalaryResult nullResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(null, null);
Assertions.assertNull(nullResult.getLevel());
Assertions.assertNull(nullResult.getForeverPercentage());
Assertions.assertFalse(nullResult.getQualified());
BdSalaryPolicyUtils.BdSalaryResult nullAgentResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(null, 1000L);
Assertions.assertFalse(nullAgentResult.getQualified());
BdSalaryPolicyUtils.BdSalaryResult nullSalaryResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(5L, null);
Assertions.assertFalse(nullSalaryResult.getQualified());
}
}