bd 计算工资数据结构调整

This commit is contained in:
tianfeng 2025-11-25 11:46:13 +08:00
parent d7e8dc09a2
commit 134db834cc
3 changed files with 58 additions and 40 deletions

View File

@ -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.endpoint.InAppPurchaseDetailsClient;
import com.red.circle.order.inner.model.dto.inapp.BatchUserRechargeStatisticsDTO; 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.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.TeamBdMemberBillCO;
import com.red.circle.other.app.dto.clientobject.TeamBdMemberCO; import com.red.circle.other.app.dto.clientobject.TeamBdMemberCO;
import com.red.circle.other.app.dto.clientobject.team.BdHistoryCO; import com.red.circle.other.app.dto.clientobject.team.BdHistoryCO;
@ -438,32 +439,32 @@ public class TeamBdMemberBillListQryExe {
List<BdSalaryPolicy> rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE); List<BdSalaryPolicy> rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE);
// 匹配政策1Team Salary Policy // 匹配政策1Team Salary Policy
BigDecimal salarySalary = BdSalarySettlementServiceImpl.matchAndCalculate( SalaryCalcResult salaryResult = BdSalarySettlementServiceImpl.matchAndCalculate(
salaryPolicies, agencyNumber, teamSalaryAmount, BdPolicyType.TEAM_SALARY, tempRecord); salaryPolicies, agencyNumber, teamSalaryAmount);
currentBill.setBdIncomeSalary(salarySalary); currentBill.setBdIncomeSalary(salaryResult.getSalary());
currentBill.setBdRatioSalary(tempRecord.getCommissionRate()); currentBill.setBdRatioSalary(salaryResult.getCommissionRate());
// 匹配政策2Team Recharge Policy // 匹配政策2Team Recharge Policy
BigDecimal rechargeSalary = BdSalarySettlementServiceImpl.matchAndCalculate( SalaryCalcResult rechargeResult = BdSalarySettlementServiceImpl.matchAndCalculate(
rechargePolicies, agencyNumber, teamRechargeAmount, BdPolicyType.TEAM_RECHARGE, tempRecord); rechargePolicies, agencyNumber, teamRechargeAmount);
currentBill.setBdIncomeRecharge(rechargeSalary); currentBill.setBdIncomeRecharge(rechargeResult.getSalary());
currentBill.setBdRatioRecharge(tempRecord.getCommissionRate()); currentBill.setBdRatioRecharge(rechargeResult.getCommissionRate());
// 选择最高工资并设置相关字段 // 选择最高工资并设置相关字段
if (salarySalary.compareTo(rechargeSalary) >= 0) { if (salaryResult.getSalary().compareTo(rechargeResult.getSalary()) >= 0) {
currentBill.setHitPolicyType(BdPolicyType.TEAM_SALARY.name()); currentBill.setHitPolicyType(BdPolicyType.TEAM_SALARY.name());
currentBill.setSettlementSalary(salarySalary); currentBill.setHitLevel(salaryResult.getHitLevel());
currentBill.setCommissionRate(salaryResult.getCommissionRate());
currentBill.setSettlementSalary(salaryResult.getSalary());
} else { } else {
currentBill.setHitPolicyType(BdPolicyType.TEAM_RECHARGE.name()); 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; return currentBill;
} }
} }

View File

