|
@@ -1,5 +1,6 @@
|
|
|
package com.dayou.brokerage.handler;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.dayou.bo.BrokerageDetailBO;
|
|
|
import com.dayou.bo.LeaderRatioBO;
|
|
|
import com.dayou.brokerage.BrokerageCalculateSupport;
|
|
@@ -7,14 +8,15 @@ import com.dayou.brokerage.MarketerBrokerageCalculator;
|
|
|
import com.dayou.brokerage.constants.BrokerageMode;
|
|
|
import com.dayou.brokerage.constants.BrokerageRule;
|
|
|
import com.dayou.brokerage.constants.BrokerageState;
|
|
|
+import com.dayou.common.BaseEntity;
|
|
|
+import com.dayou.dto.ItemDTO;
|
|
|
+import com.dayou.entity.BrokeragePostRatio;
|
|
|
+import com.dayou.entity.Item;
|
|
|
import com.dayou.entity.ItemBrokerageDetail;
|
|
|
import com.dayou.entity.UserTarget;
|
|
|
import com.dayou.enums.GlobalConfigEnum;
|
|
|
import com.dayou.exception.BusinessException;
|
|
|
-import com.dayou.service.IMarketStatService;
|
|
|
-import com.dayou.service.IPostCultivateService;
|
|
|
-import com.dayou.service.IUserService;
|
|
|
-import com.dayou.service.IUserTargetService;
|
|
|
+import com.dayou.service.*;
|
|
|
import com.google.common.cache.LoadingCache;
|
|
|
import com.google.common.collect.Sets;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -23,8 +25,10 @@ import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
+import java.util.function.Supplier;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.dayou.brokerage.constants.BrokerageMsg.*;
|
|
@@ -58,6 +62,12 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
|
|
|
@Autowired
|
|
|
private IUserService userService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IBrokeragePostRatioService brokeragePostRatioService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IItemBrokerageGeneralService generalService;
|
|
|
|
|
|
@Override
|
|
|
public BrokerageDetailBO predictPersonalAmount(BrokerageDetailBO bo) {
|
|
@@ -102,6 +112,7 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
checkItemBrokerageStatus(bo);
|
|
|
itemBrokerageDetails = leaderRatioBOSet.stream().map(x -> {
|
|
|
ItemBrokerageDetail itemBrokerageDetail = new ItemBrokerageDetail();
|
|
|
+ itemBrokerageDetail.setGeneralId(bo.getGeneralId());
|
|
|
itemBrokerageDetail.setUserId(x.getUserId());
|
|
|
itemBrokerageDetail.setAheadAmount(BigDecimal.ZERO);
|
|
|
itemBrokerageDetail.setAdvanceAmount(BigDecimal.ZERO);
|
|
@@ -110,13 +121,12 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
BrokerageRule brokerageRuleEnum = BrokerageRule.brokerageRule(x.getBrokerageRule());
|
|
|
switch (brokerageRuleEnum){
|
|
|
case LAND_SUPERVISOR_RULE:
|
|
|
- itemBrokerageDetail.setPredictAmount(supervisorAmount(bo, x, ratio));
|
|
|
+ itemBrokerageDetail.setPredictAmount(supervisorAmount(bo.getAmount(),x.getUserId(),x.getRatio(),ratio));
|
|
|
break;
|
|
|
case LAND_MANAGER_RULE:
|
|
|
- itemBrokerageDetail.setPredictAmount(managerAmount(bo, x));
|
|
|
+ itemBrokerageDetail.setPredictAmount(managerAmount(bo.getAmount(),bo.getUserId(),x.getUserId(),x.getRatio()));
|
|
|
break;
|
|
|
}
|
|
|
- itemBrokerageDetail.setActualAmount(actualAmount(itemBrokerageDetail.getPredictAmount()));
|
|
|
return itemBrokerageDetail;
|
|
|
}).collect(Collectors.toSet());
|
|
|
|
|
@@ -130,14 +140,30 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public BigDecimal supervisorAmount(BrokerageDetailBO bo, LeaderRatioBO leaderRatioBO,BigDecimal ratio) {
|
|
|
+ public BigDecimal actualTeamShareAmount(ItemBrokerageDetail itemBrokerageDetail) {
|
|
|
+ BrokeragePostRatio postRatio = brokeragePostRatioService.getOne(new LambdaQueryWrapper<BrokeragePostRatio>()
|
|
|
+ .eq(BrokeragePostRatio::getBrokerageRule, itemBrokerageDetail.getBrokerageRule()).eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
+ if (postRatio!=null && postRatio.getBrokerageRatio()!=null){
|
|
|
+ ItemDTO itemDTO = generalService.getItemByBrokerageGeneralId(itemBrokerageDetail.getGeneralId());
|
|
|
+ BrokerageRule brokerageRuleEnum = BrokerageRule.brokerageRule(itemBrokerageDetail.getBrokerageRule());
|
|
|
+ switch (brokerageRuleEnum){
|
|
|
+ case LAND_SUPERVISOR_RULE:
|
|
|
+ return supervisorAmount(itemDTO.getAmount(), itemBrokerageDetail.getUserId(),postRatio.getBrokerageRatio(), itemDTO.getRatio());
|
|
|
+ case LAND_MANAGER_RULE:
|
|
|
+ return managerAmount(itemDTO.getAmount(),itemDTO.getUserId(),itemBrokerageDetail.getUserId(),postRatio.getBrokerageRatio());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BigDecimal supervisorAmount(BigDecimal signAmount,Long supervisorId,BigDecimal postRatio, BigDecimal ratio) {
|
|
|
//营销主管的团队提成规则 : (合同额(团队签的)*项目类型提成系数 * 40% *0.5 )+ [合同额(团队签的)*项目类型提成系数*40%*0.5 * 实发系数(取决于团队回款目标是否完成)]
|
|
|
- BigDecimal amount = bo.getAmount()
|
|
|
+ BigDecimal amount = signAmount
|
|
|
.multiply(ratio.divide(HUNDRED))
|
|
|
- .multiply(leaderRatioBO.getRatio().divide(HUNDRED))
|
|
|
+ .multiply(postRatio.divide(HUNDRED))
|
|
|
.multiply(SUPERVISOR_BROKERAGE_SCALE);
|
|
|
|
|
|
- Long supervisorId = leaderRatioBO.getUserId();
|
|
|
//团队回款目标
|
|
|
BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(supervisorId).getPaymentTarget());
|
|
|
BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(supervisorId);
|
|
@@ -148,23 +174,23 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public BigDecimal managerAmount(BrokerageDetailBO bo, LeaderRatioBO leaderRatioBO) {
|
|
|
+ public BigDecimal managerAmount(BigDecimal signAmount,Long marketerId, Long managerId,BigDecimal postRatio) {
|
|
|
//部门经理的团队提成规则 :部门产值*3%+区域产值1.5% + (部门产值*浮动提成比例*0.2)+(部门产值*浮动提成比例*0.8*实发比例) 实发比例(取决于团队回款目标是否完成)
|
|
|
//部门产值
|
|
|
- BigDecimal departmentAmount = bo.getAmount()
|
|
|
- .multiply(leaderRatioBO.getRatio().divide(HUNDRED))
|
|
|
+ BigDecimal departmentAmount = signAmount
|
|
|
+ .multiply(postRatio.divide(HUNDRED))
|
|
|
.multiply(new BigDecimal("2"));
|
|
|
BigDecimal areaAmount = BigDecimal.ZERO;
|
|
|
//开单人员的营销主管集合
|
|
|
- Set<LeaderRatioBO> leaders = userService.getLeaderRatioBO(bo.getUserId()).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
|
|
|
+ Set<LeaderRatioBO> leaders = userService.getLeaderRatioBO(marketerId).stream().filter(x->x.getPostName().equals(SUPERVISOR)).collect(Collectors.toSet());
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(leaders)){
|
|
|
//区域产值
|
|
|
- areaAmount = bo.getAmount().multiply(leaderRatioBO.getRatio().divide(HUNDRED));
|
|
|
+ areaAmount = signAmount.multiply(postRatio.divide(HUNDRED));
|
|
|
}
|
|
|
|
|
|
// 获取发展的营销主管个数
|
|
|
- Integer cultivateNum = postCultivateService.countCultivate(SUPERVISOR, leaderRatioBO.getUserId());
|
|
|
+ Integer cultivateNum = postCultivateService.countCultivate(SUPERVISOR, managerId);
|
|
|
BigDecimal cultivateRate ;
|
|
|
if (cultivateNum<4){
|
|
|
cultivateRate = CULTIVATE_LOW_4;
|
|
@@ -173,13 +199,13 @@ public class LandMarketerBrokerageHandler extends BrokerageCalculateSupport impl
|
|
|
}else {
|
|
|
cultivateRate = CULTIVATE_HIGH_6;
|
|
|
}
|
|
|
- BigDecimal floatAmount = bo.getAmount().multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_2);
|
|
|
+ BigDecimal floatAmount = signAmount.multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_2);
|
|
|
|
|
|
//团队回款目标
|
|
|
- BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(leaderRatioBO.getUserId()).getPaymentTarget());
|
|
|
- BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(leaderRatioBO.getUserId());
|
|
|
+ BigDecimal teamPaymentTarget = BigDecimal.valueOf(userTargetService.getTeamTarget(managerId).getPaymentTarget());
|
|
|
+ BigDecimal teamCurrentYearPayment = marketStatService.currentYearTeamPayment(managerId);
|
|
|
if (checkTeamMonthlyPayment(teamCurrentYearPayment, teamPaymentTarget)){
|
|
|
- floatAmount = floatAmount.add(bo.getAmount().multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_8));
|
|
|
+ floatAmount = floatAmount.add(signAmount.multiply(cultivateRate).multiply(MANAGER_FLOAT_RATIO_8));
|
|
|
}
|
|
|
return departmentAmount.add(areaAmount).add(floatAmount);
|
|
|
}
|