## Q8以上奖衔升级处理;拓展奖V3 V4判断烧伤改为延缓发放;

This commit is contained in:
cabbage 2025-04-15 17:04:56 +08:00
parent 34a71d0321
commit 1202f1cc86
26 changed files with 605 additions and 405 deletions

View File

@ -29,4 +29,5 @@ public class BonusExpandDTO implements Serializable {
* 国家
*/
private Integer pkCountry;
}

View File

@ -794,4 +794,13 @@ public interface CuMemberTreeMapper extends BaseMapper<CuMemberTree> {
*/
Integer updateCuMemberSettleGradeByPeriod(@Param("updateTableName") String updateTableName, @Param("period") Integer period);
/**
* 查询左右区足够可以升级的会员
*
* @param settleTableName
* @param awardsValue
* @return
*/
List<CuMemberSettleExt> listUpgradeAwards(@Param("settleTableName") String settleTableName, @Param("awardsValue") Integer awardsValue);
}

View File

@ -668,4 +668,13 @@ public interface ICuMemberTreeService extends IService<CuMemberTree> {
*/
void updateCuMemberSettleGradeByPeriod(List<Integer> periodList);
/**
* 查询左右区足够可以升级的会员
*
* @param settleTableName
* @param awardsValue
* @return
*/
List<CuMemberSettleExt> listUpgradeAwards(String settleTableName, Integer awardsValue);
}

View File

@ -821,4 +821,9 @@ public class CuMemberTreeServiceImpl extends ServiceImpl<CuMemberTreeMapper, CuM
});
}
@Override
public List<CuMemberSettleExt> listUpgradeAwards(String settleTableName, Integer awardsValue) {
return baseMapper.listUpgradeAwards(settleTableName, awardsValue);
}
}

View File

