Sfoglia il codice sorgente

add 商务人员分销首单提成

zoujiajian 3 anni fa
parent
commit
85719886aa
21 ha cambiato i file con 550 aggiunte e 6 eliminazioni
  1. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/UserDistributeBusinessOrderDonRecordMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/UserDistributeBusinessRateMapper.java
  3. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistribute.java
  4. 54 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeBusinessOrderDonRecord.java
  5. 32 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeBusinessRate.java
  6. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java
  7. 49 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeBusinessView.java
  8. 30 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeBusinessRateView.java
  9. 8 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java
  10. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  11. 19 0
      netflix-service/src/main/java/com/cyksj/service/distribute/UserBusinessFrontService.java
  12. 4 0
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  13. 146 0
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/UserBusinessFrontServiceImpl.java
  14. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/business/UserBusinessRateService.java
  15. 56 0
      netflix-service/src/main/java/com/cyksj/service/mange/business/impl/UserBusinessRateServiceImpl.java
  16. 11 1
      netflix-service/src/main/java/com/cyksj/service/mange/cms/CmsUserManager.java
  17. 10 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  18. 75 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  19. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java
  20. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/HelpController.java
  21. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

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

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

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

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

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

@@ -20,6 +20,11 @@ public class UserDistribute extends BaseEntity{
 	 */
 	private String remark;
 
+	/**
+	 * 商务人员id
+	 */
+	private Long businessId;
+
 	@TableLogic(value = "1", delval = "0")
 	private Boolean deleted;
 }

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

