浏览代码

fix 商务分销提成逻辑修改

zoujiajian 3 年之前
父节点
当前提交
c264922a8b

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserBusinessDefaultRateConfig;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessDefaultRateConfigMapper
+ *创建者: JavaZou
+ *创建时间:2023/3/28 15:44
+ */
+public interface UserBusinessDefaultRateConfigMapper extends BaseMapper<UserBusinessDefaultRateConfig> {
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserBusinessDefaultRateConfig.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessDefaultRateConfig
+ *创建者: JavaZou
+ *创建时间:2023/3/28 15:43
+ */
+@Getter
+@Setter
+public class UserBusinessDefaultRateConfig extends BaseEntity{
+	private Long goodsId;
+
+	/**
+	 * 标准配置分销者比例
+	 */
+	private Integer rate;
+
+	/**
+	 * 最高可配置分销者比例
+	 */
+	private Integer maxRate;
+
+	/**
+	 * 超过配置最高分销者比例是否平台承担
+	 */
+	private Boolean isPlatPay;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeBusinessOrderDonRecord.java

@@ -42,6 +42,11 @@ public class UserDistributeBusinessOrderDonRecord extends BaseEntity{
 	 */
 	private Integer orderType;
 
+	/**
+	 * 分销比例
+	 */
+	private Integer rate;
+
 	/**
 	 * 提成金额
 	 */

+ 29 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserBusinessDefaultRateConfigView.java

@@ -0,0 +1,29 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessDefaultRateConfigView
+ *创建者: JavaZou
+ *创建时间:2023/3/28 17:25
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_business_default_rate_config uc left join goods_don g on g.id = uc.goods_id")
+public class UserBusinessDefaultRateConfigView {
+	@DbField("uc.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String goodsTitle;
+
+	@DbField("uc.rate")
+	private Integer rate;
+
+	@DbField("uc.max_rate")
+	private Integer maxRate;
+}

+ 4 - 4
netflix-service/src/main/java/com/cyksj/service/distribute/UserBusinessFrontService.java

@@ -10,10 +10,10 @@ import com.cyksj.model.entity.OrderDon;
  */
 public interface UserBusinessFrontService {
 	/**
-	 *
-	 * @param sharedId 分销人id
+	 * @param sharedId   分销人id
 	 * @param businessId 商务id
-	 * @param order 订单
+	 * @param order      订单
+	 * @param distributeRate      平台分销比例
 	 */
-	void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order);
+	void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order, Integer distributeRate);
 }

+ 27 - 5
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.GoodsDonMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
-import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper;
+import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.UserDistributeReq;
@@ -18,6 +16,8 @@ import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Optional;
+
 /*
  *项目名: netflix
  *文件名: DistributeServiceImpl
@@ -40,6 +40,8 @@ public class DistributeServiceImpl implements DistributeService {
 
 	private final UserDistributeSharedMapper userDistributeSharedMapper;
 
+	private final UserBusinessDefaultRateConfigMapper defaultRateConfigMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
@@ -52,15 +54,19 @@ public class DistributeServiceImpl implements DistributeService {
 		userDistribute.setRemark(userDistributeReq.getRemark());
 		userDistribute.setBusinessId(userDistributeReq.getBusinessId());
 		userDistributeMapper.insert(userDistribute);
-
+		Long businessId = userDistributeReq.getBusinessId();
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
-			if (rate.getRate() <0 || rate.getRate() > 100) {
+			if (rate.getRate() < 0 || rate.getRate() > 100) {
 				throw new BusinessRuntimeException("比例错误");
 			}
 			GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
 			if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) {
 				throw new BusinessRuntimeException("平台错误");
 			}
+			//分销者虚物分销比例且配置商务
+			if (businessId != null && goodsDon.getType() == 1) {
+				checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle());
+			}
 			rate.setDistributeId(userDistribute.getId());
 			userPlatDistributeRateMapper.insert(rate);
 		}
@@ -78,6 +84,7 @@ public class DistributeServiceImpl implements DistributeService {
 		if (userDistributeReq.getBusinessId() == null) {
 			userDistribute.setBusinessId(0l);
 		} else userDistribute.setBusinessId(userDistributeReq.getBusinessId());
+		Long businessId = userDistributeReq.getBusinessId();
 		userDistributeMapper.updateById(userDistribute);
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
 			if (rate.getRate() < 0 || rate.getRate() > 100) {
@@ -91,6 +98,10 @@ public class DistributeServiceImpl implements DistributeService {
 			if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) {
 				throw new BusinessRuntimeException("平台错误");
 			}
+			//分销者虚物分销比例且配置商务
+			if (businessId != null && goodsDon.getType() == 1) {
+				checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle());
+			}
 			rate.setDistributeId(userDistribute.getId());
 			if (rate.getId() == null) {
 				try {
@@ -119,4 +130,15 @@ public class DistributeServiceImpl implements DistributeService {
 			log.info("分销被邀请人重复插入");
 		}
 	}
+
+	public void checkDistributorAndBusinessRate(Integer distributeGoodsRate, Long goodsId, String goodsName) {
+		UserBusinessDefaultRateConfig defaultGoodsRateConfig = defaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class)
+				.eq(UserBusinessDefaultRateConfig::getGoodsId, goodsId)
+				.last("limit 1"));
+		Optional.ofNullable(defaultGoodsRateConfig).ifPresent(config -> {
+			if (distributeGoodsRate > config.getMaxRate()) {
+				throw BusinessRuntimeException.getInstance(String.format("该%s平台最高可配置分销比例为%s", goodsName, config.getMaxRate()));
+			}
+		});
+	}
 }

+ 46 - 11
netflix-service/src/main/java/com/cyksj/service/distribute/impl/UserBusinessFrontServiceImpl.java

@@ -4,12 +4,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserRenewChangeTicketRecordMapper;
+import com.cyksj.mapper.manage.distribute.UserBusinessDefaultRateConfigMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
-import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.UserDistributeBusinessOrderDonRecord;
-import com.cyksj.model.entity.UserDistributeBusinessRate;
-import com.cyksj.model.entity.UserRenewChangeTicketRecord;
+import com.cyksj.model.entity.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -42,8 +40,10 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 
 	private final RedisService redisService;
 
+	private final UserBusinessDefaultRateConfigMapper defaultRateConfigMapper;
+
 	@Override
-	public void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order) {
+	public void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order, Integer distributeRate) {
 		UserDistributeBusinessRate businessRate = userDistributeBusinessRateMapper.selectOne(Wrappers.lambdaQuery(UserDistributeBusinessRate.class)
 				.eq(UserDistributeBusinessRate::getBusinessId, businessId)
 				.eq(UserDistributeBusinessRate::getGoodsId, order.getGoodsId())
@@ -51,10 +51,10 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 		if (businessRate != null) {
 			//首单
 			if (order.getOrderType() == 1) {
-				log.info("商务首单分销分配提成开始");
+				log.info("商务首单orderId:{}分销分配提成开始", order.getId());
 				//用户之前是否下过单
 				Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-						.eq(OrderDon::getUserId,order.getUserId())
+						.eq(OrderDon::getUserId, order.getUserId())
 						.ne(OrderDon::getId, order.getId()).notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
 				if (count == 0) {
 					//是否享受过该用户带来的首单 提成
@@ -68,7 +68,10 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 							boolean isSuccess = redisService.setNx(RedisService.key.BUSINESS_FIRST_ORDER_USER_KEY.getNameFormat(order.getUserId()), businessId, RedisService.key.BUSINESS_FIRST_ORDER_USER_KEY.getTimeout());
 							if (isSuccess) {
 								//首单虚物规格 提成
-								record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, businessRate.getFirstOrderRate(), null);
+								record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, businessRate.getFirstOrderRate(), null, distributeRate);
+								if (record == null) {
+									return;
+								}
 								businessOrderDonRecordMapper.insert(record);
 								log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}首单:{}提成", businessId, sharedId, order.getUserId(), order.getId());
 							}
@@ -94,7 +97,10 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 					if (relationId.equals(preRelationId)) {
 						try {
 							//分配首单续费提成
-							record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate());
+							record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate(), distributeRate);
+							if (record == null) {
+								return;
+							}
 							businessOrderDonRecordMapper.insert(record);
 							log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}续费首单:{}提成", businessId, sharedId, order.getUserId(), order.getId());
 						} catch (DuplicateKeyException e) {
@@ -108,7 +114,10 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 						if (renewChangeTicketRecord != null && renewChangeTicketRecord.getPreRelationId().equals(preRelationId)) {
 							try {
 								//分配首单续费更换车位后提成
-								record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate());
+								record = saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate(), distributeRate);
+								if (record == null) {
+									return;
+								}
 								businessOrderDonRecordMapper.insert(record);
 								log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}续费首单:{}更换后车位提成", businessId, sharedId, order.getUserId(), order.getId());
 							} catch (DuplicateKeyException e) {
@@ -126,7 +135,13 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 	/**
 	 * 保存商务分配提成记录
 	 */
-	public UserDistributeBusinessOrderDonRecord saveBusinessTakeMoneyRecord(OrderDon order, Long businessId, Long sharedId, Integer firstOrderRate, Integer renewOrderRate) {
+	public UserDistributeBusinessOrderDonRecord saveBusinessTakeMoneyRecord(OrderDon order, Long businessId, Long sharedId, Integer firstOrderRate, Integer renewOrderRate, Integer distributeRate) {
+		UserBusinessDefaultRateConfig defaultGoodsRateConfig = defaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class)
+				.eq(UserBusinessDefaultRateConfig::getGoodsId, order.getGoodsId()).last("limit 1"));
+		if (defaultGoodsRateConfig == null) {
+			log.info("系统默认商务分销配置未配置,businessId:{},orderId:{}", businessId, order.getId());
+			return null;
+		}
 		UserDistributeBusinessOrderDonRecord record = new UserDistributeBusinessOrderDonRecord();
 		record.setBusinessId(businessId);
 		record.setUserId(order.getUserId());
@@ -135,15 +150,35 @@ public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
 		record.setOrderCreatedTime(order.getCreatedTime());
 		record.setOrderId(order.getId());
 		record.setPreRelationId(order.getRelationId());
+		//是否超过默认配置平台比例
+		Integer defaultGoodsMaxRate = defaultGoodsRateConfig.getMaxRate();
 		//首单提成比例
 		BigDecimal orderMoney = order.getMoney();
 		BigDecimal takeMoney = null;
 		if (firstOrderRate != null) {
+			if (distributeRate > defaultGoodsMaxRate) {
+				if (defaultGoodsRateConfig.getIsPlatPay()) {
+					log.info("首单,平台承担商务businessId:{}配置分销者sharedId:{}超过平台goodsId:{}最高分销比例:{}", businessId, sharedId, order.getGoodsId(), defaultGoodsMaxRate);
+				}else {
+					firstOrderRate -= distributeRate - defaultGoodsMaxRate;
+					log.info("商务businessId:{}配置分销者sharedId:{}比例超过默认比例,可获取首单提成比例为:{}", businessId, sharedId, firstOrderRate);
+				}
+			}
 			BigDecimal firstRate = BigDecimal.valueOf(firstOrderRate).divide(BigDecimal.valueOf(100));
+			record.setRate(firstOrderRate);
 			takeMoney = orderMoney.multiply(firstRate);
 		}
 		if (renewOrderRate != null) {
+			if (distributeRate > defaultGoodsMaxRate) {
+				if (defaultGoodsRateConfig.getIsPlatPay()) {
+					log.info("首单续费,平台承担商务businessId:{}配置分销者sharedId:{}超过平台goodsId:{}最高分销比例:{}", businessId, sharedId, order.getGoodsId(), defaultGoodsMaxRate);
+				}else {
+					renewOrderRate -= distributeRate - defaultGoodsMaxRate;
+					log.info("商务businessId:{}配置分销者sharedId:{}比例超过默认比例,可获取首单续费提成比例为:{}", businessId, sharedId, firstOrderRate);
+				}
+			}
 			BigDecimal renewRate = BigDecimal.valueOf(renewOrderRate).divide(BigDecimal.valueOf(100));
+			record.setRate(renewOrderRate);
 			takeMoney = orderMoney.multiply(renewRate);
 		}
 		record.setTakeMoney(takeMoney);

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

@@ -1569,7 +1569,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					//暂定虚物 商务可首单提成
 					if (businessId != null && goodsDon.getType() == 1) {
 						//给商务人员 分配提成权益
-						userBusinessFrontService.taskDistributeRateBenefits(userDistributeShared.getSharedId(), businessId, order);
+						userBusinessFrontService.taskDistributeRateBenefits(userDistributeShared.getSharedId(), businessId, order, rate);
 					}
 				}
 			}