@ -34,10 +34,8 @@ public interface ICuMemberService extends IService<CuMember> {
/**
* 更新会员奖衔根据临时表
*
* @param enoughAwardsMember 修改奖衔的会员
*/
void updateCuMemberByPeriod(List<CuMemberSettleExt> enoughAwardsMember, Integer period);
void updateCuMemberByPeriod(Integer period);
/**
* 更新会员奖衔根据临时表

View File

@ -38,7 +38,7 @@ public class CuMemberServiceImpl extends ServiceImpl<CuMemberMapper, CuMember> i
}
@Override
public void updateCuMemberByPeriod(List<CuMemberSettleExt> enoughAwardsMember, Integer period) {
public void updateCuMemberByPeriod(Integer period) {
baseMapper.updateCuMemberByPeriod(period);
}

View File

@ -16,12 +16,12 @@ import java.util.List;
*/
public interface CuBonusExpandMapper extends BaseMapper<CuBonusExpand> {
/*
* @description: 查询4-n配置
* @author: sui q
* @date: 2024/7/23 10:09
* @param: null null
**/
/**
* 查询4-n配置
*
* @param bonusExpandParam
* @return
*/
List<CuBonusExpandExt> queryBonusExpand(BonusExpandParam bonusExpandParam);
/*

View File

@ -39,11 +39,11 @@ import java.util.stream.Collectors;
public class BonusSettleAgentHandle extends BonusSettleHandle {
@DubboReference
IActivityServiceApi activityServiceApi;
IActivityServiceApi iActivityServiceApi;
// 代理直推 推荐给多少钱 代理复购 区域 所有订单的1%
@Autowired
private ICuMemberAgentService cuMemberAgentService;
private ICuMemberAgentService iCuMemberAgentService;
/**
* 计算嗨粉奖金
@ -63,9 +63,9 @@ public class BonusSettleAgentHandle extends BonusSettleHandle {
Date currentMonthFirstDate = DateUtils.currentMonthFirstDate(settleDate);
// 结算月下月第一天
Date nextMonthFirstDate = DateUtils.afterDate(1, ChronoUnit.DAYS, settleDate);
List<SaOrder> currentMonthOrderList = saOrderServiceApi.querySaOrderByDayForCloud(currentMonthFirstDate, nextMonthFirstDate).getData();
List<SaOrder> currentMonthOrderList = iSaOrderServiceApi.querySaOrderByDayForCloud(currentMonthFirstDate, nextMonthFirstDate).getData();
// 查询月末会员状态
Integer lastPeriod = cuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(settleDateStr).getPkId();
Integer lastPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(settleDateStr).getPkId();
String currentSettleTableName = TableNameConstants.CU_MEMBER_SETTLE + lastPeriod;
Set<Long> pkMemberSet = new HashSet<>();
// 获取配置
@ -75,7 +75,7 @@ public class BonusSettleAgentHandle extends BonusSettleHandle {
}
// 计算奖金 云代首购 首购订单1% 云代复购 复购订单1%
// 查询会员查询出所有代理的会员
Map<String, List<CuMemberAgent>> cuMemberAgentMap = cuMemberAgentService.queryCuMemberAgent();
Map<String, List<CuMemberAgent>> cuMemberAgentMap = iCuMemberAgentService.queryCuMemberAgent();
List<SaOrder> saOrderList = new ArrayList<>();
for (SaOrder saOrder : currentMonthOrderList) {
if (saOrder.getPkCountry() == null || saOrder.getRecProvince() == null || saOrder.getRecCity() == null) {
@ -92,7 +92,7 @@ public class BonusSettleAgentHandle extends BonusSettleHandle {
cuMemberAgentList.forEach(cuMemberAgent ->
pkMemberSet.add(cuMemberAgent.getPkMember()));
}
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleByMemberPk(currentSettleTableName, pkMemberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleByMemberPk(currentSettleTableName, pkMemberSet);
Map<Long, CuMemberSettleExt> cuMemberSettleExtMap = new HashMap<>();
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
Map<String, BdCurrencyDTO> currencyDtoMap = bonusConfigDTO.getCurrencyDtoMap();
@ -182,15 +182,15 @@ public class BonusSettleAgentHandle extends BonusSettleHandle {
}
// 复购券均分收益规则
List<AcRepurSharRuleConfigExt> repurSharRuleConfigExtList = activityServiceApi.queryRepurSharRuleConfig(currentMonthFirstDate, nextMonthFirstDate).getData();
List<AcRepurSharRuleConfigExt> repurSharRuleConfigExtList = iActivityServiceApi.queryRepurSharRuleConfig(currentMonthFirstDate, nextMonthFirstDate).getData();
if (CollectionUtil.isNotEmpty(repurSharRuleConfigExtList)) {
for (AcRepurSharRuleConfigExt acRepurSharRuleConfigExt : repurSharRuleConfigExtList) {
List<Integer> orderTypeList = acRepurSharRuleConfigExt.getRepurSharOrderTypeList().stream().distinct().map(AcRepurSharOrderType::getOrderType).collect(Collectors.toList());
List<SaOrder> orderList = saOrderServiceApi.querySaOrderByTimeForCouponShare(settleDate, nextMonthFirstDate, orderTypeList,
List<SaOrder> orderList = iSaOrderServiceApi.querySaOrderByTimeForCouponShare(settleDate, nextMonthFirstDate, orderTypeList,
acRepurSharRuleConfigExt.getOrderAmount(), acRepurSharRuleConfigExt.getOrderAchieve(), acRepurSharRuleConfigExt.getPkCountry()).getData();
if (CollectionUtil.isNotEmpty(orderList)) {
Set<Long> memberSet = orderList.stream().distinct().map(SaOrder::getPkMember).collect(Collectors.toSet());
cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleByMemberPk(currentSettleTableName, memberSet);
cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleByMemberPk(currentSettleTableName, memberSet);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
for (SaOrder saOrder : orderList) {
BigDecimal exchangeRate = BigDecimal.ONE;

View File

@ -64,7 +64,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 查询 各个国家 3单循环 4单循环的配置值
// 获得会员的轮按照订单时间进行
// 根据订单获取轮次要回写
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleBySaOrder(settleTableName, firPurchaseOrderList);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleBySaOrder(settleTableName, firPurchaseOrderList);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
// 推荐奖明细
List<CuMemberBonusPush> cuMemberBonusPushList = new ArrayList<>();
@ -95,7 +95,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
if (specialOrderList.size() > 0) {
Set<Long> memberSet = new HashSet<>();
specialOrderList.forEach(saOrderExt -> memberSet.add(saOrderExt.getPkMember()));
cuMemberSettleExtList = cuMemberTreeService.batchQuerySpecialCuMemberSettleParent(settleTableName, memberSet);
cuMemberSettleExtList = iCuMemberTreeService.batchQuerySpecialCuMemberSettleParent(settleTableName, memberSet);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
// 计算奖金
for (SaOrderExt saOrderExt : specialOrderList) {
@ -403,7 +403,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
/**
* 计算拓展收益
* 计算首购拓展收益
*
* @param settleTableName 结算表
* @param period 期间
@ -418,13 +418,17 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 根据开始期间结束期间查询
List<CuMemberBonusExpand> cuMemberBonusExpandList = new ArrayList<>();
// 获取所有订单的上级根据订单往上一步步计算
Map<Long, List<CuMemberSettleExt>> memberSettleMap = cuMemberTreeService.batchQueryCuMemberSettlePlaceParent(settleTableName, firPurchaseOrderList);
// key订单IDvalue订单向上找安置人列表
Map<Long, List<CuMemberSettleExt>> memberSettleMap = iCuMemberTreeService.batchQueryCuMemberSettlePlaceParent(settleTableName, firPurchaseOrderList);
// 获取复购考核结果
List<CuMemberSettleExt> queryMemberList = new ArrayList<>();
memberSettleMap.forEach((key, value) -> queryMemberList.addAll(value));
Map<Long, CuMemberAssess> cuMemberAssessMap = getLongCuMemberAssessMap(settleDate, queryMemberList);
for (SaOrderExt saOrderExt : firPurchaseOrderList) {
if (!validateSecondOrderExistBonus(saOrderExt, EBonusItems.EXPANSION_INCOME.getValue())) {
// 校验二次发货需不需要计算量碰
continue;
}
// 所有需要计算的父节点只计算新增
@ -441,7 +445,9 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
break;
}
}
List<CuMemberBonusExpand> expandList = calculateExpandBonusOne(riskControlMap, cuMemberAssessMap, settleTableName, cuMemberSettleExtMap, bonusConfigDTO, systemConfigMap, period, weekMemberBonusMap, cuMemberBonusMap, cuMemberSettleExtList, saOrderExt, true, addTouch, expandRatio, expandNumber);
// 计算量奖拓展收益
List<CuMemberBonusExpand> expandList = calculateExpandBonusOne(riskControlMap, cuMemberAssessMap, settleTableName, cuMemberSettleExtMap, bonusConfigDTO,
systemConfigMap, period, weekMemberBonusMap, cuMemberBonusMap, cuMemberSettleExtList, saOrderExt, true, addTouch, expandRatio, expandNumber);
if (expandList.size() > 0) {
cuMemberBonusExpandList.addAll(expandList);
}
@ -451,31 +457,140 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
/**
* @Description: 计算量奖
* @return: List<CuMemberBonusExpand>
* @Author: sui q
* @Date: 2023/2/4 14:18
* 计算首购量奖拓展收益
*
* @return
*/
List<CuMemberBonusExpand> calculateExpandBonusOne(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberAssess> cuMemberAssessMap, String settleTableName, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap,
Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap, List<CuMemberSettleExt> cuMemberSettleExtList, SaOrderExt saOrderExt, boolean flag, BigDecimal addTouch, BigDecimal expandRatio, Integer expandNumber) {
List<CuMemberBonusExpand> calculateExpandBonusOne(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberAssess> cuMemberAssessMap, String settleTableName,
Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap,
Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap,
List<CuMemberSettleExt> cuMemberSettleExtList, SaOrderExt saOrderExt, boolean flag,
BigDecimal addTouch, BigDecimal expandRatio, Integer expandNumber) {
List<CuMemberBonusExpand> cuMemberBonusExpandList = new ArrayList<>();
if (CollectionUtil.isEmpty(cuMemberSettleExtList)) {
return cuMemberBonusExpandList;
}
Map<Integer, BonusExpandDTO> bdBonusExpandMap = bonusConfigDTO.getBonusExpandMap();
// 先计算新增根据新增计算碰次
// 先进行初始化所有的安置人存储需要修改的值,cuMemberSettleExtMap最终修改的
if (flag) {
// 日结传入的true秒结传入的false
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
}
// 先准备值准备好值后开始计算计算碰次
int touchNum = calculateTouchNum(riskControlMap, cuMemberAssessMap, cuMemberSettleExtMap, saOrderExt, cuMemberSettleExtList, bonusConfigDTO);
// 有碰次计算拓展奖
if (touchNum > 0) {
// 判断是否>3 是否需要启动4-N4-N的参数按照伞上各安置人结算国家进行获取
// 先计算前3碰
int startTouch = touchNum;
// 后面碰次
int endTouch = 0;
// 获取拓展配置一般情况拓展次数 = 3拓展比例 = 26%
BonusExpandDTO bdBonusExpand = bdBonusExpandMap.get(saOrderExt.getPkCountry());
int realExpandNumber = expandNumber > 0 ? expandNumber : bdBonusExpand.getExpandNumber();
if (touchNum > realExpandNumber) {
startTouch = realExpandNumber;
endTouch = touchNum - startTouch;
}
// 正常的拓展奖计算
// 计算拓展奖
for (int i = 1; i <= startTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
// 验证是否有当前奖金项
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 根据会员等级获取对应的配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
BigDecimal countryExpandRatio = bdGrade.getExpandRatio();
// 计算量碰
calculateExpandBonusByAchieve(riskControlMap, period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList,
saOrderExt, touchNum, i, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, BigDecimal.ZERO, cuMemberAssessMap);
break;
}
}
}
// 4-N计算
if (endTouch > 0) {
// 获得每一碰的比例, 找到剩下的碰次的国家
for (int i = 1; i <= endTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
// 验证是否有当前奖金项
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 根据会员等级获取对应的拓展配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
// 获取实际拓展比例拓展配置计算出来的单个碰次 等级配置上限哪个小取哪个
BigDecimal countryExpandRatio = getCountryExpand(bonusConfigDTO, targetMemberSettleExt, endTouch, bdGrade, addTouch, expandRatio);
// 计算量碰
calculateExpandBonusByAchieve(riskControlMap, period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList,
saOrderExt, touchNum, i + startTouch, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, addTouch, cuMemberAssessMap);
break;
}
}
}
// 将增加的碰次放入烧伤
if (ComputeUtil.compareValue(addTouch)) {
CuMemberSettleExt sourceMemberSettleExt = cuMemberSettleExtMap.get(saOrderExt.getPkMember());
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(2L);
// 根据会员等级获取对应的拓展配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
// 获取实际拓展比例拓展配置计算出来的单个碰次 等级配置上限哪个小取哪个
BigDecimal countryExpandRatio = getCountryExpand(bonusConfigDTO, targetMemberSettleExt, endTouch, bdGrade, addTouch, expandRatio);
countryExpandRatio = ComputeUtil.computeMultiply(countryExpandRatio, addTouch);
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue());
CuMemberBonusExpand cuMemberBonusExpand = getCuMemberBonusExpand(saOrderExt, touchNum, touchNum, targetMemberSettleExt, countryExpandRatio, cuMemberBonus, saOrderExt.getOrderAchieve(), pkBonusItems, addTouch);
expandRemark(saOrderExt, cuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
BigDecimal maxIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), bdGrade.getExpandRatio());
BigDecimal actualIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), countryExpandRatio);
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), maxIncome, actualIncome);
setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
if (ComputeUtil.compareValue(addTouch)) {
cuMemberBonusExpand.setRemark(cuMemberBonusExpand.getRemark() + "增加碰次:" + addTouch + "");
}
cuMemberBonusExpandList.add(cuMemberBonusExpand);
}
}
}
return cuMemberBonusExpandList;
}
private int calculateTouchNum(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberAssess> cuMemberAssessMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap,
SaOrderExt saOrderExt, List<CuMemberSettleExt> cuMemberSettleExtList, BonusConfigDTO bonusConfigDTO) {
int touchNum = 0;
for (CuMemberSettleExt cuMemberSettleExt : cuMemberSettleExtList) {
// 数据已经准备好了肯定有值map中是实际的值先计算新增然后根据新增结算计算碰次list是为了存储碰次的顺序
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(cuMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus() ||
EGrade.START_UP.getValue() == targetMemberSettleExt.getGradeValue()) {
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()
|| EGrade.START_UP.getValue() == targetMemberSettleExt.getGradeValue()) {
continue;
}
// 验证是否计算奖金
@ -532,94 +647,14 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getRABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRBBalance())) {
// 取左区右区最小的那个业绩
// 左右右区都减掉最小的业绩就是左区右区的结余
BigDecimal minAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRABalance(), targetMemberSettleExt.getRBBalance());
targetMemberSettleExt.setRABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRABalance(), minAchieve));
targetMemberSettleExt.setRBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRBBalance(), minAchieve));
}
}
// 有碰次计算拓展奖
if (touchNum > 0) {
// 判断是否>3 是否需要启动4-N4-N的参数按照伞上各安置人结算国家进行获取
// 先计算前3碰
int startTouch = touchNum;
// 后面碰次
int endTouch = 0;
BonusExpandDTO bdBonusExpand = bdBonusExpandMap.get(saOrderExt.getPkCountry());
int realExpandNumber = expandNumber > 0 ? expandNumber : bdBonusExpand.getExpandNumber();
if (touchNum > realExpandNumber) {
startTouch = realExpandNumber;
endTouch = touchNum - startTouch;
}
// 正常的拓展奖计算
// 计算拓展奖
for (int i = 1; i <= startTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 根据会员等级获取对应的配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
BigDecimal countryExpandRatio = bdGrade.getExpandRatio();
calculateExpandBonusByAchieve(riskControlMap, period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList, saOrderExt, touchNum, i, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, BigDecimal.ZERO, cuMemberAssessMap);
break;
}
}
}
// 4-N计算
if (endTouch > 0) {
// 获得每一碰的比例, 找到剩下的碰次的国家
for (int i = 1; i <= endTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 根据会员等级获取对应的配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
// 获取国家4-n的配置
BigDecimal countryExpandRatio = getCountryExpand(bonusConfigDTO, targetMemberSettleExt, endTouch, bdGrade, addTouch, expandRatio);
calculateExpandBonusByAchieve(riskControlMap, period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList, saOrderExt, touchNum, i + startTouch, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, addTouch, cuMemberAssessMap);
break;
}
}
}
// 将增加的碰次放入烧伤
if (ComputeUtil.compareValue(addTouch)) {
CuMemberSettleExt sourceMemberSettleExt = cuMemberSettleExtMap.get(saOrderExt.getPkMember());
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(2L);
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
BigDecimal countryExpandRatio = getCountryExpand(bonusConfigDTO, targetMemberSettleExt, endTouch, bdGrade, addTouch, expandRatio);
countryExpandRatio = ComputeUtil.computeMultiply(countryExpandRatio, addTouch);
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue());
CuMemberBonusExpand cuMemberBonusExpand = getCuMemberBonusExpand(saOrderExt, touchNum, touchNum, targetMemberSettleExt, countryExpandRatio, cuMemberBonus, saOrderExt.getOrderAchieve(), pkBonusItems, addTouch);
expandRemark(saOrderExt, cuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
BigDecimal maxIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), bdGrade.getExpandRatio());
BigDecimal actualIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), countryExpandRatio);
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), maxIncome, actualIncome);
setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
if (ComputeUtil.compareValue(addTouch)) {
cuMemberBonusExpand.setRemark(cuMemberBonusExpand.getRemark() + "增加碰次:" + addTouch + "");
}
cuMemberBonusExpandList.add(cuMemberBonusExpand);
}
}
}
return cuMemberBonusExpandList;
return touchNum;
}
/**
@ -633,7 +668,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
List<CuMemberBonusCoach> cuMemberBonusCoachList = new ArrayList<>();
if (cuMemberBonusExpandList.size() > 0) {
Set<Long> expandMemberSet = getMemberExpandBonus(cuMemberBonusMap, cuMemberBonusExpandList);
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, expandMemberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, expandMemberSet);
// 初始化父类网体的值
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
List<CuMemberSettleExt> queryMemberList = getQueryMemberSettleExtList(cuMemberSettleExtMap, cuMemberSettleExtList);
@ -805,15 +840,13 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
/**
* 计算报单服务费
*
* @param settleTableName 结算表
* @param period 期间
* @param bonusConfigDTO 参数
* @param firPurchaseOrderList 订单列表
* @param cuMemberBonusMap 所有计算出来的奖金汇总
* @Description: 计算报单服务费
* @return: List<CuMemberBonusCoach>
* @Author: sui q
* @Date: 2022/11/17 14:14
*/
List<CuMemberBonusDetail> calculateServiceBonus(Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleDate, String settleTableName, BonusConfigDTO bonusConfigDTO,
List<SaOrderExt> firPurchaseOrderList, Integer period, Map<Long, CuMemberBonus> cuMemberBonusMap) {
@ -830,8 +863,8 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 计算报单服务费
for (SaOrderExt saOrderExt : firPurchaseOrderList) {
// 只有注册订单有报单服务费
if (EOrderType.REGISTER_ORDER.getValue() == saOrderExt.getOrderType() ||
Objects.equals(EOrderType.SPECIAL_REGISTER_ORDER.getValue(), saOrderExt.getOrderType())) {
if (EOrderType.REGISTER_ORDER.getValue() == saOrderExt.getOrderType()
|| Objects.equals(EOrderType.SPECIAL_REGISTER_ORDER.getValue(), saOrderExt.getOrderType())) {
CuMemberBonusDetail cuMemberBonusDetail = calculateServiceBonusOne(settleDate, cuMemberAssessMap, cuMemberSettleExtMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt);
if (cuMemberBonusDetail != null) {
cuMemberBonusDetailList.add(cuMemberBonusDetail);
@ -854,15 +887,18 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
return null;
}
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkCenterCode());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus() ||
ERegistrationAuthority.SERVICE.getValue() != targetMemberSettleExt.getRegisterAuthority()) {
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()
|| ERegistrationAuthority.SERVICE.getValue() != targetMemberSettleExt.getRegisterAuthority()) {
// 非正常会员停算收益不是服务中心都不进行处理
return null;
}
// 验证是否有奖金
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.SERVICE_SUBSIDIES.getValue())) {
return null;
}
// 获取会员奖金数据
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
BdBonusService bdBonusService = bonusConfigDTO.getBonusServiceMap().get(targetMemberSettleExt.getPkSettleCountry().toString() + EServiceType.SUBSIDY.getValue());
// if (bdBonusService.getAssessmentType() != null && EAssessmentType.REPURCHASE_ASSESS.getValue() == bdBonusService.getAssessmentType()) {
@ -914,20 +950,20 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
String currentFirstDate = DateUtils.currentMonthFirstDateStr(settleDate);
String beforeMonthLastDate = DateUtils.beforeDateStr(1, ChronoUnit.DAYS, DateUtils.YYYY_MM_DD, currentFirstDate);
// 查询上月最后一天
Integer beforeMonthLastPeriod = cuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(beforeMonthLastDate).getPkId();
Integer beforeMonthLastPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(beforeMonthLastDate).getPkId();
String settleTableName = TableNameConstants.CU_MEMBER_SETTLE + beforeMonthLastPeriod;
String rangeTableName = TableNameConstants.CU_MEMBER_RANGE + beforeMonthLastPeriod;
// 查询上月第一天
String beforeMonthFirstDate = DateUtils.beforeMonthFirstDateStr(settleDate);
Integer beforeMonthFirstPeriod = cuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(beforeMonthFirstDate).getPkId();
Integer beforeMonthFirstPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(beforeMonthFirstDate).getPkId();
// 查询上月最后一天会员等级达到奖衔的会员
Integer assessPeriod = cuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(currentFirstDate).getPkId();
Integer assessPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(currentFirstDate).getPkId();
String assessTableName = TableNameConstants.CU_MEMBER_ASSESS + DateUtils.getYear(settleDateStr);
// 获取结算日期的第一天的日期
// 查询复购考核结果
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.queryMemberSettleByAwards(settleTableName, rangeTableName, beforeMonthFirstPeriod, beforeMonthLastPeriod);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.queryMemberSettleByAwards(settleTableName, rangeTableName, beforeMonthFirstPeriod, beforeMonthLastPeriod);
if (CollectionUtil.isNotEmpty(cuMemberSettleExtList)) {
Map<Long, CuMemberAssess> cuMemberAssessMap = cuMemberAssessService.queryCuMemberAssessByMember(assessTableName, assessPeriod, EAssessmentType.REPURCHASE_ASSESS.getValue(), cuMemberSettleExtList);
Map<Long, CuMemberAssess> cuMemberAssessMap = iCuMemberAssessService.queryCuMemberAssessByMember(assessTableName, assessPeriod, EAssessmentType.REPURCHASE_ASSESS.getValue(), cuMemberSettleExtList);
for (CuMemberSettleExt targetMemberSettleExt : cuMemberSettleExtList) {
SaOrder saOrder = SaOrder.builder().pkId(0L).orderAchieve(BigDecimal.ZERO).build();
saOrder.setPkCountry(targetMemberSettleExt.getPkSettleCountry());
@ -971,7 +1007,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
repurchaseOrderList.forEach(saOrderExt -> expandMemberSet.add(saOrderExt.getPkMember()));
mallOrderList.forEach(saOrderExt -> expandMemberSet.add(saOrderExt.getPkMember()));
if (expandMemberSet.size() > 0) {
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, expandMemberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, expandMemberSet);
// 初始化父类网体的值
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
for (SaOrderExt saOrderExt : firPurchaseOrderList) {
@ -1018,6 +1054,8 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
/**
* 计算首购量碰
*
* @param period 期间
* @param cuMemberBonusMap 奖金汇总
* @param cuMemberBonusExpandList 拓展奖奖金明细
@ -1028,15 +1066,14 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
* @param targetMemberSettleExt 获得奖金的人
* @param bdGrade 等级对应的参数
* @param countryExpandRatio 4-n时计算国家对应的参数
* @Description: 计算量碰
* @return: void
* @Author: sui q
* @Date: 2022/11/16 15:51
*/
private void calculateExpandBonusByAchieve(Map<Long, CuMemberRiskControl> riskControlMap, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap,
BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, List<CuMemberBonusExpand> cuMemberBonusExpandList, SaOrderExt saOrderExt, int touchNum, int i,
CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt, BdGrade bdGrade, BigDecimal countryExpandRatio, BigDecimal addTouch, Map<Long, CuMemberAssess> cuMemberAssessMap) {
BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, List<CuMemberBonusExpand> cuMemberBonusExpandList,
SaOrderExt saOrderExt, int touchNum, int i, CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt,
BdGrade bdGrade, BigDecimal countryExpandRatio, BigDecimal addTouch, Map<Long, CuMemberAssess> cuMemberAssessMap) {
// 获取拓展收益奖项ID
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.EXPANSION_INCOME.getValue());
// 验证封顶方式 1= 2=若是周的话需要获取 周奖金
// BigDecimal weekExpandIncome = BigDecimal.ZERO;
// if (systemConfigMap.containsKey(targetMemberSettleExt.getPkSettleCountry().toString() + ESystemConfig.EXPAND_CAP_METHOD.getKey())) {
@ -1046,29 +1083,38 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// weekExpandIncome = weekMemberBonusMap.get(targetMemberSettleExt.getPkMember()).getExpandIncome();
// }
// }
// 等级对应拓展比例
BigDecimal gradeExpandRatio = bdGrade.getExpandRatio();
// 验证受益人等级
CuMember cuMember = cuMemberService.getMember(targetMemberSettleExt.getMemberCode());
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY) &&
cuMember != null && DateUtils.compareDate(DateUtils.parseStringToDate("2024-09-11"), cuMember.getPayTime()) > 0) {
if (targetMemberSettleExt.getGradeValue() == EGrade.VIP.getValue()) {
if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(11)) && (i <= 3 || touchNum <= 10)) {
countryExpandRatio = BigDecimal.valueOf(13);
}
} else if (targetMemberSettleExt.getGradeValue() == EGrade.MAKER.getValue()) {
if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(10)) && (i <= 3 || touchNum <= 10)) {
countryExpandRatio = BigDecimal.valueOf(11);
}
}
}
// TODO new 中国会员指定日期之前计算比例
// // 验证受益人等级
// CuMember cuMember = cuMemberService.getMember(targetMemberSettleExt.getMemberCode());
// if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)
// && cuMember != null
// && DateUtils.compareDate(DateUtils.parseStringToDate("2024-09-11"), cuMember.getPayTime()) > 0) {
// if (targetMemberSettleExt.getGradeValue() == EGrade.VIP.getValue()) {
// if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(11)) && (i <= 3 || touchNum <= 10)) {
// countryExpandRatio = BigDecimal.valueOf(13);
// }
// } else if (targetMemberSettleExt.getGradeValue() == EGrade.MAKER.getValue()) {
// if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(10)) && (i <= 3 || touchNum <= 10)) {
// countryExpandRatio = BigDecimal.valueOf(11);
// }
// }
// }
// 获取等级封顶值
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
// 左右区获取最小的
BigDecimal calAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getABalance(), targetMemberSettleExt.getBBalance());
CuMemberBonusExpand cuMemberBonusExpand = getCuMemberBonusExpand(saOrderExt, touchNum, i, targetMemberSettleExt, countryExpandRatio, cuMemberBonus, calAchieve, pkBonusItems, addTouch);
// 扣减ab区结余
targetMemberSettleExt.setABalance(ComputeUtil.computeSubtract(targetMemberSettleExt.getABalance(), calAchieve));
targetMemberSettleExt.setBBalance(ComputeUtil.computeSubtract(targetMemberSettleExt.getBBalance(), calAchieve));
// 计算收益 先计算出会员最大的收益
// 计算收益 先计算出会员最大的收益按等级拓展比例进行计算出最大值
BigDecimal maxIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), gradeExpandRatio);
BigDecimal actualIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), countryExpandRatio);
// K值设置
@ -1076,26 +1122,37 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
actualIncome = ComputeUtil.computeBonusMultiply(actualIncome, riskControlMap.get(cuMemberBonus.getPkMember()).getExpandRatio());
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.RISK_CONTROL.getValue());
}
// 获取等级对应的封顶值
// 获取等级对应的封顶值因为先计算复购再计算首购封顶需要把复购拓展也加上
BigDecimal expandIncome = ComputeUtil.computeAdd(ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), actualIncome), cuMemberBonus.getRepurExpandIncome());
// 判断收益 是否超过封顶值超过的话变为封顶值
// 判断是否烧伤判断原奖金是否>=封顶值,奖金到了就是烧伤
// 验证会员状态 封停状态跟冻结都正常计算奖金封停的账号发放的时候奖金发放为0冻结的账号正常发放不能登录
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), maxIncome, actualIncome);
if (ComputeUtil.compareValue(ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()), bdGrade.getExpandCapping())) {
// 拓展收益 累加 复购收益 >= 封顶值
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
expandIncome = ComputeUtil.computeSubtract(bdGrade.getExpandCapping(), ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()));
} else if (ComputeUtil.compareGreaterThan(expandIncome, bdGrade.getExpandCapping())) {
BigDecimal realIncome = ComputeUtil.computeSubtract(bdGrade.getExpandCapping(), ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()));
//存在一半烧伤一半正常的值拆2条
// 存在一半烧伤一半正常的值拆2条
// 拓展明细表 进行修改
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), realIncome, realIncome);
CuMemberBonusExpand fireCuMemberBonusExpand = BeanUtil.copyProperties(cuMemberBonusExpand, CuMemberBonusExpand.class);
BigDecimal fireIncome = ComputeUtil.computeSubtract(maxIncome, realIncome);
if (EBonusIncomeStatus.NORMAL.getValue() == fireCuMemberBonusExpand.getIncomeStatus()) {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
// TODO new V3 V4 没有烧伤改为延缓发放
if (EGrade.VIP.getValue() == bdGrade.getGradeValue()
|| EGrade.S_VIP.getValue() == bdGrade.getGradeValue()) {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.DELAY_GRANT.getValue());
} else {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
}
packageCuMemberBonusExpand(fireCuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), fireIncome, fireIncome);
// 收益占比
@ -1105,15 +1162,19 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 拓展收益取封顶最大值
expandIncome = bdGrade.getExpandCapping();
}
// 收益占比
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
expandRemark(saOrderExt, cuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
if (riskControlMap.containsKey(cuMemberBonus.getPkMember())) {
cuMemberBonusExpand.setRemark(cuMemberBonusExpand.getRemark() + "K值比例:" + riskControlMap.get(cuMemberBonus.getPkMember()).getExpandRatio() + "");
}
if (ComputeUtil.compareValue(addTouch)) {
cuMemberBonusExpand.setRemark(cuMemberBonusExpand.getRemark() + "增加碰次:" + addTouch + "");
}
// 正常状态的辅导奖需要判断复购考核复购考核不通过的状态变为烧伤
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()
&& EYesNo.NO.getIntValue() == targetMemberSettleExt.getPurchaseStatus()) {
// 需要复购考核的
@ -1122,6 +1183,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
}
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus() ||
EBonusIncomeStatus.RISK_CONTROL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
// 判断会员状态会员状态为封停的话状态修改为停收

