## 区域收益改为商品价格的5%;盒数大小区计算调整;秒结计算等级以会员表关系为主查询;

This commit is contained in:
cabbage 2025-06-12 13:28:52 +08:00
parent 1c77821a24
commit 684ecdb098
5 changed files with 188 additions and 79 deletions

View File

@ -86,6 +86,7 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl<CuMemberRetailRa
@Override @Override
public List<CuMemberRetailRangeExt> queryCuMemberSecondRangeParent(String rangeTableName, String secondTableName, Long pkMember) { public List<CuMemberRetailRangeExt> queryCuMemberSecondRangeParent(String rangeTableName, String secondTableName, Long pkMember) {
// 查询伞上
return baseMapper.queryCuMemberSecondRangeParent(rangeTableName, secondTableName, pkMember); return baseMapper.queryCuMemberSecondRangeParent(rangeTableName, secondTableName, pkMember);
} }
@ -169,9 +170,9 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl<CuMemberRetailRa
@Override @Override
public void mergeMemberSecondRetailRangeByRange(String rangeTableName, String secondRangeTableName, Long pkMember) { public void mergeMemberSecondRetailRangeByRange(String rangeTableName, String secondRangeTableName, Long pkMember) {
// 当前网体更新极差秒接表自己伞上 // 当前网体更新极差秒接表血缘伞上
baseMapper.mergeMemberSecondRetailRangeByRange(secondRangeTableName, pkMember); baseMapper.mergeMemberSecondRetailRangeByRange(secondRangeTableName, pkMember);
// 昨天的结算表更新极差秒结状态 // 昨天的结算表更新极差秒结激活状态和等级
baseMapper.mergeMemberSecondRetailRangeByRangeEnable(rangeTableName, secondRangeTableName, pkMember); baseMapper.mergeMemberSecondRetailRangeByRangeEnable(rangeTableName, secondRangeTableName, pkMember);
} }

View File

