## 优化查询血缘上子节点数据;
This commit is contained in:
parent
1d1cc62aee
commit
c9be19d22e
|
|
@ -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.CuMemberRetailDetail;
|
||||||
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt;
|
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
@ -18,13 +19,13 @@ public interface ICuMemberRetailDetailService extends IService<CuMemberRetailDet
|
||||||
* 根据结算会员获取对应的点位数据
|
* 根据结算会员获取对应的点位数据
|
||||||
*/
|
*/
|
||||||
void listMemberRetailDetail(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
|
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<CuMemberRetailDetail> listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
|
||||||
List<Long> queryMemberList, EBonusStage eBonusStage);
|
List<Long> queryMemberList, EBonusStage eBonusStage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员直推对应的点位数据
|
* 会员直推对应的点位数据
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void listMemberRetailDetail(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
|
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;
|
List<List<?>> pkMemberList;
|
||||||
if (CollectionUtil.isNotEmpty(stageMemberList)) {
|
if (CollectionUtil.isNotEmpty(stageMemberList)) {
|
||||||
pkMemberList = cuMemberBonusSettle.handleCutList(stageMemberList, MagicNumberConstants.BATCH_QUERY_NUM);
|
pkMemberList = cuMemberBonusSettle.handleCutList(stageMemberList, MagicNumberConstants.BATCH_QUERY_NUM);
|
||||||
|
|
@ -45,11 +45,12 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
|
public List<CuMemberRetailDetail> listMemberRetailDetailByQuery(String retailDetailTableName, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap,
|
||||||
List<Long> queryMemberList, EBonusStage eBonusStage) {
|
List<Long> queryMemberList, EBonusStage eBonusStage) {
|
||||||
// 查询明细数据(指定阶段,未完成的)
|
// 查询明细数据(指定阶段,未完成的)
|
||||||
List<CuMemberRetailDetail> tmpDetailList = baseMapper.listMemberRetailDetail(retailDetailTableName, queryMemberList, eBonusStage.getValue(), EBonusStageStatus.NO.getValue());
|
List<CuMemberRetailDetail> tmpDetailList = baseMapper.listMemberRetailDetail(retailDetailTableName, queryMemberList, eBonusStage.getValue(), EBonusStageStatus.NO.getValue());
|
||||||
packageThreeDetailMap(memberRangeExtMap, eBonusStage, tmpDetailList);
|
packageThreeDetailMap(memberRangeExtMap, eBonusStage, tmpDetailList);
|
||||||
|
return tmpDetailList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -60,24 +61,26 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl<CuMemberRetailD
|
||||||
// 明细数据放到对应的会员数据中
|
// 明细数据放到对应的会员数据中
|
||||||
for (CuMemberRetailDetail cuMemberRetailDetail : tmpDetailList) {
|
for (CuMemberRetailDetail cuMemberRetailDetail : tmpDetailList) {
|
||||||
CuMemberRetailRangeExt cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailDetail.getPkMember());
|
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()) {
|
if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) {
|
||||||
|
// 阶段一点位列表(使用有序map,为了后续业务处理方便)
|
||||||
|
if (null == cuMemberRetailRangeExt.getOneDetailMap()) {
|
||||||
|
// 使用有序map,为了后续业务处理方便
|
||||||
|
cuMemberRetailRangeExt.setOneDetailMap(new LinkedHashMap<>());
|
||||||
|
}
|
||||||
// 阶段一点位列表
|
// 阶段一点位列表
|
||||||
cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
||||||
} else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) {
|
} else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) {
|
||||||
|
if (null == cuMemberRetailRangeExt.getTwoDetailMap()) {
|
||||||
|
// 使用有序map,为了后续业务处理方便
|
||||||
|
cuMemberRetailRangeExt.setTwoDetailMap(new LinkedHashMap<>());
|
||||||
|
}
|
||||||
// 阶段二点位列表
|
// 阶段二点位列表
|
||||||
cuMemberRetailRangeExt.getTwoDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
cuMemberRetailRangeExt.getTwoDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
||||||
} else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) {
|
} else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) {
|
||||||
|
if (null == cuMemberRetailRangeExt.getThreeDetailMap()) {
|
||||||
|
// 使用有序map,为了后续业务处理方便
|
||||||
|
cuMemberRetailRangeExt.setThreeDetailMap(new LinkedHashMap<>());
|
||||||
|
}
|
||||||
// 阶段三点位列表
|
// 阶段三点位列表
|
||||||
cuMemberRetailRangeExt.getThreeDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
cuMemberRetailRangeExt.getThreeDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -339,8 +339,17 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
|
||||||
memberRangeExtMap.put(cuMemberRetailRangeExt.getPkMember(), cuMemberRetailRangeExt);
|
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) {
|
for (SaOrderExt saOrderExt : orderList) {
|
||||||
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(saOrderExt.getPkMember());
|
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(saOrderExt.getPkMember());
|
||||||
|
|
@ -403,7 +412,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
|
||||||
|
|
||||||
// 处理升二阶段点位
|
// 处理升二阶段点位
|
||||||
if (CollectionUtil.isNotEmpty(stageList)) {
|
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
|
// 查询升阶段点位血缘上所有会员ID
|
||||||
List<Long> findMemberList = this.findParent(memberRangeExtMap, stageMemberList);
|
List<Long> findMemberList = this.findParent(memberRangeExtMap, stageMemberList);
|
||||||
// 查询血缘会员明细数据(二阶段)
|
// 查询血缘会员明细数据(二阶段)
|
||||||
|
|
@ -415,7 +424,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
|
||||||
|
|
||||||
// 处理升三阶段点位
|
// 处理升三阶段点位
|
||||||
if (CollectionUtil.isNotEmpty(stageList)) {
|
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
|
// 查询升阶段点位血缘上所有会员ID
|
||||||
List<Long> findMemberList = this.findParent(memberRangeExtMap, stageMemberList);
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 推荐人一阶段子点位列表
|
// 直推会员一阶段子点位列表
|
||||||
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = targetMember.getOneDetailMap();
|
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = targetMember.getOneDetailMap();
|
||||||
if (CollectionUtil.isEmpty(parentDetailList)) {
|
if (CollectionUtil.isEmpty(parentDetailList)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 推荐人第一层点位处理
|
// 直推会员第一层点位处理
|
||||||
giftBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
giftBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
||||||
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
||||||
if (giftBool) {
|
if (giftBool) {
|
||||||
// 在第一层找到并填充点位,就开始下一个点位的处理
|
// 在第一层找到并填充点位,就开始下一个点位的处理
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// 推荐人第二层点位处理
|
// 直推会员第二层点位处理
|
||||||
giftBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
giftBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
||||||
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
||||||
if (giftBool) {
|
if (giftBool) {
|
||||||
// 在第二层找到并填充点位,就开始下一个点位的处理
|
// 在第二层找到并填充点位,就开始下一个点位的处理
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// 推荐人第三层点位处理
|
// 直推会员第三层点位处理
|
||||||
giftBool = iCuMemberBonusStageService.thirdLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
giftBool = iCuMemberBonusStageService.thirdLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName,
|
||||||
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList);
|
||||||
if (giftBool) {
|
if (giftBool) {
|
||||||
|
|
@ -945,10 +979,34 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
|
||||||
// 推荐人一阶段子点位列表
|
// 推荐人一阶段子点位列表
|
||||||
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = null;
|
LinkedHashMap<Integer, CuMemberRetailDetail> parentDetailList = null;
|
||||||
if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) {
|
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();
|
parentDetailList = targetMember.getOneDetailMap();
|
||||||
} else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) {
|
} 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();
|
parentDetailList = targetMember.getTwoDetailMap();
|
||||||
} else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) {
|
} 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();
|
parentDetailList = targetMember.getThreeDetailMap();
|
||||||
}
|
}
|
||||||
if (CollectionUtil.isEmpty(parentDetailList)) {
|
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<>();
|
List<Long> resultList = new ArrayList<>();
|
||||||
for (Long pkMember : pkMemberList) {
|
if (CollectionUtil.isNotEmpty(pkMemberList)) {
|
||||||
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(pkMember);
|
for (Long pkMember : pkMemberList) {
|
||||||
resultList.add(sourceMember.getPkMember());
|
CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(pkMember);
|
||||||
|
resultList.add(sourceMember.getPkMember());
|
||||||
|
|
||||||
Long pkParent = sourceMember.getPkParent();
|
int i = 1;
|
||||||
while (true) {
|
Long pkParent = sourceMember.getPkParent();
|
||||||
CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent);
|
while (true) {
|
||||||
if (null == targetMember) {
|
if (i > 3) {
|
||||||
break;
|
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;
|
return resultList;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue