From e8210b967fcbd2a242b3c3138162f87d0fb8bc5b Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 26 Sep 2025 10:32:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0foreverPercentage=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=20=E8=AE=A1=E7=AE=97bd=E4=B8=8B=E7=9A=84=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E7=AD=89=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/query/BdAgentCountQryExe.java | 32 +++- .../other/app/util/BdSalaryPolicyUtils.java | 164 ++++++++++++++++++ .../dto/clientobject/team/BdAgentCountCO.java | 25 +++ .../test/java/BdSalaryPolicyUtilsTest.java | 111 ++++++++++++ 4 files changed, 326 insertions(+), 6 deletions(-) create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/util/BdSalaryPolicyUtils.java create mode 100644 rc-service/rc-service-other/other-start/src/test/java/BdSalaryPolicyUtilsTest.java diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/BdAgentCountQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/BdAgentCountQryExe.java index 28cb3b42..ff2b032a 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/BdAgentCountQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/BdAgentCountQryExe.java @@ -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()); } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/util/BdSalaryPolicyUtils.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/util/BdSalaryPolicyUtils.java new file mode 100644 index 00000000..2b4078ab --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/util/BdSalaryPolicyUtils.java @@ -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; + } +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/team/BdAgentCountCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/team/BdAgentCountCO.java index caf085e3..2c3fedf1 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/team/BdAgentCountCO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/team/BdAgentCountCO.java @@ -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; + } diff --git a/rc-service/rc-service-other/other-start/src/test/java/BdSalaryPolicyUtilsTest.java b/rc-service/rc-service-other/other-start/src/test/java/BdSalaryPolicyUtilsTest.java new file mode 100644 index 00000000..b6fbe13c --- /dev/null +++ b/rc-service/rc-service-other/other-start/src/test/java/BdSalaryPolicyUtilsTest.java @@ -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()); + } +}