@@ -0,0 +1,54 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: UserDistributeBusinessOrderDonRecord
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:47
+ */
+@Getter
+@Setter
+public class UserDistributeBusinessOrderDonRecord extends BaseEntity{
+	/**
+	 * 商务id
+	 */
+	private Long businessId;
+
+	/**
+	 * 分销人id
+	 */
+	private Long sharedId;
+
+	/**
+	 * 产生分销订单用户id
+	 */
+	private Long userId;
+
+	/**
+	 * 首单时 座位id
+	 */
+	private Long preRelationId;
+
+	private Long orderId;
+
+	/**
+	 * 1首单,2续费
+	 */
+	private Integer orderType;
+
+	/**
+	 * 提成金额
+	 */
+	private BigDecimal takeMoney;
+
+	/**
+	 * 订单创建时间
+	 */
+	private Date orderCreatedTime;
+}

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeBusinessRate.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: UserDistributeBusinessRate
+ *创建者: JavaZou
+ *创建时间:2023/3/22 18:11
+ */
+@Getter
+@Setter
+public class UserDistributeBusinessRate extends BaseEntity{
+	/**
+	 * 商务用户id
+	 */
+	@NotNull
+	private Long businessId;
+
+	/**
+	 * 首单提成比例
+	 */
+	private Integer firstOrderRate;
+
+	/**
+	 * 首单续费提成比例
+	 */
+	private Integer renewOrderRate;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java

@@ -22,6 +22,11 @@ public class UserDistributeReq {
 	@NotNull(message = "请添加用户")
 	private Long userId;
 
+	/**
+	 * 商务人员id
+	 */
+	private Long businessId;
+
 	private String remark;
 
 	/**

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributeBusinessView.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: DistributeBusinessView
+ *创建者: JavaZou
+ *创建时间:2023/3/22 18:00
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_business_rate ur left join user_distribute_business_order_don_record ubr on ubr.business_id = ur.business_id" +
+		" left join cms_user cu on cu.id = ur.business_id",
+		groupBy = "ur.business_id,cu.nickname,date_format(ubr.order_created_time,'%Y-%m')")
+public class DistributeBusinessView {
+	@DbField("ur.business_id")
+	private Long businessId;
+
+	@DbField("cu.nickname")
+	private String businessName;
+
+	/**
+	 * 关联人数
+	 */
+	@DbIgnore
+	private Integer numOfRelation;
+
+	@DbField("count(if(ubr.order_type = 1,1,NULL))")
+	private Integer numOfFirstOrderThisMonth;
+
+	@DbField("cast(sum(if(ubr.order_type = 1,ubr.take_money,0))/100 as decimal(10,0))")
+	private BigDecimal moneyOfFirstOrderThisMonth;
+
+	@DbField("count(if(ubr.order_type = 2,1,NULL))")
+	private Integer numOfRenewOrderThisMonth;
+
+	@DbField("cast(sum(if(ubr.order_type = 2,ubr.take_money,0))/100 as decimal(10,0))")
+	private BigDecimal moneyOfRenewOrderThisMonth;
+
+	@DbField("date_format(ubr.order_created_time,'%Y-%m')")
+	private String monthDate;
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeBusinessRateView.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: UserDistributeBusinessRateView
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:24
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute ud left join user_distribute_business_rate ubr on ubr.business_id = ud.business_id"
+		, where = "ud.deleted is true")
+public class UserDistributeBusinessRateView {
+	@DbField("ud.user_id")
+	private Long sharedId;
+
+	@DbField("ud.business_id")
+	private Long businessId;
+
+	@DbField("ubr.first_order_rate")
+	private Integer firstOrderRate;
+
+	@DbField("ubr.renew_order_rate")
+	private Integer renewOrderRate;
+}

+ 8 - 1
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java

@@ -18,7 +18,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user_distribute ud left join user u on u.id = ud.user_id",
+@SearchBean(tables = "user_distribute ud left join user u on u.id = ud.user_id" +
+		" left join cms_user cu on cu.id = ud.business_id",
 where = "ud.deleted is true and u.id is not null")
 public class UserDistributeViews {
 
@@ -28,6 +29,12 @@ public class UserDistributeViews {
 	@DbField("ud.user_id")
 	private Long userId;
 
+	@DbField("ud.business_id")
+	private Long businessId;
+
+	@DbField("cu.nickname")
+	private String businessName;
+
 	@DbField("u.nickname")
 	private String nickname;
 

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -600,6 +600,7 @@ public class RedisService {
         CMS_USER_ROLE_KEY("cms:user:role:%s:", "user角色缓存前缀", 60 * 60 * 24L * 7),
         CMS_USER_PERMISSION_KEY("cms:user:permission:%s:", "user权限缓存前缀", 60 * 60 * 24L * 7),
         REPEAT_USER_KEY("repeat_user_key:%s:", "重复用户插入key", 60l),
+        BUSINESS_FIRST_ORDER_USER_KEY("business_first_order_user_key:%s:", "商务分销首单提成key", 60l),
         ;
 
         private String name;

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

@@ -0,0 +1,19 @@
+package com.cyksj.service.distribute;
+
+import com.cyksj.model.entity.OrderDon;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessFrontService
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:19
+ */
+public interface UserBusinessFrontService {
+	/**
+	 *
+	 * @param sharedId 分销人id
+	 * @param businessId 商务id
+	 * @param order 订单
+	 */
+	void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order);
+}

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -50,6 +50,7 @@ public class DistributeServiceImpl implements DistributeService {
 		UserDistribute userDistribute = new UserDistribute();
 		userDistribute.setUserId(userDistributeReq.getUserId());
 		userDistribute.setRemark(userDistributeReq.getRemark());
+		userDistribute.setBusinessId(userDistributeReq.getBusinessId());
 		userDistributeMapper.insert(userDistribute);
 
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
@@ -74,6 +75,9 @@ public class DistributeServiceImpl implements DistributeService {
 		UserDistribute userDistribute = new UserDistribute();
 		userDistribute.setId(userDistributeReq.getId());
 		userDistribute.setRemark(userDistributeReq.getRemark());
+		if (userDistribute.getBusinessId() == null) {
+			userDistribute.setBusinessId(0l);
+		}
 		userDistributeMapper.updateById(userDistribute);
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
 			if (rate.getRate() < 0 || rate.getRate() > 100) {

+ 146 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/impl/UserBusinessFrontServiceImpl.java

@@ -0,0 +1,146 @@
+package com.cyksj.service.distribute.impl;
+
+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.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.redis.RedisService;
+import com.cyksj.service.distribute.UserBusinessFrontService;
+import com.ejlchina.searcher.BeanSearcher;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessFrontServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:20
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserBusinessFrontServiceImpl implements UserBusinessFrontService {
+	private final BeanSearcher beanSearcher;
+
+	private final UserDistributeBusinessRateMapper userDistributeBusinessRateMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final UserDistributeBusinessOrderDonRecordMapper businessOrderDonRecordMapper;
+
+	private final UserRenewChangeTicketRecordMapper renewChangeTicketRecordMapper;
+
+	private final RedisService redisService;
+
+	@Override
+	public void taskDistributeRateBenefits(Long sharedId, Long businessId, OrderDon order) {
+		UserDistributeBusinessRate businessRate = userDistributeBusinessRateMapper.selectById(businessId);
+		if (businessRate != null) {
+			//首单
+			if (order.getOrderType() == 1) {
+				log.info("商务首单分销分配提成开始");
+				//用户之前是否下过单
+				Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+						.ne(OrderDon::getId, order.getId()).notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+				if (count == 0) {
+					//是否享受过该用户带来的首单 提成
+					UserDistributeBusinessOrderDonRecord record = businessOrderDonRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributeBusinessOrderDonRecord.class)
+							.eq(UserDistributeBusinessOrderDonRecord::getBusinessId, businessId)
+							.eq(UserDistributeBusinessOrderDonRecord::getUserId, order.getUserId()));
+					if (record == null) {
+						try {
+							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) {
+								//首单 提成
+								saveBusinessTakeMoneyRecord(order, businessId, sharedId, businessRate.getFirstOrderRate(), null);
+								businessOrderDonRecordMapper.insert(record);
+								log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}首单:{}提成", businessId, sharedId, order.getUserId(), order.getId());
+							}
+						} catch (DuplicateKeyException e) {
+							log.error("商务:{}重复获取分销人:{}分销的用户:{}首单:{}提成", businessId, businessId, order.getUserId(), order.getId());
+						}
+					}
+				}
+			}
+			//续费
+			if (order.getOrderType() == 2) {
+				log.info("商务首单续费分销分配提成开始");
+				//是否享受过该用户首单 提成
+				UserDistributeBusinessOrderDonRecord record = businessOrderDonRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributeBusinessOrderDonRecord.class)
+						.eq(UserDistributeBusinessOrderDonRecord::getBusinessId, businessId)
+						.eq(UserDistributeBusinessOrderDonRecord::getUserId, order.getUserId())
+						.eq(UserDistributeBusinessOrderDonRecord::getOrderType, 1).last("limit 1"));
+				if (record != null) {
+					log.info("开始给商务人员:{}分配用户:{}首单续费提成", businessId, order.getUserId());
+					//是否更换过车票规格座位号
+					Long preRelationId = record.getPreRelationId();
+					Long relationId = order.getRelationId();
+					if (relationId.equals(preRelationId)) {
+						try {
+							//分配首单续费提成
+							saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate());
+							businessOrderDonRecordMapper.insert(record);
+							log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}续费首单:{}提成", businessId, sharedId, order.getUserId(), order.getId());
+						} catch (DuplicateKeyException e) {
+							log.error("商务:{}重复获取分销人:{}分销的用户:{}续费首单:{}提成", businessId, businessId, order.getUserId(), order.getId());
+						}
+					} else {
+						UserRenewChangeTicketRecord renewChangeTicketRecord = renewChangeTicketRecordMapper.selectOne(Wrappers.lambdaQuery(UserRenewChangeTicketRecord.class)
+								.eq(UserRenewChangeTicketRecord::getUserId, order.getUserId())
+								.eq(UserRenewChangeTicketRecord::getAfterRelationId, relationId)
+								.last("limit 1"));
+						if (renewChangeTicketRecord != null && renewChangeTicketRecord.getPreRelationId().equals(preRelationId)) {
+							try {
+								//分配首单续费更换车位后提成
+								saveBusinessTakeMoneyRecord(order, businessId, sharedId, null, businessRate.getRenewOrderRate());
+								businessOrderDonRecordMapper.insert(record);
+								log.info("开始给商务人员:{}分配分销人:{}分销的用户:{}续费首单:{}更换后车位提成", businessId, sharedId, order.getUserId(), order.getId());
+							} catch (DuplicateKeyException e) {
+								log.error("商务:{}重复获取分销人:{}分销的用户:{}续费首单:{}更换后车位提成", businessId, businessId, order.getUserId(), order.getId());
+							}
+						}
+					}
+
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * 保存商户分配提成记录
+	 */
+	public UserDistributeBusinessOrderDonRecord saveBusinessTakeMoneyRecord(OrderDon order, Long businessId, Long sharedId, Integer firstOrderRate, Integer renewOrderRate) {
+		UserDistributeBusinessOrderDonRecord record = new UserDistributeBusinessOrderDonRecord();
+		record.setBusinessId(businessId);
+		record.setUserId(order.getUserId());
+		record.setSharedId(sharedId);
+		record.setOrderType(1);
+		record.setOrderCreatedTime(order.getCreatedTime());
+		record.setOrderId(order.getId());
+		record.setPreRelationId(order.getRelationId());
+		//首单提成比例
+		BigDecimal orderMoney = order.getMoney();
+		BigDecimal takeMoney = null;
+		if (firstOrderRate != null) {
+			BigDecimal firstRate = BigDecimal.valueOf(firstOrderRate).divide(BigDecimal.valueOf(100));
+			takeMoney = orderMoney.multiply(orderMoney.multiply(firstRate));
+		}
+		if (renewOrderRate != null) {
+			BigDecimal firstRate = BigDecimal.valueOf(renewOrderRate).divide(BigDecimal.valueOf(100));
+			takeMoney = orderMoney.multiply(orderMoney.multiply(firstRate));
+		}
+		record.setTakeMoney(takeMoney);
+		return record;
+	}
+}

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/mange/business/UserBusinessRateService.java

@@ -0,0 +1,16 @@
+package com.cyksj.service.mange.business;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessRateService
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:02
+ */
+public interface UserBusinessRateService {
+	/**
+	 * 若无配置商务人员比例,保存商务人员比例
+	 */
+	void saveBusinessRate(Long businessId);
+
+	Boolean isBusiness(Long businessId);
+}

+ 56 - 0
netflix-service/src/main/java/com/cyksj/service/mange/business/impl/UserBusinessRateServiceImpl.java

@@ -0,0 +1,56 @@
+package com.cyksj.service.mange.business.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
+import com.cyksj.model.entity.UserDistributeBusinessRate;
+import com.cyksj.model.views.CmsUserVO;
+import com.cyksj.service.mange.business.UserBusinessRateService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: UserBusinessRateServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/3/23 14:02
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserBusinessRateServiceImpl implements UserBusinessRateService {
+	private final UserDistributeBusinessRateMapper userDistributeBusinessRateMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	@Override
+	public void saveBusinessRate(Long businessId) {
+		if (businessId != null) {
+			UserDistributeBusinessRate businessRate = userDistributeBusinessRateMapper.selectOne(Wrappers.lambdaQuery(UserDistributeBusinessRate.class)
+					.eq(UserDistributeBusinessRate::getBusinessId, businessId).last("limit 1"));
+			if (businessRate == null) {
+				try {
+					businessRate = new UserDistributeBusinessRate();
+					businessRate.setBusinessId(businessId);
+					userDistributeBusinessRateMapper.insert(businessRate);
+				} catch (DuplicateKeyException e) {
+
+				}
+			}
+		}
+	}
+
+	@Override
+	public Boolean isBusiness(Long businessId) {
+		//是否是商务人员
+		CmsUserVO isBusiness = beanSearcher.searchFirst(CmsUserVO.class, MapUtils.builder().field(CmsUserVO::getId, businessId).field(CmsUserVO::getRoleNames, "商务").op(Operator.Contain).build());
+		if (isBusiness != null) {
+			return true;
+		}
+		return false;
+	}
+}

+ 11 - 1
netflix-service/src/main/java/com/cyksj/service/mange/cms/CmsUserManager.java

@@ -6,10 +6,12 @@ import com.cyksj.mapper.manage.cms.CmsMenuMapper;
 import com.cyksj.mapper.manage.cms.CmsRoleMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.cms.CmsUserRoleMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
 import com.cyksj.model.entity.CmsMenu;
 import com.cyksj.model.entity.CmsRole;
 import com.cyksj.model.entity.CmsUser;
 import com.cyksj.model.entity.CmsUserRole;
+import com.cyksj.service.mange.business.UserBusinessRateService;
 import com.cyksj.service.mange.cms.manager.service.CacheService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -41,6 +43,10 @@ public class CmsUserManager {
 
 	private final CmsUserRoleMapper cmsUserRoleMapper;
 
+	private final UserDistributeBusinessRateMapper userDistributeBusinessRateMapper;
+
+	private final UserBusinessRateService userBusinessRateService;
+
 	public CmsUser getUser(Long account) {
 		return selectCacheByTemplate(() -> cacheService.getUserCache(account), () -> cmsUserMapper.selectById(account));
 	}
@@ -99,7 +105,11 @@ public class CmsUserManager {
 	}
 
 	public void saveUserRoleRelation(Long userId, String roleIds) {
-		Arrays.stream(roleIds.split(",")).collect(Collectors.toSet()).forEach(roleId->{
+		Arrays.stream(roleIds.split(",")).collect(Collectors.toSet()).forEach(roleId -> {
+			CmsRole cmsRole = cmsRoleMapper.selectById(roleId);
+			if (cmsRole != null && cmsRole.getRoleName().contains("商务")) {
+				userBusinessRateService.saveBusinessRate(userId);
+			}
 			cmsUserRoleMapper.insert(new CmsUserRole(userId, Long.valueOf(roleId)));
 		});
 	}

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

@@ -58,6 +58,7 @@ import com.cyksj.model.views.CouponUserView;
 import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.coupon.CouponFontService;
+import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.mange.stock.GoodsDonStockService;
@@ -192,6 +193,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final SysConfigService sysConfigService;
 
+	private final UserBusinessFrontService userBusinessFrontService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1495,6 +1498,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		BigDecimal orderMoney = order.getMoney();
 		BigDecimal points = null;
 		BigDecimal returnMoney = null;
+		Long businessId = null;
 		UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, order.getUserId()).last("limit 1"));
 		if (userDistributeShared != null) {
 			distributeWaitingSendPoints.setSharedId(userDistributeShared.getSharedId());
@@ -1532,6 +1536,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						returnMoney = orderMoney.multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(100));
 					}
 				}else {
+					businessId = userDistribute.getBusinessId();
 					//固定推广分销
 					UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
 							.eq(UserPlatDistributeRate::getGoodsId, order.getGoodsId())
@@ -1561,6 +1566,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.waiting);
 					distributeWaitingSendPoints.setSendTime(DateUtil.offsetDay(order.getPayTime(), 3));
 					distributeWaitingSendPointsMapper.insert(distributeWaitingSendPoints);
+					//暂定续费 商务可首单提成
+					if (businessId != null && goodsDon.getType() == 1) {
+						//给商务人员 分配提成权益
+						userBusinessFrontService.taskDistributeRateBenefits(userDistributeShared.getSharedId(), businessId, order);
+					}
 				}
 			}
 		}

