## 2025.06.25需求,因V1-V3注册、升级多送两级,非手动V3V4可以再购买升V5;

This commit is contained in:
cabbage 2025-06-25 10:23:35 +08:00
parent bac4911559
commit 4d352ea2bf
2 changed files with 16 additions and 158 deletions

View File

@ -693,27 +693,4 @@ public interface ISaOrderService extends IService<SaOrder> {
List<BdGrade> gradeList, CuMember updateGradeMember,
Integer systemType, Integer isPay);
/**
* 根据盒数计算等级
*
* @param boxTotal 总盒数
* @param gradeList 等级列表可为空
* @param memberGrade 当前等级 -- 为空则为注册不为空则为升级
* @param checkUpgrade 校验升级
* @return
*/
BdGrade getGradeByBox(final Integer boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade);
/**
* 处理升级盒数基数
*
* @param cuMember 会员信息
* @param memberGrade 会员等级信息
* @param gradeList 等级列表
* @param boxProductList 盒数商品商品
* @param systemType 所属系统
* @return
*/
int handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxProductList, Integer systemType);
}

View File

@ -50,7 +50,6 @@ import com.hzs.member.account.dto.BusinessCommissionDTO;
import com.hzs.member.account.dto.CuMemberBankParam;
import com.hzs.member.account.dto.MemberAmountDTO;
import com.hzs.member.achieve.IMemberAchieveServiceApi;
import com.hzs.member.base.IMemberLevelServiceApi;
import com.hzs.member.base.IMemberServiceApi;
import com.hzs.member.detail.ICuMemberDetailServiceApi;
import com.hzs.member.detail.ICuMemberServiceLogServiceApi;
@ -136,8 +135,6 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
IScmBillServiceApi scmBillServiceApi;
@DubboReference
IGradeServiceApi iGradeServiceApi;
@DubboReference
IMemberLevelServiceApi iMemberLevelServiceApi;
@Autowired
private IBdWaresService waresService;
@ -2640,8 +2637,12 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
// 当前会员等级
BdGrade memberGrade = gradeList.stream().filter(tmpGrade -> tmpGrade.getPkId().equals(updateGradeMember.getPkSettleGrade())).findFirst().get();
if (memberGrade.getGradeValue().compareTo(EGrade.MAKER.getValue()) >= 0) {
// 会员等级大于等于V3卓越不能通过升级进行购买了
// if (memberGrade.getGradeValue().compareTo(EGrade.MAKER.getValue()) >= 0) {
// // 会员等级大于等于V3卓越不能通过升级进行购买了
// throw new ServiceException("当前已经是可以购买的最高等级");
// }
if (memberGrade.getGradeValue().compareTo(EGrade.S_VIP.getValue()) >= 0) {
// new 2025.06.25 V1-V3升级多送两级后续还需要继续购买升级此处调整逻辑会员等级大于等于V5合伙人不能通过升级进行购买了
throw new ServiceException("当前已经是可以购买的最高等级");
}
@ -2657,6 +2658,7 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
}
// TODO 2025.06.14 添加新需求V1-V3购买多给两级
// new 2025.06.25 V1-V3升级多送两级
if (null != isPay && EYesNo.YES.getIntValue() == isPay) {
// 支付时才进行处理
if (null != bdGrade) {
@ -2686,8 +2688,7 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
* @param checkUpgrade 校验升级
* @return
*/
@Override
public BdGrade getGradeByBox(final Integer boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade) {
private BdGrade getGradeByBox(final Integer boxTotal, List<BdGrade> gradeList, BdGrade memberGrade, boolean checkUpgrade) {
if (CollectionUtil.isEmpty(gradeList)) {
gradeList = iGradeServiceApi.getRetailGradeList().getData();
}
@ -2715,7 +2716,9 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
// }
// 查询等级比现在当前等级大的然后倒序排序再查询 购买盒数 <= 等级盒数 的第一个等级就是当前升级的等级
Optional<BdGrade> gradeOptional = gradeList.stream().filter(tmpGrade -> tmpGrade.getGradeValue() > memberGrade.getGradeValue())
Optional<BdGrade> gradeOptional = gradeList.stream()
// new 2025.06.25 V1-V3升级多送两级需要支持送完还能买此处暂时注释掉
// .filter(tmpGrade -> tmpGrade.getGradeValue() > memberGrade.getGradeValue())
.sorted(Comparator.comparingInt(BdGrade::getGradeValue).reversed())
.filter(tmpGrade -> tmpGrade.getBoxNumber() != 0)
.filter(tmpGrade -> tmpGrade.getBoxNumber() <= boxTotal).findFirst();
@ -2734,9 +2737,7 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
* @param systemType 所属系统
* @return
*/
@Override
public int handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade,
List<BdGrade> gradeList, List<String> boxProductList,
private int handleBaseBoxNum(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxProductList,
Integer systemType) {
// 升级盒数基数
int baseBoxNum = 0;
@ -2748,6 +2749,10 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
// 最新一次的手动升级
CuMemberLevel lastMemberLevel = lastManualOptional.get();
BdGrade lastUpdateGrade = gradeList.stream().filter(tmpGrade -> tmpGrade.getPkId().equals(lastMemberLevel.getNewLevel())).findFirst().get();
if (lastUpdateGrade.getGradeValue() >= EGrade.MAKER.getValue()) {
// new 2025.06.25 V1-V3升级多送两级但手动开到V3及以上则不能继续购买升级
throw new ServiceException("当前已经是可以购买的最高等级");
}
// 盒数基数 = 手动升级盒数 + 手动升级之后的升级订单盒数
baseBoxNum = lastUpdateGrade.getBoxNumber()
+ saOrderItemsService.getRetailWaresQuantityNew(cuMember.getPkId(), boxProductList, lastMemberLevel.getUpgradeTime(), Collections.singletonList(EOrderType.RETAIL_UPGRADE.getValue()), systemType);
@ -2825,130 +2830,6 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
// return 0;
}
/**
* 旧等级计算处理累计升级
*
* @param cuMember 会员信息
* @param memberGrade 会员等级
* @param gradeList 等级列表
* @param boxProductList 盒数商品列表
* @return
*/
private BdGrade handleOldGrade(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, List<String> boxProductList) {
if (memberGrade.getGradeValue().compareTo(EGrade.MAKER.getValue()) > 0) {
// 当前等级大于V3不需要重算
return memberGrade;
}
// 查询是否有升级记录
List<CuMemberLevel> memberLevelList = iCuMemberDetailServiceApi.getUpgradeList(cuMember.getPkId()).getData();
if (CollectionUtil.isNotEmpty(memberLevelList)) {
// 有升级记录
int baseBoxNum;
// 最新一次的手动升级记录
Optional<CuMemberLevel> lastManualOptional = memberLevelList.stream().filter(tmpGrade -> tmpGrade.getUpType().equals(EUpgradeType.MANUAL_UPGRADE.getValue())).findFirst();
if (lastManualOptional.isPresent()) {
// 有手动升级记录
CuMemberLevel lastManual = lastManualOptional.get();
// 手动升级等级
BdGrade lastUpdateGrade = gradeList.stream().filter(tmpGrade -> tmpGrade.getPkId().equals(lastManual.getNewLevel())).findFirst().get();
// 升级之后购买的订单盒数
int newBoxNumber = saOrderItemsService.getRetailWaresQuantity(cuMember.getPkId(), boxProductList, lastManual.getUpgradeTime(),
Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue()), cuMember.getSystemType());
// 基数盒数 = 手动升级的等级盒数 + 手动升级之后购买的盒数
baseBoxNum = lastUpdateGrade.getBoxNumber() + newBoxNumber;
} else {
// 没有手动升级记录
// 基数盒数 = 购买的盒数
baseBoxNum = saOrderItemsService.getRetailWaresQuantity(cuMember.getPkId(), boxProductList, null,
Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue()), cuMember.getSystemType());
}
// 计算的等级
return this.getGradeByBox(baseBoxNum, gradeList, memberGrade, false);
}
return memberGrade;
}
/**
* 新等级计算处理当天累计升级次日一次性
*
* @param cuMember 会员信息
* @param memberGrade 会员等级
* @param gradeList 等级列表
* @param saOrderExt 订单信息
* @param createLevelList 添加等级列表
* @param deleteLevelList 删除等级列表
* @return
*/
private BdGrade handleNewGrade(CuMember cuMember, BdGrade memberGrade, List<BdGrade> gradeList, SaOrderExt saOrderExt,
List<CuMemberLevel> createLevelList, List<CuMemberLevel> deleteLevelList) {
// 会员升级记录
List<CuMemberLevel> memberLevelList = iMemberLevelServiceApi.listMemberLevel(cuMember.getPkId(), null).getData();
if (CollectionUtil.isNotEmpty(memberLevelList)) {
// 存在升级记录
// 2025.03.18 调整需求升级走当天累计当天买的所有都进行积累24点之后则重新累积手动升级前后的盒数都算累计
// 查询开始时间
Date queryStartTime = DateUtils.getStartTime(saOrderExt.getPayTime());
// 查询结束时间
Date queryEndTime = DateUtils.getEndTime(queryStartTime);
// 订单购买当天所有升级记录
List<CuMemberLevel> todayLevelList = memberLevelList.stream()
.filter(tmp -> (tmp.getUpgradeTime().compareTo(queryStartTime) >= 0 && tmp.getUpgradeTime().compareTo(queryEndTime) <= 0))
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(todayLevelList)) {
if (todayLevelList.stream().noneMatch(tmp -> tmp.getUpgradeTime().compareTo(saOrderExt.getPayTime()) >= 0)) {
// 订单购买时间之后没有升级记录直接返回当前会员等级
return memberGrade;
} else {
// 订单购买时间之后有升级记录需要重新计算
// 处理当日等级
Integer oldLevel = todayLevelList.get(0).getOldLevel();
Integer lastLevel = todayLevelList.get(todayLevelList.size() - 1).getNewLevel();
// 手动升级记录
Integer manualUpgradeLevel = null;
// 当天最后一条手动升级记录
Optional<CuMemberLevel> manualUpgradeOptional = todayLevelList.stream()
.filter(tmp -> EUpgradeType.MANUAL_UPGRADE.getValue() == tmp.getUpType())
.max(Comparator.comparing(CuMemberLevel::getUpgradeTime));
if (manualUpgradeOptional.isPresent()) {
// 存在手动升级记录计算等级为手动升级盒数为基数 + 当天购买的订单盒数
// 删除升级记录时只删除非手动升级的
deleteLevelList.addAll(todayLevelList.stream()
.filter(tmp -> EUpgradeType.MANUAL_UPGRADE.getValue() != tmp.getUpType())
.collect(Collectors.toList()));
// 重算订单当天升级记录存在手动升级
manualUpgradeLevel = manualUpgradeOptional.get().getNewLevel();
} else {
// 不存在手动升级记录当天购买的订单盒数
deleteLevelList.addAll(todayLevelList);
}
// 今天重算等级
BdGrade todayGrade = this.handleTodayGrade(cuMember, oldLevel, lastLevel, manualUpgradeLevel,
queryStartTime, queryEndTime, gradeList, createLevelList);
if (lastLevel.equals(todayGrade.getPkId())) {
// 重算之后和重算之前等级一致直接返回当前会员等级
return todayGrade;
} else {
// 重算之后和重算之前等级不一致需要重算后面所有等级
return this.handleTodayNextNew(cuMember, todayGrade, DateUtils.addDays(queryStartTime, 1), DateUtils.addDays(queryEndTime, 1),
memberLevelList, gradeList, createLevelList, deleteLevelList);
}
}
} else {
// 当天没有升级记录直接返回当前会员等级
return memberGrade;
}
} else {
// 没有升级记录返回当前会员等级
return memberGrade;
}
}
/**
* 处理日升级新
*