diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/bd/query/TeamBdMemberBillListQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/bd/query/TeamBdMemberBillListQryExe.java index f52d2f60..e9bfab43 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/bd/query/TeamBdMemberBillListQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/bd/query/TeamBdMemberBillListQryExe.java @@ -8,6 +8,7 @@ import com.red.circle.framework.dto.ResultResponse; import com.red.circle.order.inner.endpoint.InAppPurchaseDetailsClient; import com.red.circle.order.inner.model.dto.inapp.BatchUserRechargeStatisticsDTO; import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; +import com.red.circle.other.app.dto.clientobject.SalaryCalcResult; import com.red.circle.other.app.dto.clientobject.TeamBdMemberBillCO; import com.red.circle.other.app.dto.clientobject.TeamBdMemberCO; import com.red.circle.other.app.dto.clientobject.team.BdHistoryCO; @@ -438,32 +439,32 @@ public class TeamBdMemberBillListQryExe { List rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE); // 匹配政策1:Team Salary Policy - BigDecimal salarySalary = BdSalarySettlementServiceImpl.matchAndCalculate( - salaryPolicies, agencyNumber, teamSalaryAmount, BdPolicyType.TEAM_SALARY, tempRecord); + SalaryCalcResult salaryResult = BdSalarySettlementServiceImpl.matchAndCalculate( + salaryPolicies, agencyNumber, teamSalaryAmount); - currentBill.setBdIncomeSalary(salarySalary); - currentBill.setBdRatioSalary(tempRecord.getCommissionRate()); + currentBill.setBdIncomeSalary(salaryResult.getSalary()); + currentBill.setBdRatioSalary(salaryResult.getCommissionRate()); // 匹配政策2:Team Recharge Policy - BigDecimal rechargeSalary = BdSalarySettlementServiceImpl.matchAndCalculate( - rechargePolicies, agencyNumber, teamRechargeAmount, BdPolicyType.TEAM_RECHARGE, tempRecord); + SalaryCalcResult rechargeResult = BdSalarySettlementServiceImpl.matchAndCalculate( + rechargePolicies, agencyNumber, teamRechargeAmount); - currentBill.setBdIncomeRecharge(rechargeSalary); - currentBill.setBdRatioRecharge(tempRecord.getCommissionRate()); + currentBill.setBdIncomeRecharge(rechargeResult.getSalary()); + currentBill.setBdRatioRecharge(rechargeResult.getCommissionRate()); // 选择最高工资并设置相关字段 - if (salarySalary.compareTo(rechargeSalary) >= 0) { + if (salaryResult.getSalary().compareTo(rechargeResult.getSalary()) >= 0) { currentBill.setHitPolicyType(BdPolicyType.TEAM_SALARY.name()); - currentBill.setSettlementSalary(salarySalary); + currentBill.setHitLevel(salaryResult.getHitLevel()); + currentBill.setCommissionRate(salaryResult.getCommissionRate()); + currentBill.setSettlementSalary(salaryResult.getSalary()); } else { currentBill.setHitPolicyType(BdPolicyType.TEAM_RECHARGE.name()); - currentBill.setSettlementSalary(rechargeSalary); + currentBill.setHitLevel(rechargeResult.getHitLevel()); + currentBill.setCommissionRate(rechargeResult.getCommissionRate()); + currentBill.setSettlementSalary(rechargeResult.getSalary()); } - - // 设置命中的政策等级和提成比例 - currentBill.setHitLevel(tempRecord.getHitLevel()); - currentBill.setCommissionRate(tempRecord.getCommissionRate()); - + return currentBill; } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/BdSalarySettlementServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/BdSalarySettlementServiceImpl.java index 98577041..b856f73b 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/BdSalarySettlementServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/BdSalarySettlementServiceImpl.java @@ -5,7 +5,7 @@ import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; import com.red.circle.framework.dto.ResultResponse; import com.red.circle.other.app.dto.clientobject.BdSalarySettlementCO; import com.red.circle.other.app.dto.clientobject.BdTeamStatisticsCO; -import com.red.circle.other.app.util.DateTimeAsiaRiyadhUtils; +import com.red.circle.other.app.dto.clientobject.SalaryCalcResult; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.infra.database.mongo.entity.bd.detail.BdTeamMemberDetail; @@ -33,7 +33,6 @@ import com.red.circle.wallet.inner.model.dto.UserBankRunningWaterDTO; import com.red.circle.wallet.inner.model.enums.UserBankWaterEvent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -383,20 +382,24 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService List rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE); // 匹配政策1:Team Salary Policy - BigDecimal salarySalary = matchAndCalculate(salaryPolicies, teamStatistics.getAgencyNumber(), - teamStatistics.getTeamSalaryAmount(), BdPolicyType.TEAM_SALARY, record); + SalaryCalcResult salaryResult = matchAndCalculate(salaryPolicies, teamStatistics.getAgencyNumber(), + teamStatistics.getTeamSalaryAmount()); // 匹配政策2:Team Recharge Policy - BigDecimal rechargeSalary = matchAndCalculate(rechargePolicies, teamStatistics.getAgencyNumber(), - teamStatistics.getTeamRechargeAmount(), BdPolicyType.TEAM_RECHARGE, record); + SalaryCalcResult rechargeResult = matchAndCalculate(rechargePolicies, teamStatistics.getAgencyNumber(), + teamStatistics.getTeamRechargeAmount()); // 选择最高工资 - if (salarySalary.compareTo(rechargeSalary) >= 0) { + if (salaryResult.getSalary().compareTo(rechargeResult.getSalary()) >= 0) { record.setHitPolicyType(BdPolicyType.TEAM_SALARY); - record.setSettlementSalary(salarySalary); + record.setHitLevel(salaryResult.getHitLevel()); + record.setCommissionRate(salaryResult.getCommissionRate()); + record.setSettlementSalary(salaryResult.getSalary()); } else { record.setHitPolicyType(BdPolicyType.TEAM_RECHARGE); - record.setSettlementSalary(rechargeSalary); + record.setHitLevel(rechargeResult.getHitLevel()); + record.setCommissionRate(rechargeResult.getCommissionRate()); + record.setSettlementSalary(rechargeResult.getSalary()); } return record; @@ -405,11 +408,10 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService /** * 匹配政策并计算工资. */ - public static BigDecimal matchAndCalculate(List policies, Integer agencyNumber, - BigDecimal teamAmount, BdPolicyType policyType, - BdSalarySettlementRecord record) { + public static SalaryCalcResult matchAndCalculate(List policies, Integer agencyNumber, + BigDecimal teamAmount) { if (CollectionUtils.isEmpty(policies)) { - return BigDecimal.ZERO; + return new SalaryCalcResult(BigDecimal.ZERO, 0, BigDecimal.ZERO); } // 按等级倒序排序,匹配最高等级 @@ -419,23 +421,16 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService // 必须同时满足 Agent 数量和团队金额 if (agencyNumber >= policy.getRequiredAgencyNumber() && teamAmount.compareTo(policy.getRequiredTeamAmount()) >= 0) { - + // 计算工资:团队金额 * 提成比例 BigDecimal salary = teamAmount.multiply(policy.getCommissionRate()) .divide(new BigDecimal("100"), 2, RoundingMode.DOWN); - - // 记录命中的政策信息(如果这个政策更优) - if (policyType == BdPolicyType.TEAM_SALARY && - (record.getHitPolicyType() == null || record.getHitPolicyType() == BdPolicyType.TEAM_SALARY)) { - record.setHitLevel(policy.getLevel()); - record.setCommissionRate(policy.getCommissionRate()); - } - - return salary; + + return new SalaryCalcResult(salary, policy.getLevel(), policy.getCommissionRate()); } } - return BigDecimal.ZERO; + return new SalaryCalcResult(BigDecimal.ZERO, 0, BigDecimal.ZERO); } /** diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/SalaryCalcResult.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/SalaryCalcResult.java new file mode 100644 index 00000000..51c14af6 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/SalaryCalcResult.java @@ -0,0 +1,22 @@ +package com.red.circle.other.app.dto.clientobject; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SalaryCalcResult { + + private BigDecimal salary; + + private Integer hitLevel; + + private BigDecimal commissionRate; + + public SalaryCalcResult(BigDecimal salary, Integer hitLevel, BigDecimal commissionRate) { + this.salary = salary; + this.hitLevel = hitLevel; + this.commissionRate = commissionRate; + } + +}