## 优化查询血缘上子节点数据;

This commit is contained in:
cabbage 2025-10-24 15:01:38 +08:00
parent 1d1cc62aee
commit c9be19d22e
3 changed files with 106 additions and 36 deletions

View File

@ -6,6 +6,7 @@ import com.hzs.common.core.enums.EBonusStageStatus;
import com.hzs.common.domain.member.achieve.CuMemberRetailDetail;
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -18,13 +19,13 @@ public interface ICuMemberRetailDetailService extends IService<CuMemberRetailDet
* 根据结算会员获取对应的点位数据
*/
void listMemberRetailDetail(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
EBonusStage eBonusStage, EBonusStageStatus eBonusStageStatus, List<Long> stageMemberList);
EBonusStage eBonusStage, EBonusStageStatus eBonusStageStatus, Collection<Long> stageMemberList);
/**
* 指定会员获取对应的点位数据
*/
void listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
List<Long> queryMemberList, EBonusStage eBonusStage);
List<CuMemberRetailDetail> listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
List<Long> queryMemberList, EBonusStage eBonusStage);
/**
* 会员直推对应的点位数据

View File

@ -30,7 +30,7 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
@Override
public void listMemberRetailDetail(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
EBonusStage eBonusStage, EBonusStageStatus eBonusStageStatus, List<Long> stageMemberList) {
EBonusStage eBonusStage, EBonusStageStatus eBonusStageStatus, Collection<Long> stageMemberList) {
List<List<?>> pkMemberList;
if (CollectionUtil.isNotEmpty(stageMemberList)) {
pkMemberList = cuMemberBonusSettle.handleCutList(stageMemberList, MagicNumberConstants.BATCH_QUERY_NUM);
@ -45,11 +45,12 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
}
@Override
public void listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
List<Long> queryMemberList, EBonusStage eBonusStage) {
public List<CuMemberRetailDetail> listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
List<Long> queryMemberList, EBonusStage eBonusStage) {
// 查询明细数据指定阶段未完成的
List<CuMemberRetailDetail> tmpDetailList = baseMapper.listMemberRetailDetail(retailDetailTableName, queryMemberList, eBonusStage.getValue(), EBonusStageStatus.NO.getValue());
packageThreeDetailMap(memberRangeExtMap, eBonusStage, tmpDetailList);
return tmpDetailList;
}
/**
@ -60,24 +61,26 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
// 明细数据放到对应的会员数据中
for (CuMemberRetailDetail cuMemberRetailDetail : tmpDetailList) {
CuMemberRetailRangeExt cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailDetail.getPkMember());
// 阶段一点位列表使用有序map为了后续业务处理方便
if (null == cuMemberRetailRangeExt.getOneDetailMap()) {
cuMemberRetailRangeExt.setOneDetailMap(new LinkedHashMap<>());
}
if (null == cuMemberRetailRangeExt.getTwoDetailMap()) {
cuMemberRetailRangeExt.setTwoDetailMap(new LinkedHashMap<>());
}
if (null == cuMemberRetailRangeExt.getThreeDetailMap()) {
cuMemberRetailRangeExt.setThreeDetailMap(new LinkedHashMap<>());
}
// 使用有序map为了后续业务处理方便
if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) {
// 阶段一点位列表使用有序map为了后续业务处理方便
if (null == cuMemberRetailRangeExt.getOneDetailMap()) {
// 使用有序map为了后续业务处理方便
cuMemberRetailRangeExt.setOneDetailMap(new LinkedHashMap<>());
}
// 阶段一点位列表
cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
} else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) {
if (null == cuMemberRetailRangeExt.getTwoDetailMap()) {
// 使用有序map为了后续业务处理方便
cuMemberRetailRangeExt.setTwoDetailMap(new LinkedHashMap<>());
}
// 阶段二点位列表
cuMemberRetailRangeExt.getTwoDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
} else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) {
if (null == cuMemberRetailRangeExt.getThreeDetailMap()) {
// 使用有序map为了后续业务处理方便
cuMemberRetailRangeExt.setThreeDetailMap(new LinkedHashMap<>());
}
// 阶段三点位列表
cuMemberRetailRangeExt.getThreeDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
}

View File

@ -339,8 +339,17 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
memberRangeExtMap.put(cuMemberRetailRangeExt.getPkMember(), cuMemberRetailRangeExt);
}
}
// 只有五折专区需要处理阶段收益
Set<Long> findMemberDetailSet = orderList.stream().filter(tmpOrder ->
EOrderType.RETAIL_REGISTER.getValue() == tmpOrder.getOrderType()
|| EOrderType.RETAIL_UPGRADE.getValue() == tmpOrder.getOrderType()
|| EOrderType.RETAIL_REPURCHASE.getValue() == tmpOrder.getOrderType())
.map(SaOrderExt::getPkMember).collect(Collectors.toSet());
// 订单产生的阶段正常情况下只上填三层这个位置只按每个订单推荐顺序取三级不需要查全部
List<Long> findMemberDetailList = this.findParent(memberRangeExtMap, findMemberDetailSet);
// 查询血缘会员明细数据一阶段
iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.ONE, EBonusStageStatus.NO, null);
iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.ONE, EBonusStageStatus.NO, findMemberDetailList);
for (SaOrderExt saOrderExt : orderList) {
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(saOrderExt.getPkMember());
@ -403,7 +412,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 处理升二阶段点位
if (CollectionUtil.isNotEmpty(stageList)) {
List<Long> stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toList());
Set<Long> stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toSet());
// 查询升阶段点位血缘上所有会员ID
List<Long> findMemberList = this.findParent(memberRangeExtMap, stageMemberList);
// 查询血缘会员明细数据二阶段
@ -415,7 +424,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 处理升三阶段点位
if (CollectionUtil.isNotEmpty(stageList)) {
List<Long> stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toList());
Set<Long> stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toSet());
// 查询升阶段点位血缘上所有会员ID
List<Long> findMemberList = this.findParent(memberRangeExtMap, stageMemberList);
// 查询血缘会员明细数据三阶段
@ -441,6 +450,31 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
}
}
/**
* 处理查询阶段会员订单会员往上推荐查3级降低初始查询数据过多问题
*/
private Set<Long> handleStageMember(List<SaOrderExt> orderList, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap) {
Set<Long> findMemberList = new HashSet<>();
for (SaOrderExt saOrderExt : orderList) {
if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) {
long pkParent = saOrderExt.getPkReference();
// 非五折专区需要处理阶段收益逻辑查找上级推荐人
for (int i = 0; i < 3; i++) {
CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent);
if (null == targetMember) {
break;
}
pkParent = targetMember.getPkParent();
findMemberList.add(targetMember.getPkMember());
}
}
}
return findMemberList;
}
/**
* 计算奖衔 -- 日结秒结
*/
@ -886,27 +920,27 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
continue;
}
// 推荐人一阶段子点位列表
// 直推会员一阶段子点位列表
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = targetMember.getOneDetailMap();
if (CollectionUtil.isEmpty(parentDetailList)) {
continue;
}
// 推荐人第一层点位处理
// 直推会员第一层点位处理
giftBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
if (giftBool) {
// 在第一层找到并填充点位就开始下一个点位的处理
break;
}
// 推荐人第二层点位处理
// 直推会员第二层点位处理
giftBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
if (giftBool) {
// 在第二层找到并填充点位就开始下一个点位的处理
break;
}
// 推荐人第三层点位处理
// 直推会员第三层点位处理
giftBool = iCuMemberBonusStageService.thirdLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
if (giftBool) {
@ -945,10 +979,34 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 推荐人一阶段子点位列表
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = null;
if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) {
if (null == targetMember.getOneDetailMap()) {
// 目标会员当前阶段为空则需要查询一下当前阶段未完成点位数据
List<CuMemberRetailDetail> tmpDetailList = iCuMemberRetailDetailService.listMemberRetailDetailByQuery(
rangeDetailTableName, memberRangeExtMap, Collections.singletonList(targetMember.getPkMember()), EBonusStage.ONE);
if (CollectionUtil.isEmpty(tmpDetailList)) {
targetMember.setOneDetailMap(new LinkedHashMap<>());
}
}
parentDetailList = targetMember.getOneDetailMap();
} else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) {
if (null == targetMember.getTwoDetailMap()) {
// 目标会员当前阶段为空则需要查询一下当前阶段未完成点位数据
List<CuMemberRetailDetail> tmpDetailList = iCuMemberRetailDetailService.listMemberRetailDetailByQuery(
rangeDetailTableName, memberRangeExtMap, Collections.singletonList(targetMember.getPkMember()), EBonusStage.TWO);
if (CollectionUtil.isEmpty(tmpDetailList)) {
targetMember.setTwoDetailMap(new LinkedHashMap<>());
}
}
parentDetailList = targetMember.getTwoDetailMap();
} else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) {
if (null == targetMember.getThreeDetailMap()) {
// 目标会员当前阶段为空则需要查询一下当前阶段未完成点位数据
List<CuMemberRetailDetail> tmpDetailList = iCuMemberRetailDetailService.listMemberRetailDetailByQuery(
rangeDetailTableName, memberRangeExtMap, Collections.singletonList(targetMember.getPkMember()), EBonusStage.THREE);
if (CollectionUtil.isEmpty(tmpDetailList)) {
targetMember.setThreeDetailMap(new LinkedHashMap<>());
}
}
parentDetailList = targetMember.getThreeDetailMap();
}
if (CollectionUtil.isEmpty(parentDetailList)) {
@ -1035,22 +1093,30 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
}
/**
* 查找血缘上所有会员
* 查找血缘上会员3层
*/
private List<Long> findParent(Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, List<Long> pkMemberList) {
private List<Long> findParent(Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, Set<Long> pkMemberList) {
List<Long> resultList = new ArrayList<>();
for (Long pkMember : pkMemberList) {
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(pkMember);
resultList.add(sourceMember.getPkMember());
if (CollectionUtil.isNotEmpty(pkMemberList)) {
for (Long pkMember : pkMemberList) {
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(pkMember);
resultList.add(sourceMember.getPkMember());
Long pkParent = sourceMember.getPkParent();
while (true) {
CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent);
if (null == targetMember) {
break;
int i = 1;
Long pkParent = sourceMember.getPkParent();
while (true) {
if (i > 3) {
break;
}
CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent);
if (null == targetMember) {
break;
}
pkParent = targetMember.getPkParent();
resultList.add(targetMember.getPkMember());
i += 1;
}
resultList.add(targetMember.getPkMember());
pkParent = targetMember.getPkParent();
}
}
return resultList;