+ 42 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -17,10 +17,7 @@ import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
-import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
-import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
 import com.cyksj.model.request.UserDistributeReq;
@@ -86,6 +83,8 @@ public class DistributeController {
 
 	private final CmsUserMapper cmsUserMapper;
 
+	private final UserBusinessDefaultRateConfigMapper defaultRateConfigMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -481,4 +480,43 @@ public class DistributeController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("修改比例成功");
 	}
 
+	/**
+	 * 商务默认分配平台比例
+	 */
+	@GetMapping("/get/defaultRateConfig")
+	public Result<List<UserBusinessDefaultRateConfigView>> getDefaultRateConfig() {
+		List<UserBusinessDefaultRateConfigView> search = beanSearcher.searchAll(UserBusinessDefaultRateConfigView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 编辑商务默认平台比例
+	 */
+	@PutMapping("/update/business/defaultRate")
+	public Result<String> updateBusinessDefaultRate(@RequestBody List<UserBusinessDefaultRateConfig> configs) {
+		configs.forEach(rateConfig->{
+			Long rateConfigId = rateConfig.getId();
+			UserBusinessDefaultRateConfig config = Optional.ofNullable(defaultRateConfigMapper.selectById(rateConfigId)).orElse(new UserBusinessDefaultRateConfig());
+			BeanUtil.copyProperties(rateConfig, config);
+			Number number = beanSearcher.searchCount(GoodsDonSkuView.class, MapUtils.builder()
+					.field(GoodsDonSkuView::getGoodsId, rateConfig.getGoodsId())
+					.field(GoodsDonSkuView::getGoodsDonDeleted, true)
+					.build());
+			if (number.intValue() == 0) {
+				defaultRateConfigMapper.delete(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class)
+						.eq(UserBusinessDefaultRateConfig::getGoodsId, rateConfig.getGoodsId()));
+				return;
+			}
+			if (rateConfig.getId() == null) {
+				try {
+					defaultRateConfigMapper.insert(config);
+					return;
+				} catch (DuplicateKeyException e) {
+
+				}
+			}
+			defaultRateConfigMapper.updateById(config);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }