Jelajahi Sumber

luma、nano、mj会员抵扣金额

zoujiajian 11 bulan lalu
induk
melakukan
9a8c1ff493

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -413,6 +413,11 @@ public interface Constant {
 
 	Long HBO_GO_GOODS_ID = 8L;
 
+	/**
+	 * midjourney
+	 */
+	Long MIDJOURNEY_GOODS_ID = 26l;
+
 	/**
 	 * 批发押金配置key
 	 */

+ 18 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java

@@ -536,7 +536,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 				//抵扣规格
 				deductSkuIds.add(vipSkuId);
 				//重置镜像user
-				resetMirrorUser(goodsId, vipSkuId, relationId, newRelationId, vipExpiryTime);
+				resetMirrorUser(goodsId, vipSkuId, relationId, newRelationId, vipExpiryTime, num);
 			}
 		}
 		for (VipGoodsSku sku : skus) {
@@ -733,7 +733,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 	/**
 	 * 重置镜像user
 	 */
-	private void resetMirrorUser(Long goodsId, Long skuId, Long oldRelationId, Long newRelationId, Date vipExpiryTime) {
+	private void resetMirrorUser(Long goodsId, Long skuId, Long oldRelationId, Long newRelationId, Date vipExpiryTime, Integer payNum) {
 		GoodsDonSku sku = skuMapper.selectById(skuId);
 		if (goodsId == Constant.MJ_GID) {
 			MidjourneyUser user = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class)
@@ -823,6 +823,22 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 				redisService.del(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId());
 			}
 		}
+
+		//nano 抵扣
+		if (goodsId == Constant.NANO_GOODS_ID) {
+			NanoUserQuota nanoUserQuota = nanoUserQuotaMapper.selectOne(Wrappers.lambdaQuery(NanoUserQuota.class)
+					.eq(NanoUserQuota::getRelationId, oldRelationId)
+					.last("limit 1"));
+			if (nanoUserQuota != null) {
+				//payNum 会员月数
+				nanoUserQuota.setTotalQuota(sku.getNanoQuota() * payNum);
+				nanoUserQuota.setRemainingQuota(nanoUserQuota.getTotalQuota());
+				nanoUserQuota.setUsedQuota(0);
+				nanoUserQuota.setPurchaseDate(DateTime.now());
+				nanoUserQuota.setRelationId(newRelationId);
+				nanoUserQuotaMapper.updateById(nanoUserQuota);
+			}
+		}
 	}
 
 	/**

+ 119 - 0
netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.vip.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -64,6 +65,14 @@ public class VipFrontServiceImpl implements VipFrontService {
 
 	private final ClaudeService claudeService;
 
+	private final LumaUserMapper lumaUserMapper;
+
+	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
+	private final NanoUserQuotaMapper nanoUserQuotaMapper;
+
+	private final MidjourneyUserMapper midjourneyUserMapper;
+
 	@Override
 	public void fillVipInfo(Long userId, VipUserPageResp vipUserPageResp) {
 		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.VIP_FEE_KEY).last("limit 1"));
@@ -190,6 +199,12 @@ public class VipFrontServiceImpl implements VipFrontService {
 					//获取抵扣金额
 					deductMoney = deductMoney.add(getFinalDeductMoney(relationId, relation.getSkuId(), claudeUser.getRenewSkuId(), claudeUser.getRenewOrderId(), claudeUser.getRenewExpiryTime(), relation.getStartTime(), relationExpiryTime, now, userIdList));
 				}
+			} else if (goodsId == Constant.LUMA_GOODS_ID || goodsId == Constant.NANO_GOODS_ID) {
+				//luma、nano
+				deductMoney = deductMoney.add(getGeneralRemainNumDeductMoney(relationId, goodsId, skuId, userIdList));
+			} else if (goodsId == Constant.MIDJOURNEY_GOODS_ID) {
+				//mj
+				deductMoney = deductMoney.add(getMjRemainNumDeductMoney(relationId, skuId, userIdList));
 			} else {
 				//该车票抵扣金额
 				deductMoney = deductMoney.add(getDeductMoneyFromTicket(relationId, userIdList, skuId, now, relation.getStartTime(), relationExpiryTime));
@@ -388,4 +403,108 @@ public class VipFrontServiceImpl implements VipFrontService {
 		}
 		return single;
 	}
+
+	/**
+	 * 获取普通剩余次数可抵扣金额
+	 */
+	private BigDecimal getGeneralRemainNumDeductMoney(Long relationId,Long goodsId,Long skuId,List<Long> userIdList) {
+		BigDecimal deductMoney = BigDecimal.ZERO;
+		BigDecimal orderTotalMoney = BigDecimal.ZERO;
+		//总次数
+		Integer totalNum = 0;
+
+		List<OrderDon> orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getRelationId, relationId).in(OrderDon::getUserId, userIdList).notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+		for (OrderDon orderDon : orderDonList) {
+			GoodsDonSku sku = skuMapper.selectById(skuId);
+			if (orderDon.getMoney().compareTo(BigDecimal.ZERO) >= 0) {
+				orderTotalMoney = orderTotalMoney.add(orderDon.getMoney());
+			} else {
+				//兑换码订单使用规格价格
+				orderTotalMoney = orderTotalMoney.add(sku.getPrice());
+			}
+			if (goodsId == Constant.LUMA_GOODS_ID) {
+				totalNum += sku.getLumaNum();
+			} else {
+				totalNum += sku.getNanoQuota();
+			}
+		}
+		//加量包订单
+		List<UpgradeOrderDon> upgradeOrderDons = upgradeOrderDonMapper.selectList(Wrappers.lambdaQuery(UpgradeOrderDon.class).eq(UpgradeOrderDon::getRelationId, relationId).in(UpgradeOrderDon::getUserId, userIdList).notIn(UpgradeOrderDon::getStatus, Constant.noOrderAllStatus));
+		for (UpgradeOrderDon upgradeOrderDon : upgradeOrderDons) {
+			orderTotalMoney = orderTotalMoney.add(upgradeOrderDon.getMoney());
+			totalNum = totalNum + upgradeOrderDon.getNum();
+		}
+		Integer remainNum = null;
+		if (goodsId == Constant.LUMA_GOODS_ID) {
+			LumaUser lumaUser = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class).eq(LumaUser::getRelationId, relationId).last("limit 1"));
+			if (lumaUser != null) {
+				remainNum = lumaUser.getNum();
+			}
+		}else {
+			NanoUserQuota nanoUserQuota = nanoUserQuotaMapper.selectOne(Wrappers.lambdaQuery(NanoUserQuota.class).eq(NanoUserQuota::getRelationId, relationId).last("limit 1"));
+			if (nanoUserQuota != null) {
+				remainNum = nanoUserQuota.getRemainingQuota();
+			}
+		}
+		//若未使用
+		if (remainNum == null) {
+			deductMoney = deductMoney.add(orderTotalMoney);
+		} else {
+			BigDecimal remainMoney = BigDecimal.valueOf(remainNum).divide(BigDecimal.valueOf(totalNum), 2, RoundingMode.UP).multiply(orderTotalMoney);
+			deductMoney = deductMoney.add(remainMoney);
+		}
+		return deductMoney;
+	}
+
+	/**
+	 * 获取mj剩余次数可抵扣金额
+	 */
+	private BigDecimal getMjRemainNumDeductMoney(Long relationId, Long skuId, List<Long> userIdList) {
+		BigDecimal deductMoney = BigDecimal.ZERO;
+		BigDecimal orderTotalMoney = BigDecimal.ZERO;
+		//总次数
+		Integer fastTotalNum = 0;
+		Integer relaxTotalNum = 0;
+
+		List<OrderDon> orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getRelationId, relationId).in(OrderDon::getUserId, userIdList).notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+		for (OrderDon orderDon : orderDonList) {
+			GoodsDonSku sku = skuMapper.selectById(skuId);
+			if (orderDon.getMoney().compareTo(BigDecimal.ZERO) >= 0) {
+				orderTotalMoney = orderTotalMoney.add(orderDon.getMoney());
+			} else {
+				//兑换码订单使用规格价格
+				orderTotalMoney = orderTotalMoney.add(sku.getPrice());
+			}
+			fastTotalNum += sku.getMjFastNum();
+			relaxTotalNum += sku.getMjRelaxNum();
+		}
+		Integer upgradeNum = 0;
+		BigDecimal upgradeOrderMoney = BigDecimal.ZERO;
+		//加量包订单
+		List<UpgradeOrderDon> upgradeOrderDons = upgradeOrderDonMapper.selectList(Wrappers.lambdaQuery(UpgradeOrderDon.class).eq(UpgradeOrderDon::getRelationId, relationId).in(UpgradeOrderDon::getUserId, userIdList).notIn(UpgradeOrderDon::getStatus, Constant.noOrderAllStatus));
+		for (UpgradeOrderDon upgradeOrderDon : upgradeOrderDons) {
+			upgradeNum += upgradeOrderDon.getNum();
+			upgradeOrderMoney = upgradeOrderMoney.add(upgradeOrderDon.getMoney());
+		}
+		MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, relationId).last("limit 1"));
+		if (midjourneyUser == null) {
+			deductMoney = deductMoney.add(orderTotalMoney).add(upgradeOrderMoney);
+		} else {
+			Integer remainFastNum = midjourneyUser.getMjFastNum();
+			Integer remainRelaxNum = midjourneyUser.getMjRelaxNum();
+			if (CollUtil.isNotEmpty(orderDonList)) {
+				BigDecimal fastMoney = BigDecimal.valueOf(remainFastNum).divide(BigDecimal.valueOf(fastTotalNum), 2, RoundingMode.UP).multiply(orderTotalMoney);
+				BigDecimal relaxMoney = BigDecimal.valueOf(remainRelaxNum).divide(BigDecimal.valueOf(relaxTotalNum), 2, RoundingMode.UP).multiply(orderTotalMoney);
+				deductMoney = deductMoney.add(fastMoney).add(relaxMoney);
+			}
+
+			//加量包
+			Integer remainUpgradeNum = midjourneyUser.getMjUpgradeNum();
+			if (CollUtil.isNotEmpty(upgradeOrderDons)) {
+				BigDecimal upgradeMoney = BigDecimal.valueOf(remainUpgradeNum).divide(BigDecimal.valueOf(upgradeNum), 2, RoundingMode.UP).multiply(upgradeOrderMoney);
+				deductMoney = deductMoney.add(upgradeMoney);
+			}
+		}
+		return deductMoney;
+	}
 }