소스 검색

普通推广首单额外返利

zoujiajian 2 년 전
부모
커밋
3adbdd46c1

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/DistributeExtraRebateConfigMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.DistributeExtraRebateConfig;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributeExtraRebateConfigMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/5/29 15:12
+ */
+public interface DistributeExtraRebateConfigMapper extends BaseMapper<DistributeExtraRebateConfig> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/DistributeExtraRebateConfig.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributeExtraRebateConfig
+ * 创建者: JavaZou
+ * 创建时间:2024/5/29 15:10
+ */
+@Getter
+@Setter
+public class DistributeExtraRebateConfig extends BaseEntity{
+	private BigDecimal multiple;
+
+	private BigDecimal rate;
+}

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/DistributeWaitingSendPoints.java

@@ -29,6 +29,16 @@ public class DistributeWaitingSendPoints extends BaseEntity{
 
 	private BigDecimal points;
 
+	/**
+	 * 额外返利积分(目前只针对普通推广)
+	 */
+	private BigDecimal extraRebate;
+
+	/**
+	 * 倍数
+	 */
+	private BigDecimal extraMultiple;
+
 	private BigDecimal refundPoints;
 
 	/**

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeOrdersView.java

@@ -47,6 +47,9 @@ public class DistributePopularizeOrdersView {
 	@DbField("dw.points")
 	private BigDecimal points;
 
+	@DbField("dw.extra_rebate")
+	private BigDecimal extraRebate;
+
 	@DbIgnore
 	private BigDecimal waitGetMoney;
 

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/DistributeExtraRebateService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.distribute;
+
+import com.cyksj.model.entity.DistributeExtraRebateConfig;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributeExtraRebateService
+ * 创建者: JavaZou
+ * 创建时间:2024/5/29 15:24
+ */
+public interface DistributeExtraRebateService {
+	DistributeExtraRebateConfig getRandomExtraRebate();
+}

+ 76 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeExtraRebateServiceImpl.java

@@ -0,0 +1,76 @@
+package com.cyksj.service.distribute.impl;
+
+import com.cyksj.mapper.manage.distribute.DistributeExtraRebateConfigMapper;
+import com.cyksj.model.entity.DistributeExtraRebateConfig;
+import com.cyksj.service.distribute.DistributeExtraRebateService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributeExtraRebateServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/5/29 15:24
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class DistributeExtraRebateServiceImpl implements DistributeExtraRebateService {
+	private final DistributeExtraRebateConfigMapper distributeExtraRebateConfigMapper;
+
+	private static BigDecimal sums =  new BigDecimal(0);
+
+	private static List<DistributeExtraRebateConfig> distributeExtraRebateConfigs = null;
+
+	@PostConstruct
+	public void initConfig() {
+		distributeExtraRebateConfigs = distributeExtraRebateConfigMapper.selectList(null);
+
+		distributeExtraRebateConfigs.forEach(e->{
+			sums = sums.add(e.getRate());
+		});
+	}
+
+	@Override
+	public DistributeExtraRebateConfig getRandomExtraRebate() {
+		if (distributeExtraRebateConfigs == null) {
+			return null;
+		}
+		int i = randomProbabilityIndex(distributeExtraRebateConfigs);
+		if (i == -1) {
+			log.info("普通分销 推广奖励倍数异常..");
+			return null;
+		}
+		return distributeExtraRebateConfigs.get(i);
+	}
+
+	public int randomProbabilityIndex(List<DistributeExtraRebateConfig> list) {
+		int random = -1;
+		//总权重
+		Double totalProbability = sums.doubleValue();
+		//产生随机数
+		Double randomNumber = ThreadLocalRandom.current().nextDouble();
+		//根据随机数在所有奖品分布的区域并确定所抽奖品
+		Double d1 = 0d;
+		Double d2 = 0d;
+		for (int i = 0; i < list.size(); i++) {
+			d2 += Double.parseDouble(String.valueOf(list.get(i).getRate())) / totalProbability;
+			if (i == 0) {
+				d1 = 0d;
+			} else {
+				d1 += Double.parseDouble(String.valueOf(list.get(i - 1).getRate())) / totalProbability;
+			}
+			if (randomNumber >= d1 && randomNumber < d2) {
+				random = i;
+				break;
+			}
+		}
+		return random;
+	}
+}

+ 6 - 12
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -1038,12 +1038,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
                     }
                     if (thisGoodsRate > 0) {
-                        BigDecimal needSubPoints = refundMoney.multiply(BigDecimal.valueOf(thisGoodsRate).divide(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(10));
-                        if (needSubPoints.compareTo(points) > 0) {
-                            //全扣除
-                            distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
-                            needSubPoints = points;
-                        }
+                        BigDecimal refundRate = refundMoney.divide(money, 2, RoundingMode.DOWN);
+                        //退掉比例的提成
+                        BigDecimal needSubPoints = points.multiply(refundRate);
                         distributeWaitingSendPoints.setRefundPoints(needSubPoints);
                         //剩余积分
                         BigDecimal remainPoints = points.subtract(needSubPoints);
@@ -1067,12 +1064,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
                     }
                     if (thisGoodsRate > 0) {
-                        BigDecimal needSubPoints = refundMoney.multiply(BigDecimal.valueOf(thisGoodsRate).divide(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(10));
-                        if (needSubPoints.compareTo(points) > 0) {
-                            //全扣除
-                            distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
-                            needSubPoints = points;
-                        }
+                        BigDecimal refundRate = refundMoney.divide(money, 2, RoundingMode.DOWN);
+                        //退掉比例的提成
+                        BigDecimal needSubPoints = points.multiply(refundRate);
                         userBenefitsService.deductDistributePoints(orderDon.getId(), distributeWaitingSendPoints.getSharedId(), needSubPoints);
                         //部分退款
                         distributeWaitingSendPoints.setRefundPoints(needSubPoints);

+ 18 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -70,6 +70,7 @@ import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.coupon.CouponFontService;
+import com.cyksj.service.distribute.DistributeExtraRebateService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.exchange.ExchangeCodeService;
@@ -302,6 +303,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final MidjourneyUserMapper midjourneyUserMapper;
 
+	private final DistributeExtraRebateService distributeExtraRebateService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1605,6 +1608,21 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.waiting);
 					distributeWaitingSendPoints.setSendTime(DateUtil.offsetDay(order.getPayTime(), 3));
 					distributeWaitingSendPoints.setRate(rate);
+					//普通分销 额外返利
+					if (userDistribute == null && points.compareTo(BigDecimal.ZERO) > 0) {
+						DistributeExtraRebateConfig distributeExtraRebateConfig = distributeExtraRebateService.getRandomExtraRebate();
+						if (distributeExtraRebateConfig != null) {
+							BigDecimal multiple = distributeExtraRebateConfig.getMultiple();
+							if (multiple.compareTo(BigDecimal.ONE) > 0) {
+								//最终奖励
+								BigDecimal finalPoints = points.multiply(multiple);
+								distributeWaitingSendPoints.setPoints(finalPoints);
+
+								distributeWaitingSendPoints.setExtraMultiple(multiple);
+								distributeWaitingSendPoints.setExtraRebate(finalPoints.subtract(points));
+							}
+						}
+					}
 					distributeWaitingSendPointsMapper.insert(distributeWaitingSendPoints);
 					//暂定虚物 商务可首单提成
 					if (businessId != null) {