## 校验分红考核时处理配置会员为空情况;直推级差添加20%扣项;

This commit is contained in:
cabbage 2025-04-11 10:07:30 +08:00
parent 82ae52e2ef
commit 491086308d
7 changed files with 146 additions and 90 deletions

View File

@ -93,14 +93,14 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 优客 推荐 6000/36000/128000 1800 vip 600 svip拿 600
// vip 推荐 36000 10800 svip 7200
// svip推荐 128000 38000
// TODO new 需要按新逻辑修改
// TODO new 乐学直推级差收益需要按新逻辑修改级差等级4个封顶上限修改
Set<Long> memberSet = new HashSet<>();
specialOrderList.forEach(saOrderExt ->
memberSet.add(saOrderExt.getPkMember()));
specialOrderList.forEach(saOrderExt -> memberSet.add(saOrderExt.getPkMember()));
cuMemberSettleExtList = cuMemberTreeService.batchQuerySpecialCuMemberSettleParent(settleTableName, memberSet);
getMemberSettle(cuMemberSettleExtMap, cuMemberSettleExtList);
// 计算奖金
for (SaOrderExt saOrderExt : specialOrderList) {
// 订单能发放总奖金
BigDecimal maxBonus;
// 根据金额验证最大金额
if (ComputeUtil.compareValue(saOrderExt.getOrderAmount(), MagicNumberConstants.V4_AMOUNT)) {
@ -119,8 +119,10 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 订单金额小于 2000没有奖金
maxBonus = BigDecimal.ZERO;
}
CuMemberSettleExt sourceSettleExt = cuMemberSettleExtMap.get(saOrderExt.getPkMember());
Long pkParent = sourceSettleExt.getPkParent();
// 已发放奖金
BigDecimal grantBonus = BigDecimal.ZERO;
while (ComputeUtil.compareGreaterThan(maxBonus, grantBonus)) {
CuMemberSettleExt targetMemberSettleExt = cuMemberSettleExtMap.get(pkParent);
@ -128,11 +130,14 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
break;
}
// 死点没有奖金
if (ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory() || EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus() ||
validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.DIRECT_INCOME.getValue())) {
if (ECategory.NORMAL.getValue() != targetMemberSettleExt.getCategory()
|| EAccountStatus.STOP_INCOME.getValue() == targetMemberSettleExt.getAccountStatus()
|| validatePkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.DIRECT_INCOME.getValue())) {
// 非正常点位 停算收益 没有这个奖项则直接跳过当前人
pkParent = targetMemberSettleExt.getPkParent();
continue;
}
// 初始化会员奖金汇总
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
// 直推奖金明细
int pkBonusItem = getPkBonusItems(bonusConfigDTO, targetMemberSettleExt.getPkSettleCountry(), EBonusItems.DIRECT_INCOME.getValue());
@ -165,17 +170,27 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
grantBonus = ComputeUtil.computeAdd(grantBonus, pretaxIncome);
cuMemberBonusPush.setPretaxIncome(pretaxIncome);
cuMemberBonusPush.setIncomeTax(BigDecimal.ZERO);
cuMemberBonusPush.setRealIncome(pretaxIncome);
cuMemberBonusPush.setIncomeTax(BigDecimal.ZERO);
// TODO new 需要扣除20%
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusPush, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusPush.getIncomeStatus()) {
cuMemberBonus.setGlobalPoints(ComputeUtil.computeAdd(cuMemberBonus.getGlobalPoints(), cuMemberBonusPush.getPretaxIncome()));
// 实发收益总计
// BigDecimal realIncome = ReflectUtils.invokeGetter(cuMemberBonusPush, BonusFieldConstants.REAL_INCOME);
// cuMemberBonus.setRealIncomeTotal(ComputeUtil.computeAdd(cuMemberBonus.getRealIncomeTotal(), realIncome));
// TODO new 首购实发小计实发收益总计
// 比原来多累计到首购实发小计
setFirstPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusPush);
}
cuMemberBonusPush.setRemark(String.format(BonusMsgConstants.RECOMMEND_SPECIAL_DIRECT, saOrderExt.getOrderCode(),
sourceSettleExt.getMemberCode() + sourceSettleExt.getMemberName(),
targetMemberSettleExt.getMemberCode() + targetMemberSettleExt.getMemberName(),
cuMemberBonusPush.getRealIncome()));
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusPush.getIncomeStatus()) {
cuMemberBonus.setGlobalPoints(ComputeUtil.computeAdd(cuMemberBonus.getGlobalPoints(), cuMemberBonusPush.getPretaxIncome()));
BigDecimal realIncome = ReflectUtils.invokeGetter(cuMemberBonusPush, BonusFieldConstants.REAL_INCOME);
cuMemberBonus.setRealIncomeTotal(ComputeUtil.computeAdd(cuMemberBonus.getRealIncomeTotal(), realIncome));
}
cuMemberBonusPushList.add(cuMemberBonusPush);
pkParent = targetMemberSettleExt.getPkParent();
}
@ -184,6 +199,9 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
return cuMemberBonusPushList;
}
/**
* 计算直推奖金
*/
private BigDecimal computePushRangeBonus(CuMemberSettleExt targetMemberSettleExt,
BigDecimal V4Bonus, BigDecimal V3Bonus,
BigDecimal V2Bonus, BigDecimal V1Bonus) {
@ -338,6 +356,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
void setBonusPushIncome(Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, BonusConfigDTO bonusConfigDTO, SaOrderExt saOrderExt, CuMemberBonus cuMemberBonus, CuMemberBonusPush cuMemberBonusPush) {
// 奖金扣项
BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusPush, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate());
recommendRemark(saOrderExt, cuMemberBonusPush, cuMemberSettleExtMap);
if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusPush.getIncomeStatus()) {
@ -373,15 +392,13 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
/**
* 计算拓展收益
*
* @param settleTableName 结算表
* @param period 期间
* @param bonusConfigDTO 参数
* @param firPurchaseOrderList 首单
* @param cuMemberBonusMap 所有计算出来的奖金汇总
* @Description: 计算拓展收益
* @return: void
* @Author: sui q
* @Date: 2022/11/10 14:17
*/
List<CuMemberBonusExpand> calculateExpandBonus(Map<Long, CuMemberSettleExt> cuMemberSettleExtMap, String settleDate, String settleTableName, BonusConfigDTO bonusConfigDTO,
Map<String, String> systemConfigMap, List<SaOrderExt> firPurchaseOrderList,
@ -880,6 +897,8 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
*/
List<CuMemberBonusDetail> calculateShareBonus(String settleDateStr, BonusConfigDTO bonusConfigDTO, Integer period,
Map<Long, CuMemberBonus> cuMemberBonusMap, Map<Long, CuAwardsControl> cuAwardsControlMap) {
List<CuMemberBonusDetail> cuMemberBonusDetailList = new ArrayList<>();
Date settleDate = DateUtils.parseStringToDate(settleDateStr);
String currentFirstDate = DateUtils.currentMonthFirstDateStr(settleDate);
String beforeMonthLastDate = DateUtils.beforeDateStr(1, ChronoUnit.DAYS, DateUtils.YYYY_MM_DD, currentFirstDate);
@ -896,9 +915,8 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
// 获取结算日期的第一天的日期
// 查询复购考核结果
List<CuMemberSettleExt> cuMemberSettleExtList = cuMemberTreeService.queryMemberSettleByAwards(settleTableName, rangeTableName, beforeMonthFirstPeriod, beforeMonthLastPeriod);
if (CollectionUtil.isNotEmpty(cuMemberSettleExtList)) {
Map<Long, CuMemberAssess> cuMemberAssessMap = cuMemberAssessService.queryCuMemberAssessByMember(assessTableName, assessPeriod, EAssessmentType.REPURCHASE_ASSESS.getValue(), cuMemberSettleExtList);
List<CuMemberBonusDetail> cuMemberBonusDetailList = new ArrayList<>();
for (CuMemberSettleExt targetMemberSettleExt : cuMemberSettleExtList) {
SaOrder saOrder = SaOrder.builder().pkId(0L).orderAchieve(BigDecimal.ZERO).build();
saOrder.setPkCountry(targetMemberSettleExt.getPkSettleCountry());
@ -930,6 +948,7 @@ public class BonusSettleFirstPurchaseHandle extends BonusSettleHandle {
}
cuMemberBonusDetailList.add(cuMemberBonusDetail);
}
}
return cuMemberBonusDetailList;
}

View File

@ -979,12 +979,10 @@ public abstract class BonusSettleHandle {
}
/**
* @Description: 首购计算 扣项小计总计
* @return: void
* @Author: sui q
* @Date: 2023/1/11 13:59
* 首购计算 扣项小计总计
*/
protected void setFirstPurchaseTotal(BdBonusDeduct bdBonusDeduct, CuMemberBonus cuMemberBonus, Object bonusDetail) {
// 处理扣项
setBonusDeduct(bdBonusDeduct, cuMemberBonus, bonusDetail);
BigDecimal realIncome = ReflectUtils.invokeGetter(bonusDetail, BonusFieldConstants.REAL_INCOME);
cuMemberBonus.setPurRealSubtotal(ComputeUtil.computeAdd(cuMemberBonus.getPurRealSubtotal(), realIncome));
@ -992,10 +990,7 @@ public abstract class BonusSettleHandle {
}
/**
* @Description: 复购计算 扣项小计总计
* @return: void
* @Author: sui q
* @Date: 2023/1/11 13:59
* 复购计算 扣项小计总计
*/
protected void setPurchaseTotal(BdBonusDeduct bdBonusDeduct, CuMemberBonus cuMemberBonus, Object bonusDetail) {
// 处理扣项
@ -1019,20 +1014,7 @@ public abstract class BonusSettleHandle {
}
/**
* @Description: 云代计算 扣项小计总计
* @return: void
* @Author: sui q
* @Date: 2023/1/11 13:59
*/
protected void setMakerTotal(BdBonusDeduct bdBonusDeduct, CuMemberBonus cuMemberBonus, Object bonusDetail) {
setBonusDeduct(bdBonusDeduct, cuMemberBonus, bonusDetail);
BigDecimal realIncome = ReflectUtils.invokeGetter(bonusDetail, BonusFieldConstants.REAL_INCOME);
cuMemberBonus.setMakerRealSubtotal(ComputeUtil.computeAdd(cuMemberBonus.getMakerRealSubtotal(), realIncome));
cuMemberBonus.setRealIncomeTotal(ComputeUtil.computeAdd(cuMemberBonus.getRealIncomeTotal(), realIncome));
}
/**
* @Description: 云代计算 扣项小计总计
* @Description: 复购券 扣项小计总计
* @return: void
* @Author: sui q
* @Date: 2023/1/11 13:59

View File

@ -436,8 +436,8 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
Map<Long, CuMemberSettleExt> cuMemberSettleExtMap = new HashMap<>();
BonusRecordDetailVO recordDetailVO = new BonusRecordDetailVO();
// 计算奖金
// 乐学易考奖金计算回写代金券数量
// 计算奖金主入口
LeXueRangeParam leXueRangeParam = calculateBonusBySaOrderList(settleDate, period, currentSettleTableName,
firPurchaseOrderList, repurchaseOrderList, mallOrderList,
awardsMap, bonusConfigDTO, cuMemberBonusMap,
@ -764,11 +764,12 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
List<CuBonusExpandExt> cuBonusExpandExtList = bonusExpandService.queryBonusExpand(bonusExpandParam);
cuBonusExpandExtList.forEach(cuBonusExpandExt -> cuBonusExpandExtMap.put(cuBonusExpandExt.getPkMember(), cuBonusExpandExt));
// 先计算复购在计算首购
// 计算复购
if (repurchaseOrderList.size() > 0) {
leXueRangeParam = calculatePurchaseOrder(riskControlMap, cuMemberSettleExtMap, currentSettleTableName, settleDate, rangeDtoMap, awardsMap, bonusConfigDTO,
systemConfigMap, repurchaseOrderList, period, weekMemberBonusMap, cuMemberBonusMap, recordDetailVO, cuAwardsControlMap, cuBonusExpandExtMap);
}
// 查询
// 计算首购
if (firPurchaseOrderList.size() > 0) {
calculateFirPurchaseOrder(riskControlMap, cuMemberSettleExtMap, currentSettleTableName, settleDate, systemConfigMap, bonusConfigDTO,
firPurchaseOrderList, period, weekMemberBonusMap, cuMemberBonusMap, recordDetailVO, awardsMap, cuAwardsControlMap, cuBonusExpandExtMap);
@ -915,14 +916,12 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
}
/**
* 计算首购订单的奖金
*
* @param settleTableName 结算日表
* @param settleDate 结算日期
* @param bonusConfigDTO 各个国家奖金参数
* @param firPurchaseOrderList 首购订单
* @Desccription: 计算首购订单的奖金
* @return: Map<Long, CuMemberSettleExt> 需要更新的
* @Author: sui q
* @Date: 2022/11/10 17:40
*/
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,
@ -932,7 +931,7 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
// 获得升级方式是纳入三单循环还是固定值
// 获取有订单国家的系统参数获得三单循环还是四单循环 key 国家+系统参数key
// 需要更新的会员结算表 cuMemberSettleExtMap
//***************************计算推荐奖******************************/
//***************************计算推荐奖(直推级差、直推三单循环)******************************/
List<CuMemberBonusPush> cuMemberBonusPushList = bonusSettleFirstPurchaseHandle.calculateRecommendBonus(cuMemberSettleExtMap, settleTableName, bonusConfigDTO, systemConfigMap, firPurchaseOrderList, period, cuMemberBonusMap, awardsMap);
bonusRecordDetailVO.setCuMemberBonusPushList(cuMemberBonusPushList);
//****************************计算量奖*****************************/

View File

@ -1,5 +1,6 @@
package com.hzs.bonus.detail.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzs.bonus.achieve.service.ICuMemberSettlePeriodService;
import com.hzs.bonus.achieve.service.ICuMemberTreeService;
@ -141,6 +142,9 @@ public class CuMemberAssessServiceImpl extends ServiceImpl<CuMemberAssessMapper,
@Override
public Map<Long, CuMemberAssess> queryCuMemberAssessByMember(String assessTableName, Integer period, Integer assessType, List<CuMemberSettleExt> cuMemberSettleExtList) {
if (CollectionUtil.isEmpty(cuMemberSettleExtList)) {
return new HashMap<>();
}
List<CuMemberAssess> cuMemberAssessList = new ArrayList<>();
List<List<?>> listList = cuMemberBonusSettle.handleCutList(cuMemberSettleExtList);
listList.forEach(list ->

View File

@ -241,7 +241,9 @@
<sql id="CuMemberTableTrig">
CREATE
OR REPLACE TRIGGER
${tableName}_TRIG
${tableName}
_
TRIG
BEFORE
INSERT
OR
@ -415,19 +417,57 @@
</update>
<update id="createCuMemberTreeParentIndex">
create index ${tableName}_parent on ${tableName} ( pk_parent )
create
index
${tableName}
_
parent
on
${tableName}
(
pk_parent
)
</update>
<update id="createCuMemberTreePlaceIndex">
create index ${tableName}_place on ${tableName} ( pk_place_parent, place_dept )
create
index
${tableName}
_
place
on
${tableName}
(
pk_place_parent,
place_dept
)
</update>
<update id="createCuMemberTableUniqueIndex">
create unique index ${tableName}_PK_M on ${tableName} ( PK_MEMBER, period )
create
unique index
${tableName}
_
PK_M
on
${tableName}
(
PK_MEMBER,
period
)
</update>
<update id="createCuMemberTreeDayOnlyIndex">
create unique index ${tableName}_PK_M on ${tableName} ( PK_MEMBER )
create
unique index
${tableName}
_
PK_M
on
${tableName}
(
PK_MEMBER
)
</update>
<update id="updateCuMemberTreeByCancelOrder">
@ -1271,12 +1311,26 @@
<select id="queryMemberSettleBySaOrder" resultMap="CuMemberSettleExt">
select
pk_member,member_code,member_name,c.pk_awards,c.pk_grade,account_status,category,income_status,pk_settle_country,
is_maker_space,purchase_status,share_status,bg.grade_value,pk_parent,is_maker_space,
a_balance,b_balance,r_a_balance,r_b_balance,rep_a_balance,rep_b_balance,r_rep_a_balance,r_rep_b_balance,
register_amount,register_pv,upgrade_amount,upgrade_pv,repurchase_amount,pk_center_code,c.pk_vertex,
repurchase_pv,hi_fun_amount,hi_fun_pv,mall_amount,mall_pv,min_achieve,round,second,c.register_authority,store_level,
c.is_maker_gift,c.expire_status from ${settleTableName} c
pk_member,member_code,member_name,
c.pk_awards,c.pk_grade,
account_status,category,income_status,
pk_settle_country, is_maker_space,
purchase_status, share_status,
bg.grade_value,pk_parent,
a_balance,b_balance,
r_a_balance,r_b_balance,
rep_a_balance,rep_b_balance,
r_rep_a_balance,r_rep_b_balance,
register_amount,register_pv,
upgrade_amount,upgrade_pv,
repurchase_amount,repurchase_pv,
pk_center_code,c.pk_vertex,
hi_fun_amount,hi_fun_pv,
mall_amount,mall_pv,
min_achieve,
round,second,store_level,
c.register_authority, c.is_maker_gift,c.expire_status
from ${settleTableName} c
left join bd_grade bg
on c.pk_grade = bg.pk_id
where pk_member in

View File

@ -179,7 +179,7 @@ public class CuMemberBonus extends BaseEntity {
private BigDecimal repurCouponSubtotal;
/**
* 环球积分 修改为乐直推奖金
* 环球积分 修改为乐直推奖金
*/
@TableField("GLOBAL_POINTS")
private BigDecimal globalPoints;

View File

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