@ -5,7 +5,7 @@ import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.framework.dto.ResultResponse; import com.red.circle.framework.dto.ResultResponse;
import com.red.circle.other.app.dto.clientobject.BdSalarySettlementCO; import com.red.circle.other.app.dto.clientobject.BdSalarySettlementCO;
import com.red.circle.other.app.dto.clientobject.BdTeamStatisticsCO; 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.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.infra.database.mongo.entity.bd.detail.BdTeamMemberDetail; 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 com.red.circle.wallet.inner.model.enums.UserBankWaterEvent;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -383,20 +382,24 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService
List<BdSalaryPolicy> rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE); List<BdSalaryPolicy> rechargePolicies = bdSalaryPolicyService.listEnabledByType(BdPolicyType.TEAM_RECHARGE);
// 匹配政策1Team Salary Policy // 匹配政策1Team Salary Policy
BigDecimal salarySalary = matchAndCalculate(salaryPolicies, teamStatistics.getAgencyNumber(), SalaryCalcResult salaryResult = matchAndCalculate(salaryPolicies, teamStatistics.getAgencyNumber(),
teamStatistics.getTeamSalaryAmount(), BdPolicyType.TEAM_SALARY, record); teamStatistics.getTeamSalaryAmount());
// 匹配政策2Team Recharge Policy // 匹配政策2Team Recharge Policy
BigDecimal rechargeSalary = matchAndCalculate(rechargePolicies, teamStatistics.getAgencyNumber(), SalaryCalcResult rechargeResult = matchAndCalculate(rechargePolicies, teamStatistics.getAgencyNumber(),
teamStatistics.getTeamRechargeAmount(), BdPolicyType.TEAM_RECHARGE, record); teamStatistics.getTeamRechargeAmount());
// 选择最高工资 // 选择最高工资
if (salarySalary.compareTo(rechargeSalary) >= 0) { if (salaryResult.getSalary().compareTo(rechargeResult.getSalary()) >= 0) {
record.setHitPolicyType(BdPolicyType.TEAM_SALARY); record.setHitPolicyType(BdPolicyType.TEAM_SALARY);
record.setSettlementSalary(salarySalary); record.setHitLevel(salaryResult.getHitLevel());
record.setCommissionRate(salaryResult.getCommissionRate());
record.setSettlementSalary(salaryResult.getSalary());
} else { } else {
record.setHitPolicyType(BdPolicyType.TEAM_RECHARGE); record.setHitPolicyType(BdPolicyType.TEAM_RECHARGE);
record.setSettlementSalary(rechargeSalary); record.setHitLevel(rechargeResult.getHitLevel());
record.setCommissionRate(rechargeResult.getCommissionRate());
record.setSettlementSalary(rechargeResult.getSalary());
} }
return record; return record;
@ -405,11 +408,10 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService
/** /**
* 匹配政策并计算工资. * 匹配政策并计算工资.
*/ */
public static BigDecimal matchAndCalculate(List<BdSalaryPolicy> policies, Integer agencyNumber, public static SalaryCalcResult matchAndCalculate(List<BdSalaryPolicy> policies, Integer agencyNumber,
BigDecimal teamAmount, BdPolicyType policyType, BigDecimal teamAmount) {
BdSalarySettlementRecord record) {
if (CollectionUtils.isEmpty(policies)) { if (CollectionUtils.isEmpty(policies)) {
return BigDecimal.ZERO; return new SalaryCalcResult(BigDecimal.ZERO, 0, BigDecimal.ZERO);
} }
// 按等级倒序排序匹配最高等级 // 按等级倒序排序匹配最高等级
@ -424,18 +426,11 @@ public class BdSalarySettlementServiceImpl implements BdSalarySettlementService
BigDecimal salary = teamAmount.multiply(policy.getCommissionRate()) BigDecimal salary = teamAmount.multiply(policy.getCommissionRate())
.divide(new BigDecimal("100"), 2, RoundingMode.DOWN); .divide(new BigDecimal("100"), 2, RoundingMode.DOWN);
// 记录命中的政策信息如果这个政策更优 return new SalaryCalcResult(salary, policy.getLevel(), policy.getCommissionRate());
if (policyType == BdPolicyType.TEAM_SALARY &&
(record.getHitPolicyType() == null || record.getHitPolicyType() == BdPolicyType.TEAM_SALARY)) {
record.setHitLevel(policy.getLevel());
record.setCommissionRate(policy.getCommissionRate());
}
return salary;
} }
} }
return BigDecimal.ZERO; return new SalaryCalcResult(BigDecimal.ZERO, 0, BigDecimal.ZERO);
} }
/** /**

View File

@ -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;
}
}