@ -1,5 +1,6 @@
package com.hzs.bonus.bonus.service.impl; package com.hzs.bonus.bonus.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.hzs.bonus.achieve.service.ICuMemberRangeService; import com.hzs.bonus.achieve.service.ICuMemberRangeService;
import com.hzs.bonus.achieve.service.ICuMemberRetailRangeService; import com.hzs.bonus.achieve.service.ICuMemberRetailRangeService;
import com.hzs.bonus.base.service.ICuMemberService; import com.hzs.bonus.base.service.ICuMemberService;
@ -64,13 +65,13 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
Map<Long, CuMemberBonus> cuMemberBonusMap, List<CuMemberBonusDetail> cuMemberBonusDetailList) { Map<Long, CuMemberBonus> cuMemberBonusMap, List<CuMemberBonusDetail> cuMemberBonusDetailList) {
// 会员级差表 // 会员级差表
String rangeTableName = TableNameConstants.CU_MEMBER_RETAIL_RANGE + beforePeriod; String rangeTableName = TableNameConstants.CU_MEMBER_RETAIL_RANGE + beforePeriod;
// 更新极差秒接表用昨天的结算表从当前会员往上找到顶 // 更新极差秒接表用昨天的结算表血缘伞上
iCuMemberRetailRangeService.mergeMemberSecondRetailRangeByRange(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); iCuMemberRetailRangeService.mergeMemberSecondRetailRangeByRange(rangeTableName, secondRangeTableName, saOrderExt.getPkMember());
// 处理会员等级查询会员最新手动升级记录更新秒结表会员等级小于手动升级的会员等级 // 处理会员等级查询会员最新手动升级记录更新秒结表会员等级小于手动升级的会员等级
// TODO new 秒结只影响上面更新等级只更新血缘上就可以不需要全网更新 // TODO new 秒结只影响上面更新等级应该只更新血缘上就可以不需要全网更新 -- 是否需要修改
iCuMemberGradeService.updateCuMemberGradeSecond(secondRangeTableName, currentPeriod); iCuMemberGradeService.updateCuMemberGradeSecond(secondRangeTableName, currentPeriod);
// 按照血缘查询该会员所有伞上会员昨天日结表累计值 + 今天秒结表新増值 // 按照血缘查询该会员血缘伞上昨天日结表累计值 + 今天秒结表新増值
List<CuMemberRetailRangeExt> memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); List<CuMemberRetailRangeExt> memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember());
// 会员结算mapkey会员IDvalue结算扩展 // 会员结算mapkey会员IDvalue结算扩展
@ -227,7 +228,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
iCuMemberRetailRangeService.mergeMemberRetailGradeByMember(secondRangeTableName, saOrderExt.getPkMember()); iCuMemberRetailRangeService.mergeMemberRetailGradeByMember(secondRangeTableName, saOrderExt.getPkMember());
// 恢复秒结表奖衔 // 恢复秒结表奖衔
iCuMemberAwardsService.mergeCuMemberBackAwards(secondRangeTableName, saOrderExt.getPkMember(), currentPeriod); iCuMemberAwardsService.mergeCuMemberBackAwards(secondRangeTableName, saOrderExt.getPkMember(), currentPeriod);
// 查询 昨天日结 + 今天秒结 血缘上会员结算数据 // 查询 昨天日结 + 今天秒结 血缘伞上+直推
memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember());
} else { } else {
// 非当天撤单 // 非当天撤单
@ -915,7 +916,8 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
targetMemberRangeExt.setMonthBoxNum(targetMemberRangeExt.getMonthBoxNum() + boxNum); targetMemberRangeExt.setMonthBoxNum(targetMemberRangeExt.getMonthBoxNum() + boxNum);
targetMemberRangeExt.setTeamNewBoxNum(targetMemberRangeExt.getTeamNewBoxNum() + boxNum); targetMemberRangeExt.setTeamNewBoxNum(targetMemberRangeExt.getTeamNewBoxNum() + boxNum);
// 计算等级 // 计算等级
calculateGradeAwards(period, memberRangeExtMap, rangeTableName, saOrderExt, retailTeamGradeMap, retailAwardsMap, secondRangeTableName, cuMemberGradeList, cuMemberAwardsList, targetMemberRangeExt); calculateGradeAwards(period, memberRangeExtMap, rangeTableName, saOrderExt, retailTeamGradeMap, retailAwardsMap,
secondRangeTableName, cuMemberGradeList, cuMemberAwardsList, targetMemberRangeExt);
} }
targetMemberRangeExt = memberRangeExtMap.get(targetMemberRangeExt.getPkParent()); targetMemberRangeExt = memberRangeExtMap.get(targetMemberRangeExt.getPkParent());
} }
@ -943,37 +945,35 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember()); cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember());
} }
// TODO new 秒结处理这块应该有问题自己消费的盒数直接当成大区如果昨天直推会员有数据查询秒结表可能没有这些会员此处就可能出现问题 // new 新逻辑确认注水 2 个虚拟区自己消费 1 个虚拟区伞下直推所有的最大
// 有注水的大区无限大新增全算小区 // 大区盒数默认为自己累计消费盒数
// 大区盒数
int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum(); int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum();
if (targetMemberRangeExt.getBigBoxNum() > 0) { if (targetMemberRangeExt.getBigBoxNum() > bigBoxNum) {
// 大区存在注水盒数直接使用大区注水盒数 // 注水大区如果大则使用注水盒数为大区
bigBoxNum = targetMemberRangeExt.getBigBoxNum(); bigBoxNum = targetMemberRangeExt.getBigBoxNum();
} else { }
// 秒结 cuMemberRangeExtList 为直推会员数据 memberRangeExtMap 为会员伞上数据这块应该永远不会处理 // 秒结补全直推数据此处秒结和日结可以使用同一逻辑
// 日结这块处理直推判断大小区没问题 for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) {
for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) {
if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember());
cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); }
} // 最新确认逻辑计算大小区时不需要去掉注水
// 伞下团队累计盒数 + 自己消费盒数 - 大区注水 - 小区注水 // 伞下团队累计盒数 + 自己消费盒数
int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum() int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum();
- cuMemberRetailRangeExt.getBigBoxNum() - cuMemberRetailRangeExt.getSmallBoxNum(); if (areaBoxNum > bigBoxNum) {
if (areaBoxNum > bigBoxNum) { // 实际订单累计盒数 大于 累计消费盒数实际订单累计盒数为大区
// 实际订单累计盒数 大于 累计消费盒数实际订单累计盒数为大区 bigBoxNum = areaBoxNum;
bigBoxNum = areaBoxNum;
}
} }
} }
// 小区盒数 // 小区盒数
int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum; int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum;
if (smallBoxNum >= bdGrade.getBoxSmallTotal()) { if (smallBoxNum >= bdGrade.getBoxSmallTotal()) {
// 小区盒数 大于等于 升级小区盒数 // 小区盒数 大于等于 升级小区盒数
CuMemberGrade cuMemberGrade = getCuMemberGrade(period, targetMemberRangeExt, bdGrade); CuMemberGrade cuMemberGrade = getCuMemberGrade(period, targetMemberRangeExt, bdGrade);
cuMemberGradeList.add(cuMemberGrade); cuMemberGradeList.add(cuMemberGrade);
targetMemberRangeExt.setGradeValue(bdGrade.getGradeValue());
targetMemberRangeExt.setPkGrade(bdGrade.getPkId()); targetMemberRangeExt.setPkGrade(bdGrade.getPkId());
targetMemberRangeExt.setGradeValue(bdGrade.getGradeValue());
targetMemberRangeExt.setGradeName(bdGrade.getGradeName()); targetMemberRangeExt.setGradeName(bdGrade.getGradeName());
} }
} }
@ -1131,28 +1131,27 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember()); cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember());
} }
// 有注水的大区无限大新增全算小区 // new 新逻辑确认注水 2 个虚拟区自己消费 1 个虚拟区伞下直推所有的最大
// 大区盒数 // 大区盒数默认为自己累计消费盒数
int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum(); int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum();
if (targetMemberRangeExt.getBigBoxNum() > 0) { if (targetMemberRangeExt.getBigBoxNum() > bigBoxNum) {
// 大区存在注水盒数直接使用大区注水盒数 // 注水大区如果大则使用注水盒数为大区
bigBoxNum = targetMemberRangeExt.getBigBoxNum(); bigBoxNum = targetMemberRangeExt.getBigBoxNum();
} else { }
// 秒结 cuMemberRangeExtList 为直推会员数据 memberRangeExtMap 为会员伞上数据这块应该永远不会处理 // 秒结补全直推数据此处秒结和日结可以使用同一逻辑
// 日结这块处理直推判断大小区没问题 for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) {
for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) {
if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember());
cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); }
} // 最新确认逻辑计算大小区时不需要去掉注水
// 伞下团队累计盒数 + 自己消费盒数 - 大区注水 - 小区注水 // 伞下团队累计盒数 + 自己消费盒数
int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum() int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum();
- cuMemberRetailRangeExt.getBigBoxNum() - cuMemberRetailRangeExt.getSmallBoxNum(); if (areaBoxNum > bigBoxNum) {
if (areaBoxNum > bigBoxNum) { // 实际订单累计盒数 大于 累计消费盒数实际订单累计盒数为大区
// 实际订单累计盒数 大于 累计消费盒数实际订单累计盒数为大区 bigBoxNum = areaBoxNum;
bigBoxNum = areaBoxNum;
}
} }
} }
// 小区盒数 // 小区盒数
int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum; int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum;
if (smallBoxNum >= bdGrade.getBoxSmallTotal()) { if (smallBoxNum >= bdGrade.getBoxSmallTotal()) {
@ -1310,6 +1309,11 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 推荐人 // 推荐人
long pkParent = sourceMemberRangeExt.getPkParent(); long pkParent = sourceMemberRangeExt.getPkParent();
// 商品价格没有乘商品数量 // 商品价格没有乘商品数量
BigDecimal waresPrice = saOrderItems.getWaresPrice();
// 商品数量
Integer waresQuantity = saOrderItems.getWaresQuantity();
// 商品价格
BigDecimal beginBuyPrice = saOrderItems.getWaresPrice(); BigDecimal beginBuyPrice = saOrderItems.getWaresPrice();
BigDecimal comBuyPrice = saOrderItems.getWaresPrice(); BigDecimal comBuyPrice = saOrderItems.getWaresPrice();
@ -1318,8 +1322,12 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 直推级差收益 // 直推级差收益
BigDecimal calBonusIncome = BigDecimal.ZERO; BigDecimal calBonusIncome = BigDecimal.ZERO;
// 临时等级 // 前一个会员等级
int tmpGradeValue = 0; int beforeGradeValue = 0;
// 前一个会员等级的平级收益人数
int beforeSameAlgebra = 0;
// 前一个会员等级的平级收益
BigDecimal beforeSameBonus = BigDecimal.ZERO;
// 计算直推级差 // 计算直推级差
while (true) { while (true) {
// 推荐人 // 推荐人
@ -1330,8 +1338,6 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 推荐人的推荐人 // 推荐人的推荐人
pkParent = targetMemberRangeExt.getPkParent(); pkParent = targetMemberRangeExt.getPkParent();
// TODO new 新处理奖金
if (EAccountStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getAccountStatus() if (EAccountStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getAccountStatus()
|| ECategory.NORMAL.getValue() != targetMemberRangeExt.getCategory() || ECategory.NORMAL.getValue() != targetMemberRangeExt.getCategory()
|| targetMemberRangeExt.getEnableStatus() == EYesNo.NO.getIntValue() || targetMemberRangeExt.getEnableStatus() == EYesNo.NO.getIntValue()
@ -1343,35 +1349,107 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 当前会员等级值 // 当前会员等级值
int calGradeValue = targetMemberRangeExt.getGradeValue(); int calGradeValue = targetMemberRangeExt.getGradeValue();
// 税前收益 // 直推级差税前收益
BigDecimal pretaxIncome; BigDecimal rangeBonusIncome = null;
if (tmpGradeValue == 0) { // 平级税前收益
// 临时等级为0 BigDecimal sameBonusIncome = null;
tmpGradeValue = calGradeValue;
if (beforeGradeValue == 0) {
// 前一个会员等级为0肯定为第一次处理直接处理直推级差收益
if (EGrade.HAI_FAN.getValue() == calGradeValue) { if (EGrade.HAI_FAN.getValue() == calGradeValue) {
// VIP拿1份40 // VIP拿1份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS; rangeBonusIncome = RetailConstants.RANGE_BONUS;
} else if (EGrade.YOU_KE.getValue() == calGradeValue) { } else if (EGrade.YOU_KE.getValue() == calGradeValue) {
// SVIP拿2份40 // SVIP拿2份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("2")); rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("2"));
} else if (EGrade.MAKER.getValue() == calGradeValue) { } else if (EGrade.MAKER.getValue() == calGradeValue) {
// 卓越拿3份40 // 卓越拿3份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("3")); rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("3"));
} else if (EGrade.VIP.getValue() == calGradeValue) { } else if (EGrade.VIP.getValue() == calGradeValue) {
// 首席拿4份40 // 首席拿4份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("4")); rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("4"));
} else if (EGrade.S_VIP.getValue() == calGradeValue) { } else if (EGrade.S_VIP.getValue() == calGradeValue) {
// 合伙人拿5份40 // 合伙人拿5份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("5")); rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("5"));
} }
} else if (calGradeValue == tmpGradeValue) { // 赋值前一个会员等级
// 当前会员等级 beforeGradeValue = calGradeValue;
} else if (calGradeValue == beforeGradeValue) {
// 当前会员等级 = 前一个会员等级
if (EGrade.HAI_FAN.getValue() == calGradeValue) {
// V1 没有平级收益
continue;
}
if (beforeSameAlgebra >= RetailConstants.SAME_ALGEBRA) {
// 平级收益已经满10代不继续处理平级收益
continue;
}
// 平级收益商品价格 * 千分之五 -- 2位小数四舍五入
sameBonusIncome = waresPrice.multiply(RetailConstants.SAME_RATIO).setScale(2, BigDecimal.ROUND_HALF_UP);
// 平级收益累计
beforeSameBonus = beforeSameBonus.add(sameBonusIncome);
// 平级等级代数等级
beforeSameAlgebra += 1;
} else if (calGradeValue > beforeGradeValue) {
// 当前会员等级 > 前一个会员等级
int tmpGradeVal = (calGradeValue - beforeGradeValue) / 10;
} else if (calGradeValue > tmpGradeValue) { // 新等级的直推级差收益
rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal(tmpGradeVal));
// 直推级差收益 = 新等级的直推级差收益 - 上一等级的平级收益
rangeBonusIncome = rangeBonusIncome.subtract(beforeSameBonus);
// 赋值前一个会员等级
beforeGradeValue = calGradeValue;
// 平级收益记录从新开始计算
beforeSameAlgebra = 0;
beforeSameBonus = BigDecimal.ZERO;
} else {
// 当前会员等级 < 前一个会员等级直接跳过
continue;
} }
if (null != rangeBonusIncome) {
// 处理直推级差收益
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(),
targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate());
int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_RANGE_INCOME.getValue());
CuMemberBonusRange cuMemberBonusRange = getCuMemberRetailBonusRange(saOrderExt, targetMemberRangeExt, cuMemberBonus, pkBonusItems);
cuMemberBonusRange.setCalValue(BigDecimal.ZERO);
cuMemberBonusRange.setPretaxIncome(rangeBonusIncome.multiply(new BigDecimal(waresQuantity)));
cuMemberBonusRange.setPkRange(targetMemberRangeExt.getPkGrade());
cuMemberBonusRange.setPkBeforeRange(sourceMemberRangeExt.getPkGrade());
cuMemberBonusRange.setPkOrderItems(saOrderItems.getPkId());
rangeRetailRemark(saOrderExt, cuMemberBonusRange, sourceMemberRangeExt, targetMemberRangeExt);
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusRange, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusRange.getIncomeStatus()) {
cuMemberBonus.setRetailRangeIncome(ComputeUtil.computeAdd(cuMemberBonus.getRetailRangeIncome(), cuMemberBonusRange.getPretaxIncome()));
setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange);
}
memberBonusRangeList.add(cuMemberBonusRange);
}
if (null != sameBonusIncome) {
// 处理平级收益
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(),
targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate());
int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_SAME_LEVEL_INCOME.getValue());
CuMemberBonusRange oriMemberBonusRange = getCuMemberRetailBonusRange(saOrderExt, targetMemberRangeExt, cuMemberBonus, pkBonusItems);
oriMemberBonusRange.setCalValue(BigDecimal.valueOf(2));
oriMemberBonusRange.setPretaxIncome(sameBonusIncome.multiply(new BigDecimal(waresQuantity)));
oriMemberBonusRange.setPkRange(targetMemberRangeExt.getPkGrade());
oriMemberBonusRange.setPkBeforeRange(sourceMemberRangeExt.getPkGrade());
oriMemberBonusRange.setPkOrderItems(saOrderItems.getPkId());
oriRetailRangeRemark(saOrderExt, oriMemberBonusRange, sourceMemberRangeExt, targetMemberRangeExt);
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, oriMemberBonusRange, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
if (EBonusIncomeStatus.NORMAL.getValue() == oriMemberBonusRange.getIncomeStatus()) {
cuMemberBonus.setRetailSameLevelIncome(ComputeUtil.computeAdd(cuMemberBonus.getRetailSameLevelIncome(), oriMemberBonusRange.getPretaxIncome()));
setRetailTotal(bdBonusDeduct, cuMemberBonus, oriMemberBonusRange);
}
memberBonusRangeList.add(oriMemberBonusRange);
}
///////////////////////////////////////////////////////////////
// 如果价格是209代表是第一单激活只有平级收益只有V5有平级收益 // 如果价格是209代表是第一单激活只有平级收益只有V5有平级收益
if (beginBuyPrice.equals(BigDecimal.valueOf(209))) { if (beginBuyPrice.equals(BigDecimal.valueOf(209))) {
@ -1386,6 +1464,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 有极差或者有平级 // 有极差或者有平级
if (ComputeUtil.compareGreaterThan(beginBuyPrice, buyPrice)) { if (ComputeUtil.compareGreaterThan(beginBuyPrice, buyPrice)) {
// 计算极差 // 计算极差
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(), CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(),
targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate()); targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate());
int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_RANGE_INCOME.getValue()); int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_RANGE_INCOME.getValue());
@ -1402,6 +1481,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange); setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange);
} }
memberBonusRangeList.add(cuMemberBonusRange); memberBonusRangeList.add(cuMemberBonusRange);
beginBuyPrice = buyPrice; beginBuyPrice = buyPrice;
comBuyPrice = buyPrice; comBuyPrice = buyPrice;
beginGradeValue = calGradeValue; beginGradeValue = calGradeValue;
@ -1514,7 +1594,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
*/ */
CuMemberBonusDetail calculateRetailAreaBonus(Map<String, CuMemberRetailRangeExt> countyRangeExtMap, CuMemberBonusDetail calculateRetailAreaBonus(Map<String, CuMemberRetailRangeExt> countyRangeExtMap,
BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrder saOrder) { Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrderExt saOrder) {
// 重消订单没有区域分红 // 重消订单没有区域分红
if (saOrder.getOrderType().equals(EOrderType.RETAIL_CONSUME.getValue())) { if (saOrder.getOrderType().equals(EOrderType.RETAIL_CONSUME.getValue())) {
return null; return null;
@ -1545,13 +1625,24 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
if (validatePkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_AREA_INCOME.getValue())) { if (validatePkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_AREA_INCOME.getValue())) {
return null; return null;
} }
// 没有盒数商品直接返回空
if (CollectionUtil.isEmpty(saOrder.getOrderWaresExtList())) {
return null;
}
BigDecimal boxNumBig = new BigDecimal(saOrder.getBoxNum()); // 区域收益商品价格 * 0.5% * 商品数量
// 处理区域收益每盒2元 // 处理区域收益 -- 计算比例为 0.5%
BigDecimal benefitIncome = RetailConstants.AREA_BOX_BONUS.multiply(boxNumBig); BigDecimal benefitIncome = BigDecimal.ZERO;
CuMemberBonusDetail cuMemberBonusDetail = packageBenefitIncome(bonusConfigDTO, period, cuMemberBonusMap, null, BigDecimal.ZERO, benefitIncome, // 计算业绩此处作为比例
BigDecimal calAchieve = BigDecimal.ZERO;
for (SaOrderWaresExt saOrderWaresExt : saOrder.getOrderWaresExtList()) {
benefitIncome = benefitIncome.add(saOrderWaresExt.getWaresPrice().multiply(RetailConstants.SAME_RATIO)).setScale(2, BigDecimal.ROUND_HALF_UP);
calAchieve = calAchieve.add(saOrderWaresExt.getWaresPrice());
}
CuMemberBonusDetail cuMemberBonusDetail = packageBenefitIncome(bonusConfigDTO, period, cuMemberBonusMap, null, RetailConstants.SAME_RATIO, benefitIncome,
cuMemberRetailRangeExt, EBonusItems.RETAIL_AREA_INCOME.getValue(), BonusMsgConstants.RETAIL_AREA_INCOME); cuMemberRetailRangeExt, EBonusItems.RETAIL_AREA_INCOME.getValue(), BonusMsgConstants.RETAIL_AREA_INCOME);
cuMemberBonusDetail.setCalAchieve(boxNumBig); // 计算业绩以盒数做为基础
cuMemberBonusDetail.setCalAchieve(new BigDecimal(saOrder.getBoxNum()));
cuMemberBonusDetail.setPkOrder(saOrder.getPkId()); cuMemberBonusDetail.setPkOrder(saOrder.getPkId());
String remark = String.format(BonusMsgConstants.RETAIL_AREA_INCOME, saOrder.getOrderCode(), String remark = String.format(BonusMsgConstants.RETAIL_AREA_INCOME, saOrder.getOrderCode(),
memberRangeExtMap.get(saOrder.getPkMember()).getMemberCode() + memberRangeExtMap.get(saOrder.getPkMember()).getMemberName(), memberRangeExtMap.get(saOrder.getPkMember()).getMemberCode() + memberRangeExtMap.get(saOrder.getPkMember()).getMemberName(),
@ -1888,15 +1979,14 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
private CuMemberBonusDetail packageBenefitIncome(BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberBonus> cuMemberBonusMap, String month, private CuMemberBonusDetail packageBenefitIncome(BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberBonus> cuMemberBonusMap, String month,
BigDecimal benefitAvgRatio, BigDecimal benefitAvgIncome, CuMemberRetailRangeExt cuMemberRetailRangeExt, Integer bonusItemsValue, String msg) { BigDecimal benefitAvgRatio, BigDecimal benefitAvgIncome, CuMemberRetailRangeExt cuMemberRetailRangeExt, Integer bonusItemsValue, String msg) {
// 福利平均
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, cuMemberRetailRangeExt.getPkMember(), CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, cuMemberRetailRangeExt.getPkMember(),
cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberRetailRangeExt.getPkRate()); cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberRetailRangeExt.getPkRate());
SaOrder saOrderExt = SaOrder.builder().pkId(0L).orderAchieve(BigDecimal.ZERO).build(); SaOrder saOrderExt = SaOrder.builder().pkId(0L).orderAchieve(BigDecimal.ZERO).build();
CuMemberBonusDetail cuMemberBonusDetail = getCuMemberBonusDetail(saOrderExt, cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberBonus); CuMemberBonusDetail cuMemberBonusDetail = getCuMemberBonusDetail(saOrderExt, cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberBonus);
// 计算比例 // 计算比例
cuMemberBonusDetail.setCalValue(benefitAvgRatio); cuMemberBonusDetail.setCalValue(benefitAvgRatio);
cuMemberBonusDetail.setPkBonusItems(getPkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), bonusItemsValue));
cuMemberBonusDetail.setPretaxIncome(benefitAvgIncome); cuMemberBonusDetail.setPretaxIncome(benefitAvgIncome);
cuMemberBonusDetail.setPkBonusItems(getPkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), bonusItemsValue));
// 收益占比 // 收益占比
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusDetail, BigDecimal.ZERO, BigDecimal.ONE); BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusDetail, BigDecimal.ZERO, BigDecimal.ONE);
if (bonusItemsValue != EBonusItems.RETAIL_AREA_INCOME.getValue()) { if (bonusItemsValue != EBonusItems.RETAIL_AREA_INCOME.getValue()) {

View File

@ -150,7 +150,8 @@
where del_flag = 0 where del_flag = 0
start start
with pk_id = #{pkMember} with pk_id = #{pkMember}
connect by pk_id = prior pk_parent) a connect by pk_id = prior pk_parent
) a
) b ) b
on (a.pk_member = b.pk_member) on (a.pk_member = b.pk_member)
when not matched then when not matched then
@ -172,7 +173,8 @@
where del_flag = 0 where del_flag = 0
start start
with pk_id = #{pkMember} with pk_id = #{pkMember}
connect by pk_id = prior pk_parent) a connect by pk_id = prior pk_parent
) a
left join ${rangeTableName} b left join ${rangeTableName} b
on a.pk_id = b.pk_member on a.pk_id = b.pk_member
where b.enable_status = 0 where b.enable_status = 0
@ -652,6 +654,20 @@
</select> </select>
<select id="queryCuMemberSecondRangeExtByParent" resultMap="CuMemberRetailRangeExt"> <select id="queryCuMemberSecondRangeExtByParent" resultMap="CuMemberRetailRangeExt">
select cm.pk_id pkMember,
nvl(b.team_box_num, 0) + nvl(a.team_new_box_num, 0) team_box_num,
nvl(b.consume_box_num, 0) + nvl(a.new_box_num, 0) consume_box_num,
nvl(b.big_box_num, 0) big_box_num,
nvl(b.small_box_num, 0) small_box_num
from cu_member cm
left join ${secondTableName} a
on cm.pk_id = a.pk_member
left join ${rangeTableName} b
on cm.pk_id = b.pk_member
where cm.pk_parent = #{pkMember}
and cm.del_flag = 0
<!--
select a.pk_member, select a.pk_member,
cm.member_code, cm.member_code,
cm.member_name, cm.member_name,
@ -705,6 +721,7 @@
where bw.del_flag = 0 where bw.del_flag = 0
and bg.del_flag = 0 and bg.del_flag = 0
and a.pk_parent = #{pkMember} and a.pk_parent = #{pkMember}
-->
</select> </select>
<select id="queryCuMemberSpeRetailRangeParent" <select id="queryCuMemberSpeRetailRangeParent"

