增加foreverPercentage字段 计算bd下的薪资等级
This commit is contained in:
parent
7654f728af
commit
e8210b967f
@ -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.tool.core.collection.CollectionUtils;
|
||||
import com.red.circle.tool.core.num.NumUtils;
|
||||
import com.red.circle.other.app.util.BdSalaryPolicyUtils;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
@ -39,11 +40,21 @@ public class BdAgentCountQryExe {
|
||||
.orElseGet(CollectionUtils::newArrayList);
|
||||
|
||||
Long target = teamMemberTargetService.countThisMonthTeamMemberTarget(teamIds);
|
||||
Long agentQuantity = businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId());
|
||||
|
||||
// 计算BD薪资等级
|
||||
BdSalaryPolicyUtils.BdSalaryResult salaryResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(agentQuantity, target);
|
||||
|
||||
return new BdAgentCountCO()
|
||||
.setAgentQuantity(
|
||||
businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId()))
|
||||
.setAgentQuantity(agentQuantity)
|
||||
.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) {
|
||||
@ -57,11 +68,20 @@ public class BdAgentCountQryExe {
|
||||
.orElseGet(CollectionUtils::newArrayList);
|
||||
|
||||
Long target = teamMemberTargetService.countLastMonthTeamMemberTarget(teamIds);
|
||||
Long agentQuantity = businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId());
|
||||
|
||||
// 计算BD薪资等级
|
||||
BdSalaryPolicyUtils.BdSalaryResult salaryResult = BdSalaryPolicyUtils.calculateBdSalaryLevel(agentQuantity, target);
|
||||
|
||||
return new BdAgentCountCO()
|
||||
.setAgentQuantity(
|
||||
businessDevelopmentTeamService.countTeamByBdUserId(cmd.requiredReqUserId()))
|
||||
.setAgentQuantity(agentQuantity)
|
||||
.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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -34,4 +34,29 @@ public class BdAgentCountCO extends ClientObject {
|
||||
*/
|
||||
private String thisMonthTotalTargetFormat;
|
||||
|
||||
/**
|
||||
* BD等级.
|
||||
*/
|
||||
private Integer bdLevel;
|
||||
|
||||
/**
|
||||
* 永久百分比.
|
||||
*/
|
||||
private Integer foreverPercentage;
|
||||
|
||||
/**
|
||||
* 是否达标.
|
||||
*/
|
||||
private Boolean qualified;
|
||||
|
||||
/**
|
||||
* 需要的代理数量.
|
||||
*/
|
||||
private Integer requiredAgentNumber;
|
||||
|
||||
/**
|
||||
* 需要的团队薪资.
|
||||
*/
|
||||
private Integer requiredTeamSalary;
|
||||
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user