View File

@ -52,24 +52,22 @@ import java.util.*;
public abstract class BonusSettleHandle {
@Autowired
protected ICuMemberTreeService cuMemberTreeService;
protected ICuMemberTreeService iCuMemberTreeService;
@Autowired
protected ICuMemberSettlePeriodService cuMemberSettlePeriodService;
protected ICuMemberSettlePeriodService iCuMemberSettlePeriodService;
@Autowired
protected ICuMemberAssessService cuMemberAssessService;
protected ICuMemberAssessService iCuMemberAssessService;
@DubboReference
ISaOrderServiceApi saOrderServiceApi;
ISaOrderServiceApi iSaOrderServiceApi;
@DubboReference
ICurrencyServiceApi currencyServiceApi;
ICurrencyServiceApi iCurrencyServiceApi;
/**
* 获取等级对应的拓展奖配置
*
* @param bonusConfigDTO 奖金参数汇总
* @param memberSettleExt 会员
* @Description: 获取等级对应的拓展奖配置
* @return: BdGrade
* @Author: sui q
* @Date: 2022/11/16 11:24
*/
protected BdGrade getGradeExpand(BonusConfigDTO bonusConfigDTO, CuMemberSettleExt memberSettleExt) {
return bonusConfigDTO.getGradeMap().get(memberSettleExt.getPkSettleCountry().toString() + "_" + memberSettleExt.getPkGrade());
@ -98,27 +96,29 @@ public abstract class BonusSettleHandle {
}
/**
* 获取扩展比例拓展配置比例 >= 等级拓展比例取等级拓展比例
* -- 获得国家对应的4-n参数比例
*
* @param bonusConfigDTO 奖金配置汇总
* @param memberSettleExt 会员
* @param endTouch 4-n的次数
* @param bdGrade 等级
* @Description: 获得国家对应的4-n参数比例
* @return: BigDecimal
* @Author: sui q
* @Date: 2022/11/16 11:27
* @param addTouch 配置追加的碰次
*/
protected BigDecimal getCountryExpand(BonusConfigDTO bonusConfigDTO, CuMemberSettleExt memberSettleExt, Integer endTouch, BdGrade bdGrade,
BigDecimal addTouch, BigDecimal editExpandRatio) {
BonusExpandDTO bonusExpand = bonusConfigDTO.getBonusExpandMap().get(memberSettleExt.getPkSettleCountry());
// 总碰次 = 实际计算出来的碰次 + 配置追加的碰次
BigDecimal totalTouch = ComputeUtil.computeAdd(BigDecimal.valueOf(endTouch), addTouch);
// 配置的4-N总比例一般26%
BigDecimal expandRatio = bonusExpand.getExpandRatio();
if (memberSettleExt.getPkVertex() != null && memberSettleExt.getPkVertex().equals(377L)) {
expandRatio = BigDecimal.valueOf(13);
} else if (ComputeUtil.compareValue(editExpandRatio)) {
if (ComputeUtil.compareValue(editExpandRatio)) {
expandRatio = editExpandRatio;
}
// 4-N拓展比例 % 总碰次得出一碰的比例
BigDecimal countryExpandRatio = ComputeUtil.computeDivide(expandRatio, totalTouch);
if (ComputeUtil.compareValue(countryExpandRatio, bdGrade.getExpandRatio())) {
// 一碰的比例大于等级的拓展比例使用等于的拓展比例
return bdGrade.getExpandRatio();
}
return countryExpandRatio;
@ -137,12 +137,9 @@ public abstract class BonusSettleHandle {
protected BigDecimal getCountryRepurchaseExpand(BonusConfigDTO bonusConfigDTO, CuMemberSettleExt memberSettleExt, Integer endTouch, BdGrade bdGrade, BigDecimal addTouch, BigDecimal editExpandRatio) {
BonusExpandDTO bonusExpand = bonusConfigDTO.getBonusExpandMap().get(memberSettleExt.getPkSettleCountry());
BigDecimal expandRatio = bonusExpand.getExpandRatio();
if (memberSettleExt.getPkVertex() != null && memberSettleExt.getPkVertex().equals(377L)) {
expandRatio = BigDecimal.valueOf(13);
} else if (ComputeUtil.compareValue(editExpandRatio)) {
if (ComputeUtil.compareValue(editExpandRatio)) {
expandRatio = editExpandRatio;
}
// 验证是否是爱美视团队
BigDecimal countryExpandRatio = ComputeUtil.computeDivide(expandRatio, BigDecimal.valueOf(endTouch));
if (ComputeUtil.compareValue(countryExpandRatio, bdGrade.getRepurchaseRatio())) {
return bdGrade.getRepurchaseRatio();
@ -720,9 +717,9 @@ public abstract class BonusSettleHandle {
}
Date settleDate = DateUtils.parseStringToDate(settleDateStr);
// 获取结算日期的第一天的日期
Integer assessPeriod = cuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.currentMonthFirstDateStr(settleDate)).getPkId();
Integer assessPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.currentMonthFirstDateStr(settleDate)).getPkId();
String assessTableName = TableNameConstants.CU_MEMBER_ASSESS + DateUtils.getYear(settleDateStr);
return cuMemberAssessService.queryCuMemberAssessByMember(assessTableName, assessPeriod, EAssessmentType.REPURCHASE_ASSESS.getValue(), cuMemberSettleExtList);
return iCuMemberAssessService.queryCuMemberAssessByMember(assessTableName, assessPeriod, EAssessmentType.REPURCHASE_ASSESS.getValue(), cuMemberSettleExtList);
}
/**
@ -738,7 +735,7 @@ public abstract class BonusSettleHandle {
CuMemberSettleExt cuMemberSettleExt) {
Integer pkRate = saOrder.getPkRate();
if (pkRate == null || !Objects.equals(cuMemberSettleExt.getPkSettleCountry(), saOrder.getPkCountry())) {
CurrencyDTO currencyDTO = currencyServiceApi.getCurrency(cuMemberSettleExt.getPkSettleCountry()).getData();
CurrencyDTO currencyDTO = iCurrencyServiceApi.getCurrency(cuMemberSettleExt.getPkSettleCountry()).getData();
pkRate = currencyDTO.getPkId();
}
return getCuMemberBonus(period, cuMemberBonusMap, cuMemberSettleExt.getPkMember(), cuMemberSettleExt.getIncomeStatus(),
@ -866,7 +863,7 @@ public abstract class BonusSettleHandle {
protected List<CuMemberSettleExt> getMemberParentBySaOrder(Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, List<SaOrderExt> saOrderList) {
Set<Long> memberSet = new HashSet<>();
saOrderList.forEach(saOrderExt -> memberSet.add(saOrderExt.getPkMember()));
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, memberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryCuMemberSettleParent(settleTableName, memberSet);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
return cuMemberSettleExtList;
}
@ -1156,15 +1153,18 @@ public abstract class BonusSettleHandle {
return Boolean.TRUE;
}
/*
* @description: 根据会员主键列表获得会员只
* @author: sui q
* @date: 17:29
* @param: null null
**/
/**
* 根据会员主键列表获得会员
*
* @param cuMemberSettleExtMap
* @param settleDate
* @param settleTableName
* @param memberSet
* @return
*/
protected Map<Long, CuMemberAssess> packageMemberSettleByPkMemberSet(Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleDate, String settleTableName, Set<Long> memberSet) {
if (memberSet.size() > 0) {
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleByMemberPk(settleTableName, memberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleByMemberPk(settleTableName, memberSet);
// 初始化父类网体的值
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
return getLongCuMemberAssessMap(settleDate, cuMemberSettleExtList);

View File

@ -120,7 +120,7 @@ public class BonusSettleHiFunHandle extends BonusSettleHandle {
}
});
if (haiFunMemberSet.size() > 0) {
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleParentByMemberPk(settleTableName, haiFunMemberSet);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleParentByMemberPk(settleTableName, haiFunMemberSet);
// 初始化父类网体的值
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
}

View File

@ -32,7 +32,7 @@ public class BonusSettleMallHandle extends BonusSettleHandle {
}
});
if (queryMallSaOrderList.size() > 0) {
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.batchQueryMemberSettleBySaOrder(settleTableName, queryMallSaOrderList);
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.batchQueryMemberSettleBySaOrder(settleTableName, queryMallSaOrderList);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
}
mallSaOrderList.forEach(saOrderExt -> {

View File

@ -134,22 +134,22 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
}
/**
* 计算复购拓展收益
*
* @param settleTableName 结算表
* @param period 期间
* @param bonusConfigDTO 参数
* @param purchaseOrderList 首单
* @param cuMemberBonusMap 所有计算出来的奖金汇总
* @Description: 计算复购拓展收益
* @return: void
* @Author: sui q
* @Date: 2022/11/10 14:17
*/
List<CuMemberBonusExpand> calculateRepurchaseExpandBonus(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDateStr, BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap,
List<CuMemberBonusExpand> calculateRepurchaseExpandBonus(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDateStr,
BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap,
List<SaOrderExt> purchaseOrderList, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap, Map<Long, CuBonusExpandExt> cuBonusExpandExtMap) {
List<CuMemberBonusExpand> cuMemberBonusExpandList = new ArrayList<>();
// 获取所有订单的上级根据订单往上一步步计算
// key订单IDvalue订单向上找安置人列表
Map<Long, List<CuMemberSettleExt>> memberSettleMap = cuMemberTreeService.batchQueryCuMemberSettlePlaceParent(settleTableName, purchaseOrderList);
Map<Long, List<CuMemberSettleExt>> memberSettleMap = iCuMemberTreeService.batchQueryCuMemberSettlePlaceParent(settleTableName, purchaseOrderList);
List<CuMemberSettleExt> memberSettleExtList = new ArrayList<>();
for (List<CuMemberSettleExt> cuMemberSettleExt : memberSettleMap.values()) {
memberSettleExtList.addAll(cuMemberSettleExt);
@ -157,8 +157,10 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
getMemberSettle(cuMemberSettleExtMap, memberSettleExtList);
// key会员IDvalue会员考核信息
Map<Long, CuMemberAssess> cuMemberAssessMap = getCuMemberAssessMap(cuMemberSettleExtMap, settleDateStr, memberSettleExtList);
for (SaOrderExt saOrderExt : purchaseOrderList) {
if (!validateSecondOrderExistBonus(saOrderExt, EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue())) {
// 校验二次发货需不需要计算量碰
continue;
}
// 所有需要计算的父节点只计算新增
@ -175,10 +177,11 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
break;
}
}
List<CuMemberBonusExpand> newMemberBonusExpandList = calculateRepurchaseExpandBonusOne(riskControlMap, settleTableName, cuMemberSettleExtMap, bonusConfigDTO, systemConfigMap, period,
// 计算量奖拓展收益
List<CuMemberBonusExpand> expandList = calculateRepurchaseExpandBonusOne(riskControlMap, settleTableName, cuMemberSettleExtMap, bonusConfigDTO, systemConfigMap, period,
weekMemberBonusMap, cuMemberBonusMap, cuMemberAssessMap, saOrderExt, cuMemberSettleExtList, addTouch, expandRatio, expandNumber);
if (newMemberBonusExpandList.size() > 0) {
cuMemberBonusExpandList.addAll(newMemberBonusExpandList);
if (expandList.size() > 0) {
cuMemberBonusExpandList.addAll(expandList);
}
}
// 根据订单往上穿业绩只计算新增
@ -216,12 +219,18 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
return calculateRepurchasePushBonusOne(cuMemberSettleExtMap, bonusConfigDTO, cuMemberAssessMap, period, cuMemberBonusMap, saOrderExt);
}
private List<CuMemberBonusExpand> calculateRepurchaseExpandBonusOne(Map<Long, CuMemberRiskControl> riskControlMap, String settleName, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, Integer period,
Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap, Map<Long, CuMemberAssess> cuMemberAssessMap,
SaOrderExt saOrderExt, List<CuMemberSettleExt> cuMemberSettleExtList, BigDecimal addTouch, BigDecimal expandRatio, Integer expandNumber) {
Map<Integer, BonusExpandDTO> bdBonusExpandMap = bonusConfigDTO.getBonusExpandMap();
/**
* 计算复购量奖拓展收益
*
* @return
*/
private List<CuMemberBonusExpand> calculateRepurchaseExpandBonusOne(Map<Long, CuMemberRiskControl> riskControlMap, String settleName, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, BonusConfigDTO bonusConfigDTO,
Map<String, String> systemConfigMap, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap,
Map<Long, CuMemberAssess> cuMemberAssessMap, SaOrderExt saOrderExt, List<CuMemberSettleExt> cuMemberSettleExtList,
BigDecimal addTouch, BigDecimal expandRatio, Integer expandNumber) {
List<CuMemberBonusExpand> cuMemberBonusExpandList = new ArrayList<>();
Map<Integer, BonusExpandDTO> bdBonusExpandMap = bonusConfigDTO.getBonusExpandMap();
CuMemberSettleExt settleExt = cuMemberSettleExtMap.get(saOrderExt.getPkMember());
if (settleExt == null) {
return cuMemberBonusExpandList;
@ -233,8 +242,10 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
// 先计算新增根据新增计算碰次
// 先进行初始化所有的安置人存储需要修改的值,cuMemberSettleExtMap最终修改的
// getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
// 先准备值准备好值后开始计算计算碰次
int touchNum = calculateTouchNum(riskControlMap, settleName, cuMemberAssessMap, cuMemberSettleExtMap, saOrderExt, cuMemberSettleExtList, bonusConfigDTO);
int touchNum = calculateTouchNum(riskControlMap, cuMemberAssessMap, cuMemberSettleExtMap, saOrderExt, cuMemberSettleExtList, bonusConfigDTO);
// 有碰次计算拓展奖
if (touchNum > 0) {
// 判断是否>3 是否需要启动4-N4-N的参数按照伞上各安置人结算国家进行获取
@ -248,27 +259,30 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
startTouch = realExpandNumber;
endTouch = touchNum - startTouch;
}
// 正常的拓展奖计算
// 计算拓展奖
for (int i = 1; i <= startTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
// 验证是否有当前奖金项
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if ((targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY) && ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance()))
if ((ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance()))
|| (ComputeUtil.compareValue(targetMemberSettleExt.getRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRepBBalance()))) {
// 根据会员等级获取对应的配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
BigDecimal countryExpandRatio = bdGrade.getRepurchaseRatio();
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue());
calculateRepurchaseExpandBonusByAchieve(period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList, saOrderExt, touchNum, i, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, pkBonusItems, cuMemberAssessMap);
// 计算量碰
calculateRepurchaseExpandBonusByAchieve(period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList,
saOrderExt, touchNum, i, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, cuMemberAssessMap);
break;
}
}
@ -279,22 +293,25 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
for (int i = 1; i <= endTouch; i++) {
for (CuMemberSettleExt sourceMemberSettleExt : cuMemberSettleExtList) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(sourceMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()) {
continue;
}
// 验证是否有当前奖金项
if (validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue())) {
continue;
}
// 判断左右区是否有值找到有值的就是有碰次碰完左区或右区肯定有变为0的
if ((targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY) && ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance()))
if ((ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance()))
|| (ComputeUtil.compareValue(targetMemberSettleExt.getRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRepBBalance()))) {
// 根据会员等级获取对应的配置
BdGrade bdGrade = getGradeExpand(bonusConfigDTO, targetMemberSettleExt);
// 获取国家4-n的配置
BigDecimal countryExpandRatio = getCountryRepurchaseExpand(bonusConfigDTO, targetMemberSettleExt, endTouch, bdGrade, addTouch, expandRatio);
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue());
calculateRepurchaseExpandBonusByAchieve(period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList, saOrderExt, touchNum, i + startTouch, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, pkBonusItems, cuMemberAssessMap);
// 计算量碰
calculateRepurchaseExpandBonusByAchieve(period, weekMemberBonusMap, cuMemberBonusMap, bonusConfigDTO, systemConfigMap, cuMemberBonusExpandList,
saOrderExt, touchNum, i + startTouch, sourceMemberSettleExt, targetMemberSettleExt, bdGrade, countryExpandRatio, cuMemberAssessMap);
break;
}
}
@ -304,15 +321,16 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
return cuMemberBonusExpandList;
}
private int calculateTouchNum(Map<Long, CuMemberRiskControl> riskControlMap, String settleName, Map<Long, CuMemberAssess> cuMemberAssessMap,
Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, SaOrderExt saOrderExt, List<CuMemberSettleExt> cuMemberSettleExtList, BonusConfigDTO bonusConfigDTO) {
private int calculateTouchNum(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberAssess> cuMemberAssessMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap,
SaOrderExt saOrderExt, List<CuMemberSettleExt> cuMemberSettleExtList, BonusConfigDTO bonusConfigDTO) {
int touchNum = 0;
for (CuMemberSettleExt cuMemberSettleExt : cuMemberSettleExtList) {
// 数据已经准备好了肯定有值map中是实际的值先计算新增然后根据新增结算计算碰次list是为了存储碰次的顺序
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(cuMemberSettleExt.getPkPlaceParent());
if (targetMemberSettleExt == null || ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() ||
EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus() ||
EGrade.START_UP.getValue() == targetMemberSettleExt.getGradeValue()) {
if (targetMemberSettleExt == null
|| ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()
|| EGrade.START_UP.getValue() == targetMemberSettleExt.getGradeValue()) {
continue;
}
// 验证是否计算奖金
@ -320,74 +338,73 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
if (bdGrade.getRepurchaseCalculate() != null && EYesNo.NO.getIntValue() == bdGrade.getRepurchaseCalculate()) {
continue;
}
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
if (EPlaceDept.LEFT_DEPT.getValue() == cuMemberSettleExt.getPlaceDept()) {
// 左区
// K值设置
if (riskControlMap.containsKey(targetMemberSettleExt.getPkMember())) {
CuMemberRiskControl cuMemberRiskControl = riskControlMap.get(targetMemberSettleExt.getPkMember());
targetMemberSettleExt.setANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getANewAmount(), ComputeUtil.computeBonusMultiply(convertLocalCurrency(saOrderExt, bonusConfigDTO), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getANewPv(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getABalance(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
} else {
targetMemberSettleExt.setANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getANewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getANewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getABalance(), saOrderExt.getUploadAchieve()));
}
targetMemberSettleExt.setRABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRABalance(), saOrderExt.getUploadAchieve()));
// }
// if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
if (EPlaceDept.LEFT_DEPT.getValue() == cuMemberSettleExt.getPlaceDept()) {
// 左区
// K值设置
if (riskControlMap.containsKey(targetMemberSettleExt.getPkMember())) {
CuMemberRiskControl cuMemberRiskControl = riskControlMap.get(targetMemberSettleExt.getPkMember());
targetMemberSettleExt.setANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getANewAmount(), ComputeUtil.computeBonusMultiply(convertLocalCurrency(saOrderExt, bonusConfigDTO), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getANewPv(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getABalance(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
} else {
// 右区
if (riskControlMap.containsKey(targetMemberSettleExt.getPkMember())) {
CuMemberRiskControl cuMemberRiskControl = riskControlMap.get(targetMemberSettleExt.getPkMember());
targetMemberSettleExt.setBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewAmount(), ComputeUtil.computeBonusMultiply(convertLocalCurrency(saOrderExt, bonusConfigDTO), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewPv(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getBBalance(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
} else {
targetMemberSettleExt.setBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getBBalance(), saOrderExt.getUploadAchieve()));
}
targetMemberSettleExt.setRBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRBBalance(), saOrderExt.getUploadAchieve()));
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 国内量奖修改为考核不通过的不占用4-N不算奖金
// 验证是否验证考核
touchNum++;
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getRABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRBBalance())) {
BigDecimal minAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRABalance(), targetMemberSettleExt.getRBBalance());
targetMemberSettleExt.setRABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRABalance(), minAchieve));
targetMemberSettleExt.setRBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRBBalance(), minAchieve));
targetMemberSettleExt.setANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getANewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getANewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getABalance(), saOrderExt.getUploadAchieve()));
}
targetMemberSettleExt.setRABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRABalance(), saOrderExt.getUploadAchieve()));
} else {
// 嗨粉海粉没有量奖
if (EPlaceDept.LEFT_DEPT.getValue() == cuMemberSettleExt.getPlaceDept()) {
// 左区
targetMemberSettleExt.setRepANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getRepANewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setRepANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getRepANewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setRepABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRepABalance(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setRRepABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRRepABalance(), saOrderExt.getUploadAchieve()));
// 右区
if (riskControlMap.containsKey(targetMemberSettleExt.getPkMember())) {
CuMemberRiskControl cuMemberRiskControl = riskControlMap.get(targetMemberSettleExt.getPkMember());
targetMemberSettleExt.setBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewAmount(), ComputeUtil.computeBonusMultiply(convertLocalCurrency(saOrderExt, bonusConfigDTO), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewPv(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
targetMemberSettleExt.setBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getBBalance(), ComputeUtil.computeBonusMultiply(saOrderExt.getUploadAchieve(), cuMemberRiskControl.getAchieveRatio())));
} else {
// 右区
targetMemberSettleExt.setRepBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBNewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setRepBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBNewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setRepBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBBalance(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setRRepBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRRepBBalance(), saOrderExt.getUploadAchieve()));
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRepBBalance())) {
touchNum++;
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getRRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRRepBBalance())) {
BigDecimal minAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRRepABalance(), targetMemberSettleExt.getRRepBBalance());
targetMemberSettleExt.setRRepABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRRepABalance(), minAchieve));
targetMemberSettleExt.setRRepBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRRepBBalance(), minAchieve));
targetMemberSettleExt.setBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
targetMemberSettleExt.setBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getBNewPv(), saOrderExt.getUploadAchieve()));
targetMemberSettleExt.setBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getBBalance(), saOrderExt.getUploadAchieve()));
}
targetMemberSettleExt.setRBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRBBalance(), saOrderExt.getUploadAchieve()));
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getBBalance())) {
// 国内量奖修改为考核不通过的不占用4-N不算奖金
// 验证是否验证考核
touchNum++;
}
// 判断左右区是否有值左右区有值有碰次
if (ComputeUtil.compareValue(targetMemberSettleExt.getRABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRBBalance())) {
BigDecimal minAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRABalance(), targetMemberSettleExt.getRBBalance());
targetMemberSettleExt.setRABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRABalance(), minAchieve));
targetMemberSettleExt.setRBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRBBalance(), minAchieve));
}
// } else {
// // 嗨粉海粉没有量奖
// if (EPlaceDept.LEFT_DEPT.getValue() == cuMemberSettleExt.getPlaceDept()) {
// // 左区
// targetMemberSettleExt.setRepANewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getRepANewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
// targetMemberSettleExt.setRepANewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getRepANewPv(), saOrderExt.getUploadAchieve()));
// targetMemberSettleExt.setRepABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRepABalance(), saOrderExt.getUploadAchieve()));
// targetMemberSettleExt.setRRepABalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRRepABalance(), saOrderExt.getUploadAchieve()));
// } else {
// // 右区
// targetMemberSettleExt.setRepBNewAmount(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBNewAmount(), convertLocalCurrency(saOrderExt, bonusConfigDTO)));
// targetMemberSettleExt.setRepBNewPv(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBNewPv(), saOrderExt.getUploadAchieve()));
// targetMemberSettleExt.setRepBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRepBBalance(), saOrderExt.getUploadAchieve()));
// targetMemberSettleExt.setRRepBBalance(ComputeUtil.computeAdd(targetMemberSettleExt.getRRepBBalance(), saOrderExt.getUploadAchieve()));
// }
// // 判断左右区是否有值左右区有值有碰次
// if (ComputeUtil.compareValue(targetMemberSettleExt.getRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRepBBalance())) {
// touchNum++;
// }
// // 判断左右区是否有值左右区有值有碰次
// if (ComputeUtil.compareValue(targetMemberSettleExt.getRRepABalance()) && ComputeUtil.compareValue(targetMemberSettleExt.getRRepBBalance())) {
// BigDecimal minAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRRepABalance(), targetMemberSettleExt.getRRepBBalance());
// targetMemberSettleExt.setRRepABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRRepABalance(), minAchieve));
// targetMemberSettleExt.setRRepBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRRepBBalance(), minAchieve));
// }
// }
}
return touchNum;
}
@ -647,7 +664,7 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
if (specialOrderList.size() > 0) {
// 查找订单血缘上会员
Set<Long> expandMemberSet = specialOrderList.stream().distinct().map(SaOrderExt::getPkMember).collect(Collectors.toSet());
List<CuMemberSettleExt> specialMemberSettleExtList = cuMemberTreeService.batchQueryCuMemberSettleParentForSpecial(settleTableName, expandMemberSet);
List<CuMemberSettleExt> specialMemberSettleExtList = iCuMemberTreeService.batchQueryCuMemberSettleParentForSpecial(settleTableName, expandMemberSet);
// 重算的时候首先先把数量还回来在重新计算查询订单扣除的记录
List<AcPickMemberLog> acPickMemberLogList = acPickServiceApi.queryPickMemberLog(specialOrderList).getData();
@ -938,6 +955,8 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
}
/**
* 计算复购量碰
*
* @param period 期间
* @param cuMemberBonusMap 奖金汇总
* @param cuMemberBonusExpandList 拓展奖奖金明细
@ -948,50 +967,55 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
* @param targetMemberSettleExt 获得奖金的人
* @param bdGrade 等级对应的参数
* @param countryExpandRatio 4-n时计算国家对应的参数
* @Description: 计算量碰
* @return: void
* @Author: sui q
* @Date: 2022/11/16 15:51
*/
private void calculateRepurchaseExpandBonusByAchieve(Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap, Map<Long, CuMemberBonus> cuMemberBonusMap,
BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, List<CuMemberBonusExpand> cuMemberBonusExpandList, SaOrderExt saOrderExt, int touchNum, int i,
CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt, BdGrade bdGrade, BigDecimal countryExpandRatio, Integer pkBonusItems,
Map<Long, CuMemberAssess> cuMemberAssessMap) {
// 验证封顶方式 1= 2=若是周的话需要获取 周奖金
BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, List<CuMemberBonusExpand> cuMemberBonusExpandList,
SaOrderExt saOrderExt, int touchNum, int i, CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt,
BdGrade bdGrade, BigDecimal countryExpandRatio, Map<Long, CuMemberAssess> cuMemberAssessMap) {
// 获取拓展收益奖项ID
Integer pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.CONSUMPTION_EXPANSION_INCOME.getValue());
// 验证封顶方式 1= 2=若是周的话需要获取 周奖金首购已经去掉周封顶逻辑此处周封顶默认0后续代码可以不需要修改
BigDecimal weekRepExpandIncome = BigDecimal.ZERO;
if (systemConfigMap.containsKey(targetMemberSettleExt.getPkSettleCountry() + ESystemConfig.EXPAND_CAP_METHOD.getKey())) {
String expandCapMethod = systemConfigMap.get(targetMemberSettleExt.getPkSettleCountry() + ESystemConfig.EXPAND_CAP_METHOD.getKey());
if (Objects.equals(expandCapMethod, EExpandCapMethod.WEEK_SETTLE.toString()) &&
weekMemberBonusMap.containsKey(targetMemberSettleExt.getPkMember())) {
weekRepExpandIncome = weekMemberBonusMap.get(targetMemberSettleExt.getPkMember()).getRepurExpandIncome();
}
}
// if (systemConfigMap.containsKey(targetMemberSettleExt.getPkSettleCountry() + ESystemConfig.EXPAND_CAP_METHOD.getKey())) {
// String expandCapMethod = systemConfigMap.get(targetMemberSettleExt.getPkSettleCountry() + ESystemConfig.EXPAND_CAP_METHOD.getKey());
// if (Objects.equals(expandCapMethod, EExpandCapMethod.WEEK_SETTLE.toString()) &&
// weekMemberBonusMap.containsKey(targetMemberSettleExt.getPkMember())) {
// weekRepExpandIncome = weekMemberBonusMap.get(targetMemberSettleExt.getPkMember()).getRepurExpandIncome();
// }
// }
// 国内使用首购比例首购封顶
BigDecimal gradeExpandRatio = bdGrade.getRepurchaseRatio();
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
gradeExpandRatio = bdGrade.getExpandRatio();
// 验证受益人等级
CuMember cuMember = cuMemberService.getMember(targetMemberSettleExt.getMemberCode());
if (cuMember != null && DateUtils.compareDate(DateUtils.parseStringToDate("2024-09-11"), cuMember.getPayTime()) > 0) {
if (targetMemberSettleExt.getGradeValue() == EGrade.VIP.getValue()) {
if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(11)) && (i <= 3 || touchNum <= 10)) {
countryExpandRatio = BigDecimal.valueOf(13);
}
} else if (targetMemberSettleExt.getGradeValue() == EGrade.MAKER.getValue()) {
if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(10)) && (i <= 3 || touchNum <= 10)) {
countryExpandRatio = BigDecimal.valueOf(11);
}
}
}
}
// // TODO new 中国会员指定日期之前计算比例
// if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
// gradeExpandRatio = bdGrade.getExpandRatio();
// // 验证受益人等级
// CuMember cuMember = cuMemberService.getMember(targetMemberSettleExt.getMemberCode());
// if (cuMember != null && DateUtils.compareDate(DateUtils.parseStringToDate("2024-09-11"), cuMember.getPayTime()) > 0) {
// if (targetMemberSettleExt.getGradeValue() == EGrade.VIP.getValue()) {
// if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(11)) && (i <= 3 || touchNum <= 10)) {
// countryExpandRatio = BigDecimal.valueOf(13);
// }
// } else if (targetMemberSettleExt.getGradeValue() == EGrade.MAKER.getValue()) {
// if (ComputeUtil.compareValue(countryExpandRatio, BigDecimal.valueOf(10)) && (i <= 3 || touchNum <= 10)) {
// countryExpandRatio = BigDecimal.valueOf(11);
// }
// }
// }
// }
// 获取等级封顶值
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
// 左右区获取最小的
BigDecimal calAchieve;
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
calAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getABalance(), targetMemberSettleExt.getBBalance());
} else {
calAchieve = ComputeUtil.obtainMinAchieve(targetMemberSettleExt.getRepABalance(), targetMemberSettleExt.getRepBBalance());
}
CuMemberBonusExpand cuMemberBonusExpand = getCuMemberBonusExpand(saOrderExt, touchNum, i, targetMemberSettleExt, countryExpandRatio, cuMemberBonus, calAchieve, pkBonusItems, BigDecimal.ZERO);
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
targetMemberSettleExt.setABalance(ComputeUtil.computeSubtract(targetMemberSettleExt.getABalance(), calAchieve));
@ -1001,32 +1025,51 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
targetMemberSettleExt.setRepABalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRepABalance(), calAchieve));
targetMemberSettleExt.setRepBBalance(ComputeUtil.computeSubtractAbs(targetMemberSettleExt.getRepBBalance(), calAchieve));
}
// 计算收益 先计算出会员最大的收益
BigDecimal maxIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), gradeExpandRatio);
BigDecimal actualIncome = ComputeUtil.computeBonusMultiply(cuMemberBonusExpand.getCalAchieve(), countryExpandRatio);
// 获取等级对应的封顶值
BigDecimal expandIncome = ComputeUtil.computeAdd(ComputeUtil.computeAdd(cuMemberBonus.getRepurExpandIncome(), actualIncome), weekRepExpandIncome);
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
// 获取等级对应的封顶值
// 获取等级对应的封顶值中国重新赋值封顶值
expandIncome = ComputeUtil.computeAdd(ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), expandIncome), weekRepExpandIncome);
// 判断收益 是否超过封顶值超过的话变为封顶值
// 判断是否烧伤判断原奖金是否>=封顶值,奖金到了就是烧伤
// 验证会员状态 封停状态跟冻结都正常计算奖金封停的账号发放的时候奖金发放为0冻结的账号正常发放不能登录
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), maxIncome, actualIncome);
if (ComputeUtil.compareValue(ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()), bdGrade.getExpandCapping())) {
// 拓展收益 累加 复购收益 >= 封顶值
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
// 状态为烧伤
// TODO new V3 V4 没有烧伤改为延缓发放
if (EGrade.VIP.getValue() == bdGrade.getGradeValue()
|| EGrade.S_VIP.getValue() == bdGrade.getGradeValue()) {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.DELAY_GRANT.getValue());
} else {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
}
expandIncome = ComputeUtil.computeSubtract(bdGrade.getExpandCapping(), ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()));
} else if (ComputeUtil.compareGreaterThan(expandIncome, bdGrade.getExpandCapping())) {
BigDecimal realIncome = ComputeUtil.computeSubtract(ComputeUtil.computeSubtract(bdGrade.getExpandCapping(), weekRepExpandIncome), ComputeUtil.computeAdd(cuMemberBonus.getExpandIncome(), cuMemberBonus.getRepurExpandIncome()));
//存在一半烧伤一半正常的值拆2条
// 存在一半烧伤一半正常的值拆2条
// 拓展明细表 进行修改
packageCuMemberBonusExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), realIncome, realIncome);
CuMemberBonusExpand fireCuMemberBonusExpand = BeanUtil.copyProperties(cuMemberBonusExpand, CuMemberBonusExpand.class);
BigDecimal fireIncome = ComputeUtil.computeSubtract(maxIncome, realIncome);
if (EBonusIncomeStatus.NORMAL.getValue() == fireCuMemberBonusExpand.getIncomeStatus()) {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
// TODO new V3 V4 没有烧伤改为延缓发放
if (EGrade.VIP.getValue() == bdGrade.getGradeValue()
|| EGrade.S_VIP.getValue() == bdGrade.getGradeValue()) {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.DELAY_GRANT.getValue());
} else {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
}
packageCuMemberBonusExpand(fireCuMemberBonusExpand, cuMemberBonus, bdGrade.getExpandCapping(), fireIncome, fireIncome);
// 收益占比
@ -1036,35 +1079,41 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
// 拓展收益取封顶最大值
expandIncome = ComputeUtil.computeSubtract(bdGrade.getExpandCapping(), weekRepExpandIncome);
}
} else {
// 判断收益 是否超过封顶值超过的话变为封顶值
// 判断是否烧伤判断原奖金是否>=封顶值,奖金到了就是烧伤
packageCuMemberBonusRepurchaseExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), maxIncome, actualIncome);
if (ComputeUtil.compareValue(ComputeUtil.computeAdd(cuMemberBonus.getRepurExpandIncome(), weekRepExpandIncome), bdGrade.getRepurchaseCapping())) {
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
expandIncome = ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome);
} else if (ComputeUtil.compareGreaterThan(expandIncome, bdGrade.getRepurchaseCapping())) {
BigDecimal realIncome = ComputeUtil.computeSubtract(ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome), cuMemberBonus.getRepurExpandIncome());
//存在一半烧伤一半正常的值拆2条
// 拓展明细表 进行修改
packageCuMemberBonusRepurchaseExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), realIncome, realIncome);
CuMemberBonusExpand fireCuMemberBonusExpand = BeanUtil.copyProperties(cuMemberBonusExpand, CuMemberBonusExpand.class);
BigDecimal fireIncome = ComputeUtil.computeSubtract(maxIncome, realIncome);
if (EBonusIncomeStatus.NORMAL.getValue() == fireCuMemberBonusExpand.getIncomeStatus()) {
fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
packageCuMemberBonusRepurchaseExpand(fireCuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), fireIncome, fireIncome);
// 收益占比
setBonusDetailDeduct(bonusConfigDTO, fireCuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
repurchaseExpandRemark(saOrderExt, fireCuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
cuMemberBonusExpandList.add(fireCuMemberBonusExpand);
// 拓展收益取封顶最大值
expandIncome = ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome);
}
}
// 暂时不需要处理非中国的逻辑
// else {
// // 判断收益 是否超过封顶值超过的话变为封顶值
// // 判断是否烧伤判断原奖金是否>=封顶值,奖金到了就是烧伤
// packageCuMemberBonusRepurchaseExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), maxIncome, actualIncome);
// if (ComputeUtil.compareValue(ComputeUtil.computeAdd(cuMemberBonus.getRepurExpandIncome(), weekRepExpandIncome), bdGrade.getRepurchaseCapping())) {
// if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
// cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
// }
// expandIncome = ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome);
// } else if (ComputeUtil.compareGreaterThan(expandIncome, bdGrade.getRepurchaseCapping())) {
// BigDecimal realIncome = ComputeUtil.computeSubtract(ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome), cuMemberBonus.getRepurExpandIncome());
// //存在一半烧伤一半正常的值拆2条
// // 拓展明细表 进行修改
// packageCuMemberBonusRepurchaseExpand(cuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), realIncome, realIncome);
// CuMemberBonusExpand fireCuMemberBonusExpand = BeanUtil.copyProperties(cuMemberBonusExpand, CuMemberBonusExpand.class);
// BigDecimal fireIncome = ComputeUtil.computeSubtract(maxIncome, realIncome);
// if (EBonusIncomeStatus.NORMAL.getValue() == fireCuMemberBonusExpand.getIncomeStatus()) {
// fireCuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
// }
// packageCuMemberBonusRepurchaseExpand(fireCuMemberBonusExpand, cuMemberBonus, bdGrade.getRepurchaseCapping(), fireIncome, fireIncome);
// // 收益占比
// setBonusDetailDeduct(bonusConfigDTO, fireCuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
// repurchaseExpandRemark(saOrderExt, fireCuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
// cuMemberBonusExpandList.add(fireCuMemberBonusExpand);
// // 拓展收益取封顶最大值
// expandIncome = ComputeUtil.computeSubtract(bdGrade.getRepurchaseCapping(), weekRepExpandIncome);
// }
// }
// 收益占比
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusExpand, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
repurchaseExpandRemark(saOrderExt, cuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
// 正常状态的辅导奖需要判断复购考核复购考核不通过的状态变为烧伤
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()
&& EYesNo.NO.getIntValue() == targetMemberSettleExt.getPurchaseStatus()) {
@ -1074,16 +1123,18 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
cuMemberBonusExpand.setIncomeStatus(EBonusIncomeStatus.FIRE_BURN.getValue());
}
}
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusExpand.getIncomeStatus()) {
if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
cuMemberBonus.setRepurExpandIncome(ComputeUtil.computeSubtract(expandIncome, cuMemberBonus.getExpandIncome()));
setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusExpand);
} else {
cuMemberBonus.setRepurExpandIncome(ComputeUtil.computeSubtract(expandIncome, weekRepExpandIncome));
setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusExpand);
}
cuMemberBonus.setRepurExpandIncome(ComputeUtil.computeSubtract(expandIncome, cuMemberBonus.getExpandIncome()));
setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusExpand);
// if (targetMemberSettleExt.getPkSettleCountry().equals(CountryConstants.CHINA_COUNTRY)) {
// cuMemberBonus.setRepurExpandIncome(ComputeUtil.computeSubtract(expandIncome, cuMemberBonus.getExpandIncome()));
// setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusExpand);
// } else {
// cuMemberBonus.setRepurExpandIncome(ComputeUtil.computeSubtract(expandIncome, weekRepExpandIncome));
// setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusExpand);
// }
}
repurchaseExpandRemark(saOrderExt, cuMemberBonusExpand, sourceMemberSettleExt, targetMemberSettleExt);
cuMemberBonusExpandList.add(cuMemberBonusExpand);
}

View File

@ -809,8 +809,8 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
// 先计算复购在计算首购
// 计算复购
if (repurchaseOrderList.size() > 0) {
leXueRangeParam = calculatePurchaseOrder(riskControlMap, cuMemberSettleExtMap, currentSettleTableName, settleDate, rangeDtoMap, awardsMap, bonusConfigDTO,
systemConfigMap, repurchaseOrderList, period, weekMemberBonusMap, cuMemberBonusMap, recordDetailVO, cuAwardsControlMap, cuBonusExpandExtMap);
leXueRangeParam = calculatePurchaseOrder(riskControlMap, cuMemberSettleExtMap, currentSettleTableName, settleDate, systemConfigMap, bonusConfigDTO,
repurchaseOrderList, period, weekMemberBonusMap, cuMemberBonusMap, recordDetailVO, awardsMap, cuAwardsControlMap, cuBonusExpandExtMap, rangeDtoMap);
}
// 计算首购
if (firPurchaseOrderList.size() > 0) {
@ -971,15 +971,15 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
* @param bonusConfigDTO 各个国家奖金参数
* @param firPurchaseOrderList 首购订单
*/
private void calculateFirPurchaseOrder(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDate, Map<String, String> systemConfigMap,
BonusConfigDTO bonusConfigDTO, List<SaOrderExt> firPurchaseOrderList, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap,
private void calculateFirPurchaseOrder(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDate,
Map<String, String> systemConfigMap, BonusConfigDTO bonusConfigDTO, List<SaOrderExt> firPurchaseOrderList, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap,
Map<Long, CuMemberBonus> cuMemberBonusMap, BonusRecordDetailVO bonusRecordDetailVO, Map<String, BdAwards> awardsMap,
Map<Long, CuAwardsControl> cuAwardsControlMap, Map<Long, CuBonusExpandExt> cuBonusExpandExtMap) {
// 获得国家是三单循环还是四单循环
// 获得升级方式是纳入三单循环还是固定值
// 获取有订单国家的系统参数获得三单循环还是四单循环 key 国家+系统参数key
// 需要更新的会员结算表 cuMemberSettleExtMap
//***************************计算推荐奖(直推级差、直推三单循环)******************************/
//***************************计算推荐奖(直推级差、直推三单循环)******************************/
List<CuMemberBonusPush> cuMemberBonusPushList = bonusSettleFirstPurchaseHandle.calculateRecommendBonus(cuMemberSettleExtMap, settleTableName, bonusConfigDTO, systemConfigMap, firPurchaseOrderList, period, cuMemberBonusMap, awardsMap);
bonusRecordDetailVO.setCuMemberBonusPushList(cuMemberBonusPushList);
@ -992,7 +992,7 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
bonusRecordDetailVO.getCuMemberBonusExpandList().addAll(cuMemberBonusExpandList);
}
}
//*********************************计算领导奖************************/
//*********************************计算领导奖(辅导收益)************************/
// 判断是否有量奖有量奖有辅导奖
// List<CuMemberBonusCoach> cuMemberBonusCoachList = bonusSettleFirstPurchaseHandle.calculateCoachBonus(cuMemberSettleExtMap, settleTableName, settleDate, bonusConfigDTO, firPurchaseOrderList,
// cuMemberBonusExpandList, period, cuMemberBonusMap, cuAwardsControlMap, riskControlMap);
@ -1079,16 +1079,18 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
}
/**
* 计算购订单的奖金
* 计算购订单的奖金
*
* @param settleTableName 结算日表
* @param settleDate 结算日期
* @param bonusConfigDTO 各个国家奖金参数
* @param purchaseOrderList 首购订单
* @param purchaseOrderList 复购订单
* @param rangeDtoMap 乐学奖金使用的汇率map
*/
private LeXueRangeParam calculatePurchaseOrder(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDate, Map<String, RangeDTO> rangeDtoMap,
Map<String, BdAwards> awardsMap, BonusConfigDTO bonusConfigDTO, Map<String, String> systemConfigMap, List<SaOrderExt> purchaseOrderList, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap,
Map<Long, CuMemberBonus> cuMemberBonusMap, BonusRecordDetailVO bonusRecordDetailVO, Map<Long, CuAwardsControl> cuAwardsControlMap, Map<Long, CuBonusExpandExt> cuBonusExpandExtMap) {
private LeXueRangeParam calculatePurchaseOrder(Map<Long, CuMemberRiskControl> riskControlMap, Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleTableName, String settleDate,
Map<String, String> systemConfigMap, BonusConfigDTO bonusConfigDTO, List<SaOrderExt> purchaseOrderList, Integer period, Map<Long, CuMemberBonus> weekMemberBonusMap,
Map<Long, CuMemberBonus> cuMemberBonusMap, BonusRecordDetailVO bonusRecordDetailVO, Map<String, BdAwards> awardsMap,
Map<Long, CuAwardsControl> cuAwardsControlMap, Map<Long, CuBonusExpandExt> cuBonusExpandExtMap, Map<String, RangeDTO> rangeDtoMap) {
//****************************复购直推*****************************
// 查找10代血缘验证复购考核考核通过的给与奖金 紧缩
// List<CuMemberBonusPush> cuMemberBonusPushList = bonusSettlePurchaseHandle.calculateRepurchasePushBonus(cuMemberSettleExtMap, settleTableName, settleDate, bonusConfigDTO, purchaseOrderList, period, cuMemberBonusMap);
@ -1099,7 +1101,7 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
// bonusRecordDetailVO.getCuMemberBonusPushList().addAll(cuMemberBonusPushList);
// }
// }
//****************************复购量奖*****************************/
//****************************计算量奖(拓展收益)*****************************/
List<CuMemberBonusExpand> cuMemberBonusExpandList = bonusSettlePurchaseHandle.calculateRepurchaseExpandBonus(riskControlMap, cuMemberSettleExtMap, settleTableName, settleDate, bonusConfigDTO, systemConfigMap, purchaseOrderList, period, weekMemberBonusMap, cuMemberBonusMap, cuBonusExpandExtMap);
if (cuMemberBonusExpandList.size() > 0) {
if (bonusRecordDetailVO.getCuMemberBonusExpandList() == null) {

View File

@ -36,12 +36,12 @@ import java.util.*;
public class CuBonusExpandServiceImpl extends ServiceImpl<CuBonusExpandMapper, CuBonusExpand> implements ICuBonusExpandService {
@DubboReference
ISaOrderServiceApi saOrderServiceApi;
ISaOrderServiceApi iSaOrderServiceApi;
@Autowired
private ICuMemberSettlePeriodService memberSettlePeriodService;
private ICuMemberSettlePeriodService iCuMemberSettlePeriodService;
@Autowired
private IBonusSettleService bonusSettleService;
private IBonusSettleService iBonusSettleService;
@Override
public List<CuBonusExpandExt> queryBonusExpand(BonusExpandParam bonusExpandParam) {
@ -146,8 +146,8 @@ public class CuBonusExpandServiceImpl extends ServiceImpl<CuBonusExpandMapper, C
private void packageBonusExpandParam(BonusExpandParam bonusExpandParam, Date settleDate, Date endDate) {
bonusExpandParam.setStartDate(settleDate);
bonusExpandParam.setEndDate(DateUtils.afterDate(1, ChronoUnit.DAYS, endDate));
CuMemberSettlePeriod startPeriod = memberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, bonusExpandParam.getStartDate()));
CuMemberSettlePeriod endPeriod = memberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, endDate));
CuMemberSettlePeriod startPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, bonusExpandParam.getStartDate()));
CuMemberSettlePeriod endPeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, endDate));
bonusExpandParam.setStartPeriod(startPeriod.getPkId());
bonusExpandParam.setEndPeriod(endPeriod.getPkId());
}
@ -182,10 +182,10 @@ public class CuBonusExpandServiceImpl extends ServiceImpl<CuBonusExpandMapper, C
String settleDate = DateUtils.parseDateToFormat(DateUtils.YYYY_MM_DD, bonusExpandParam.getSettleDate());
Date endDate = DateUtils.afterDate(1, ChronoUnit.DAYS, bonusExpandParam.getSettleDate());
// 查询订单
List<SaOrderExt> saOrderExtList = saOrderServiceApi.queryRepeatSaOrderByDay(bonusExpandParam.getSettleDate(), endDate).getData();
List<SaOrderExt> saOrderExtList = iSaOrderServiceApi.queryRepeatSaOrderByDay(bonusExpandParam.getSettleDate(), endDate).getData();
baseMapper.truncateTable();
// 重算奖金
bonusSettleService.repeatCuMemberBonusByExpand(settleDate, saOrderExtList);
iBonusSettleService.repeatCuMemberBonusByExpand(settleDate, saOrderExtList);
// 更新波比业绩
updateCuBonusExpandRatio(bonusExpandParam, "cu_member_repeat_bonus");
}

View File

@ -1,5 +1,6 @@
package com.hzs.bonus.detail.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -16,6 +17,8 @@ import com.hzs.common.domain.member.ext.CuMemberSettleExt;
import com.hzs.common.domain.system.config.BdAwards;
import com.hzs.bonus.base.service.ICuMemberService;
import com.hzs.bonus.detail.mapper.CuMemberAwardsMapper;
import com.hzs.system.config.IAwardsServiceApi;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -23,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
* 会员信息-奖衔升级记录 服务实现类
@ -40,9 +44,19 @@ public class CuMemberAwardsServiceImpl extends ServiceImpl<CuMemberAwardsMapper,
@Autowired
private ICuMemberSettlePeriodService iCuMemberSettlePeriodService;
@DubboReference
IAwardsServiceApi iAwardsServiceApi;
@Transactional(rollbackFor = Exception.class)
@Override
public void calculateCuMemberAwards(String settleDateStr, Map<String, BdAwards> countryAwardsMap, String settleTableName) {
// 获取奖衔列表保留Q8以上的
List<BdAwards> bdAwardsList = iAwardsServiceApi.queryAwards(CountryConstants.CHINA_COUNTRY).getData();
bdAwardsList = bdAwardsList.stream()
.filter(tmp -> tmp.getAwardsValue() >= EAwards.CHAIRMAN.getValue())
.sorted(Comparator.comparing(BdAwards::getAwardsValue))
.collect(Collectors.toList());
// 查询结算日当天奖衔发生过变动的会员本期
Date settleDate = DateUtils.parseStringToDate(settleDateStr);
Integer period = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(settleDateStr).getPkId();
@ -63,6 +77,10 @@ public class CuMemberAwardsServiceImpl extends ServiceImpl<CuMemberAwardsMapper,
break;
}
}
// TODO new 新制度中奖衔Q8Q9Q10只需要校验左右区各有前一等级即可不需要校验本身的业绩是否达标
for (BdAwards bdAwards : bdAwardsList) {
this.calculateAwardsSpec(bdAwards, settleTableName, settleDate, period);
}
}
@Override
@ -157,13 +175,13 @@ public class CuMemberAwardsServiceImpl extends ServiceImpl<CuMemberAwardsMapper,
if (cuMemberAwardsList.size() > 0) {
// 将变动值插入临时表中
// 更新会员表
iCuMemberService.updateCuMemberByPeriod(enoughAwardsMemberList, period);
iCuMemberService.updateCuMemberByPeriod(period);
// 更新结算网体表 -- 结算日期到当前日期的所有日结算表
updateMemberAwardPeriod(settleDate);
return Boolean.TRUE;
} else {
// 更新会员表
iCuMemberService.updateCuMemberByPeriod(null, period);
iCuMemberService.updateCuMemberByPeriod(period);
// 更新结算网体表 -- 结算日期到当前日期的所有日结算表
updateMemberAwardPeriod(settleDate);
return Boolean.FALSE;
@ -181,6 +199,40 @@ public class CuMemberAwardsServiceImpl extends ServiceImpl<CuMemberAwardsMapper,
iCuMemberTreeService.updateCuMemberSettleByPeriod(periodList);
}
/**
* 处理特殊升级内容
*/
private void calculateAwardsSpec(BdAwards bdAwards, String settleTableName, Date settleDate, Integer period) {
// 升级的时候需要拿比当前低一级的值进行处理
List<CuMemberSettleExt> cuMemberSettleExtList = iCuMemberTreeService.listUpgradeAwards(settleTableName, bdAwards.getAwardsValue() - 5);
if (CollectionUtil.isNotEmpty(cuMemberSettleExtList)) {
// 存在可以升级的
List<CuMemberAwards> cuMemberAwardsList = new ArrayList<>(cuMemberSettleExtList.size());
// 封装升级记录
for (CuMemberSettleExt cuMemberSettleExt : cuMemberSettleExtList) {
CuMemberAwards tmpCuMemberAwards = CuMemberAwards.builder()
.pkMember(cuMemberSettleExt.getPkMember())
.period(period)
.upType(EUpgradeType.AUTO_UPGRADE.getValue())
// 原等级
.oldLevel(cuMemberSettleExt.getPkAwards())
.newLevel(bdAwards.getPkId())
// 默认免考
.purchaseStatus(EYesNo.YES.getIntValue())
.build();
tmpCuMemberAwards.setPkCreator(MagicNumberConstants.PK_ADMIN);
tmpCuMemberAwards.setPkCountry(CountryConstants.CHINA_COUNTRY);
cuMemberAwardsList.add(tmpCuMemberAwards);
}
// 插入记录
baseMapper.saveBatchCuMemberAwards(cuMemberAwardsList);
// 更新会员表
iCuMemberService.updateCuMemberByPeriod(period);
// 更新结算网体表 -- 结算日期到当前日期的所有日结算表
updateMemberAwardPeriod(settleDate);
}
}
@Override
public void deleteCuMemberAwards(Long pkOrder, Long pkApprove, Date currentDateTime) {
LambdaUpdateWrapper<CuMemberAwards> updateWrapper = new LambdaUpdateWrapper<>();

View File

@ -35,9 +35,9 @@ import java.util.List;
public class CuMemberRiskControlServiceImpl extends ServiceImpl<CuMemberRiskControlMapper, CuMemberRiskControl> implements ICuMemberRiskControlService {
@DubboReference
IApprovalServiceApi approvalServiceApi;
IApprovalServiceApi iApprovalServiceApi;
@DubboReference
ICuMemberServiceLogServiceApi memberServiceLogServiceApi;
ICuMemberServiceLogServiceApi iCuMemberServiceLogServiceApi;
@Override
public List<CuMemberRiskControl> queryCuMemberRiskControl(Date settleDate) {
@ -92,7 +92,7 @@ public class CuMemberRiskControlServiceImpl extends ServiceImpl<CuMemberRiskCont
.signType(ESignType.getEnumByValue(memberRiskControlPetition.getSignType())).userIdList(memberRiskControlPetition.getUserIdList())
.sendIdList(memberRiskControlPetition.getSendIdList()).remark(memberRiskControlPetition.getRemark()).fileList(memberRiskControlPetition.getFileList())
.build();
R<String> submit = approvalServiceApi.submit(approvalSubmitDTO, memberRiskControlPetition.getLoginUser());
R<String> submit = iApprovalServiceApi.submit(approvalSubmitDTO, memberRiskControlPetition.getLoginUser());
if (!submit.isSuccess()) {
throw new RuntimeException("K值风控 提交审批失败!");
}
@ -122,7 +122,7 @@ public class CuMemberRiskControlServiceImpl extends ServiceImpl<CuMemberRiskCont
cuMemberServiceLog.setPkCountry(SecurityUtils.getPkCountry());
cuMemberServiceLog.setPkCreator(SecurityUtils.getUserId());
cuMemberServiceLog.setCreationTime(DateUtils.currentDateTime());
memberServiceLogServiceApi.insert(cuMemberServiceLog);
iCuMemberServiceLogServiceApi.insert(cuMemberServiceLog);
return cuMemberServiceLog;
}

View File

@ -2270,4 +2270,22 @@
a.pk_grade = b.pk_grade
</update>
<!-- 查询左右区足够可以升级的会员 -->
<select id="listUpgradeAwards" resultMap="CuMemberSettleExt">
select t.pk_member, ct.pk_awards
from (select ct.pk_place_parent pk_member
from ${settleTableName} ct
inner join bd_awards ba
on ba.pk_id = ct.pk_awards
and ba.del_flag = 0
where ct.category = 0
and ct.income_status = 0
and ba.awards_value >= #{awardsValue}
group by ct.pk_place_parent
having count(ct.pk_place_parent) = 2) t
left join ${settleTableName} ct
on ct.pk_member = t.pk_member
order by t.pk_member
</select>
</mapper>

View File

@ -144,7 +144,8 @@
</select>
<select id="queryBonusExpand" resultMap="CuBonusExpandExt">
select ce.*,cm.member_code,cm.member_name,bv.vertex_name from cu_bonus_expand ce
select ce.*,cm.member_code,cm.member_name,bv.vertex_name
from cu_bonus_expand ce
inner join cu_member cm
on ce.pk_member = cm.pk_id
left join bd_vertex bv

View File

@ -163,15 +163,16 @@
cu.member_code source_member_code,cu.member_name source_member_name,so.pk_rate,bc.out_exchange_rate,so.order_amount,
so.order_achieve,b.pk_country,b.pk_bonus_items,b.pretax_income,b.income_tax,b.real_income,b.income_status,
tar.member_code,tar.member_name,bg.pk_transaction pk_settle_grade,ba.pk_transaction pk_awards,bv.vertex_name,ct.team_name,
b.remark,b.income_ratio,b.income_dial_ratio,b.order_dial_ratio,(b.round+1) round,b.second,bct.short_name settle_country from (
b.remark,b.income_ratio,b.income_dial_ratio,b.order_dial_ratio,(b.round+1) round,b.second,bct.short_name settle_country
from (
select pk_id,pk_member,order_code,order_type,pk_rate,pk_country,order_amount,order_achieve from sa_order
union
select pk_id,pk_member,order_code,order_type,pk_rate,pk_country,order_amount,order_achieve from sa_t_order
) so
inner join (
select cb.pk_member,cp.pk_order,cb.period,cb.pk_country,cp.pk_bonus_items,cp.income_status,cp.CAL_ACHIEVE,cp.pretax_income,cp.income_tax,cp.real_income,
cp.remark,cp.income_ratio,cp.income_dial_ratio,cp.order_dial_ratio,cp.round,cp.second from
cu_member_bonus cb
cp.remark,cp.income_ratio,cp.income_dial_ratio,cp.order_dial_ratio,cp.round,cp.second
from cu_member_bonus cb
inner join cu_member_bonus_push cp
on cb.pk_id = cp.pk_bonus
where 1=1

View File

@ -16,7 +16,7 @@ import lombok.Getter;
public enum EBonusIncomeStatus {
/**
*正常
* 正常
*/
NORMAL(0, "正常", 0, EnumsPrefixConstants.BONUS_INCOME_STATUS + "0"),
@ -34,6 +34,12 @@ public enum EBonusIncomeStatus {
* K值
*/
RISK_CONTROL(3, "K值", 0, EnumsPrefixConstants.BONUS_INCOME_STATUS + "3"),
/**
* 延缓发放
*/
DELAY_GRANT(4, "延缓发放", 0, EnumsPrefixConstants.BONUS_INCOME_STATUS + "4"),
;
/**

View File

@ -84,12 +84,10 @@ public class ComputeUtil {
}
/**
* 值1大于等于值2返回值2否则返回值1
*
* @param value1 值1
* @param value2 值2
* @Description: 统一的除法计算方法, 向下取整
* @return: BigDecimal
* @Author: sui q
* @Date: 2022/9/20 21:09
*/
public static BigDecimal obtainMinAchieve(BigDecimal value1, BigDecimal value2) {
if (compareValue(value1, value2)) {
@ -120,12 +118,10 @@ public class ComputeUtil {
}
/**
* 比较大小前面的值大于等于后面的值
*
* @param value1 值1
* @param value2 值2
* @Description: 比较大小前面的值大于等于后面的值
* @return: Boolean
* @Author: sui q
* @Date: 2022/9/20 21:23
*/
public static Boolean compareValue(BigDecimal value1, BigDecimal value2) {
if (value1.compareTo(value2) >= 0) {
@ -206,9 +202,6 @@ public class ComputeUtil {
*
* @param value1
* @param value2 比例
* @return: BigDecimal
* @Author: sui q
* @Date: 2022/11/14 17:02
*/
public static BigDecimal computeBonusMultiply(BigDecimal value1, BigDecimal value2) {
return value1.multiply(value2).multiply(BigDecimal.valueOf(0.01));

View File

@ -14,9 +14,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 服务补贴
* </p>
*
* @author hzs
* @since 2022-11-01
@ -61,5 +59,4 @@ public class BdBonusService extends BaseEntity {
private String assessmentTypeVal;
}

View File

@ -4,7 +4,9 @@ import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -13,9 +15,7 @@ import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p> 4-n增加碰次设置
* 4-n增加碰次设置
*
* @author hzs
* @since 2024-07-19

View File

@ -11,9 +11,7 @@ import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
* 会员奖金-拓展收益明细表
* </p>
*
* @author hzs
* @since 2022-11-15

View File

@ -12,10 +12,7 @@ import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* <p>
* 奖金4N配置
* </p>
*
* @author hzs
* @since 2022-10-31