View File

@ -258,13 +258,9 @@ public class RetailMemberController extends BaseController {
*/ */
@GetMapping("/region-tree") @GetMapping("/region-tree")
public AjaxResult regionTree() { public AjaxResult regionTree() {
if (EEnv.TEST.getValue().equals(BdConfig.getEnv()) && SecurityUtils.getUserId().equals(615423L)) {
// 测试环境指定账号返回收益区域为空
return AjaxResult.success();
}
List<BdArea> areaList = iCuMemberRetailRegionService.listChooseRegion(SecurityUtils.getSystemType()); List<BdArea> areaList = iCuMemberRetailRegionService.listChooseRegion(SecurityUtils.getSystemType());
if (CollectionUtil.isEmpty(areaList)) { if (CollectionUtil.isEmpty(areaList)) {
log.info("region-tree: 111");
return AjaxResult.success(); return AjaxResult.success();
} }
TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
@ -277,6 +273,7 @@ public class RetailMemberController extends BaseController {
tree.setParentId(treeNode.getParent().toString()); tree.setParentId(treeNode.getParent().toString());
tree.setName(treeNode.getName()); tree.setName(treeNode.getName());
}); });
log.info("region-tree: 222");
return AjaxResult.success(build); return AjaxResult.success(build);
} }

View File

@ -12,11 +12,15 @@ public class RetailConstants {
/** /**
* 直推级差等级收益每个等级为40元 * 直推级差等级收益每个等级为40元
*/ */
public static final BigDecimal LEVEL_RANGE_BONUS = new BigDecimal("40"); public static final BigDecimal RANGE_BONUS = new BigDecimal("40");
/** /**
* 直推平级收益比例每代拿商品价格的千分之五 * 直推平级收益比例每代拿商品价格的千分之五
*/ */
public static final BigDecimal LEVEL_RATIO = new BigDecimal("0.005"); public static final BigDecimal SAME_RATIO = new BigDecimal("0.005");
/**
* 直推平缓收益代数每级都是10代
*/
public static final Integer SAME_ALGEBRA = 10;
/** /**
* 区域分红每盒2元 * 区域分红每盒2元