+ 75 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -1,5 +1,8 @@
 package com.cyksj.web.controller.manage.distribute;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -14,19 +17,23 @@ import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.UserMapper;
 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.model.entity.*;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
 import com.cyksj.model.request.UserDistributeReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.distribute.DistributeService;
+import com.cyksj.service.mange.business.UserBusinessRateService;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -68,13 +75,24 @@ public class DistributeController {
 
 	private final StatisticsDataService statisticsDataService;
 
+	private final UserBusinessRateService userBusinessRateService;
+
+	private final UserDistributeBusinessRateMapper userDistributeBusinessRateMapper;
+
+	private final HttpServletRequest request;
+
 	/**
 	 * 添加固定推广者
 	 */
 	@PostMapping
+	@SaCheckPermission("distribute:add")
 	@Log(module = "分销管理/增加推广者", businessType = BusinessType.POST, isSaveRequestData = true)
+	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> saveDistributes(@RequestBody @NotNull UserDistributeReq userDistributeReq) {
 		distributeService.insertDistribute(userDistributeReq);
+		Long businessId = userDistributeReq.getBusinessId();
+		//保存商务人员提成比例
+		userBusinessRateService.saveBusinessRate(businessId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("添加成功");
 	}
 
@@ -82,6 +100,7 @@ public class DistributeController {
 	 * 删除固定推广者
 	 */
 	@DeleteMapping("/del/{id}")
+	@SaCheckPermission("distribute:delete")
 	@Log(module = "分销管理/删除推广者", businessType = BusinessType.DELETE, isSaveRequestData = true)
 	public Result<String> deleteDistributesById(@PathVariable Long id) {
 		if (id == null || id < 1) {
@@ -95,6 +114,7 @@ public class DistributeController {
 	 * 推广者编辑
 	 */
 	@PutMapping
+	@SaCheckPermission("distribute:update")
 	@Log(module = "分销管理/编辑推广者", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> editDistribute(@RequestBody UserDistributeReq userDistributeReq) {
 		distributeService.editDistribute(userDistributeReq);
@@ -117,7 +137,13 @@ public class DistributeController {
 	 */
 	@GetMapping
 	public Result<SearchResult<UserDistributeViews>> distributeList(HttpServletRequest request) {
-		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		//是否是商务人员
+		if (userBusinessRateService.isBusiness(adminId)) {
+			builder.field(UserDistributeViews::getBusinessId, adminId);
+		}
+		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class, builder.build());
 		DistributePointsExchangeMoney pointsMoneyRate = distributePointsExchangeMoneyMapper.selectOne(null);
 		Optional.ofNullable(search.getDataList()).ifPresent(list -> list.forEach(view -> {
 			BigDecimal num = view.getPoints().divide(BigDecimal.valueOf(pointsMoneyRate.getPoints()), RoundingMode.DOWN);
@@ -140,6 +166,7 @@ public class DistributeController {
 	 * 获取平台分销比例
 	 */
 	@GetMapping("/get/plat")
+	@SaCheckPermission("distribute:platRateView")
 	public Result<List<GoodsDon>> getGoodsDistributeRate() {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).in(GoodsDon::getType, Constant.dsGoodsIds).eq(GoodsDon::getDeleted, true).orderByAsc(GoodsDon::getType).orderByAsc(GoodsDon::getId).select(GoodsDon::getId, GoodsDon::getType, GoodsDon::getTitle, GoodsDon::getRate, GoodsDon::getSecondRate)));
 	}
@@ -226,6 +253,7 @@ public class DistributeController {
 	 * 提现列表
 	 */
 	@GetMapping("/get/applyMoney/list")
+	@SaCheckPermission("distribute:applyView")
 	public Result<SearchResult<DistributeMoneyApplyView>> applyMoneyList(HttpServletRequest request) {
 		SearchResult<DistributeMoneyApplyView> search = beanSearcher.search(DistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
@@ -324,4 +352,50 @@ public class DistributeController {
 				.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(number.intValue());
 	}
+
+	/**
+	 * 绑定固定分销者的商务人员详情
+	 */
+	@GetMapping("/get/business/list")
+	@SaCheckPermission("distribute:businessView")
+	public Result<SearchResult<DistributeBusinessView>> getDistributeBusinessView() {
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		//是否是商务人员
+		if (userBusinessRateService.isBusiness(adminId)) {
+			builder.field(DistributeBusinessView::getBusinessId, adminId);
+		}
+		SearchResult<DistributeBusinessView> search = beanSearcher.search(DistributeBusinessView.class, builder.build());
+		search.getDataList().forEach(data->{
+			Number numOfRelation = beanSearcher.searchCount(UserDistribute.class, MapUtils.builder().field(UserDistribute::getBusinessId, data.getBusinessId()).field(UserDistribute::getDeleted, true).build());
+			data.setNumOfRelation(numOfRelation.intValue());
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 查看商务人员提成比例
+	 */
+	@GetMapping("/get/business/rate")
+	@SaCheckPermission("distribute:businessRateView")
+	public Result<UserDistributeBusinessRate> getUserDistributeBusinessRateDetail(Long businessId) {
+		UserDistributeBusinessRate userDistributeBusinessRate = beanSearcher.searchFirst(UserDistributeBusinessRate.class, MapUtils.builder()
+				.field(UserDistributeBusinessRate::getBusinessId, businessId)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userDistributeBusinessRate);
+	}
+
+	/**
+	 * 修改商务人员提成比例
+	 */
+	@PutMapping("/put/business/rate")
+	@Log(module = "分销管理/修改商户人员比例", businessType = BusinessType.PUT, isSaveRequestData = true)
+	public Result<String> updateBusinessRate(@RequestBody @Validated UserDistributeBusinessRate userDistributeBusinessRate) {
+		Long rateId = userDistributeBusinessRate.getId();
+		UserDistributeBusinessRate businessRate = userDistributeBusinessRateMapper.selectById(rateId);
+		BeanUtil.copyProperties(userDistributeBusinessRate, businessRate);
+		userDistributeBusinessRateMapper.updateById(businessRate);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("修改比例成功");
+	}
+
 }

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java

@@ -138,7 +138,7 @@ public class CmsRegisterController {
      */
     @PostMapping("/wx/refund")
     @SaCheckPermission("sign:refund")
-    private Result<String> wxRefund(@RequestBody @Validated WxOrderRefundReq wxOrderRefundReq) throws Exception {
+    public Result<String> wxRefund(@RequestBody @Validated WxOrderRefundReq wxOrderRefundReq) throws Exception {
         return registerOrderDonService.wxRefund(wxOrderRefundReq);
     }
 

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/HelpController.java

@@ -143,7 +143,7 @@ public class HelpController {
 	 * 问题详情
 	 */
 	@GetMapping("/get/question/detail")
-	private Result<HelpQuestion> getQuestionById(@NotNull Long id) {
+	public Result<HelpQuestion> getQuestionById(@NotNull Long id) {
 		if (id == null || id < 1) {
 			throw BusinessRuntimeException.getInstance("id error");
 		}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -89,7 +89,7 @@ public class SysConfigController {
 	 * 问题详情
 	 */
 	@GetMapping("/get/question/detail")
-	private Result<HelpQuestion> getQuestionById(Long id) {
+	public Result<HelpQuestion> getQuestionById(Long id) {
 		if (id == null || id < 1) {
 			throw BusinessRuntimeException.getInstance("id error");
 		}