zoujiajian 3 лет назад
Родитель
Сommit
238179e7d7

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

@@ -118,4 +118,9 @@ public interface Constant {
 	String ZK_MOBILE = "18268325725";
 
 	List<Long> AI_goodsIds = List.of(18l, 26l);
+
+	/**
+	 * 普通推广 关联优惠券id
+	 */
+	Long GENERAL_POPULARIZE_COUPON_ID = 111l;
 }

+ 88 - 0
netflix-common/src/main/java/com/cyksj/common/util/ValidatorUtil.java

@@ -0,0 +1,88 @@
+package com.cyksj.common.util;
+
+import java.util.regex.Pattern;
+
+/**
+ * 正则校验
+ *
+ * @author valor
+ * @date 2018/10/8 01:25
+ */
+public class ValidatorUtil {
+
+    private ValidatorUtil() { }
+
+    /**
+     * 正则表达式:验证手机号(精确)
+     * <p>移动:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198</p>
+     * <p>联通:130、131、132、145、155、156、175、176、185、186、166</p>
+     * <p>电信:133、153、173、177、180、181、189、199</p>
+     * <p>全球星:1349</p>
+     * <p>虚拟运营商:170</p>
+     */
+    private static final Pattern P_MOBILE = Pattern.compile("(?:0|86|\\+86)?1[3456789]\\d{9}");
+
+    /**
+     * 正则表达式:验证身份证
+     */
+    private static final Pattern P_ID_CARD = Pattern.compile("^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9X]$");
+
+    /**
+     * 正则表达式: 中文名
+     */
+    private static final Pattern P_CHINESE_NAME = Pattern.compile("^([\\u4e00-\\u9fa5\\·]{2,16})$");
+
+    /**
+     * 正则表达式:数字
+     */
+    private static final Pattern P_NUM = Pattern.compile("^[0-9]\\d{9,29}$");
+
+    private static final Pattern EN_NUM = Pattern.compile("^[A-Za-z0-9]+$");
+
+    /**
+     * 校验手机号
+     *
+     * @param mobile
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isMobile(String mobile) {
+        return P_MOBILE.matcher(mobile).matches();
+    }
+
+    /**
+     * 校验身份证
+     *
+     * @param idCard
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isIDCard(String idCard) {
+        return P_ID_CARD.matcher(idCard).matches();
+    }
+
+    /**
+     * 校验中文名
+     *
+     * @param name
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isChineseName(String name) {
+        return P_CHINESE_NAME.matcher(name).matches();
+    }
+
+    /**
+     * 校验银行卡号
+     *
+     * @param id
+     * @return 校验通过返回true,否则返回false
+     */
+    public static boolean isNum(String id){
+        return P_NUM.matcher(id).matches();
+    }
+
+    /**
+     * 英文+数字
+     */
+    public static boolean isEnNum(String str){
+        return EN_NUM.matcher(str).matches();
+    }
+}

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CouponPopularizeDto.java

@@ -34,11 +34,20 @@ public class CouponPopularizeDto {
 
 	private Coupon.Scope scope;
 
+	private Long distributeId;
+
 	/**
 	 * 优惠券推广者关联id
 	 */
 	private Long popularizeId;
 
+	/**
+	 * 是否是普通推广
+	 */
+	private Boolean isGeneral;
+
+	private Long userId;
+
 	/**
 	 * 优惠券推广者关联优惠券id
 	 */

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponDistributePopularize.java

@@ -20,6 +20,13 @@ public class CouponDistributePopularize extends BaseEntity {
 	 */
 	private Long distributeId;
 
+	private Long userId;
+
+	/**
+	 * 是否是普通 默认不是
+	 */
+	private Boolean isGeneral;
+
 	/**
 	 * 兑换码
 	 */

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

@@ -16,7 +16,7 @@ import lombok.Setter;
 @Setter
 @SearchBean(tables = "coupon_distribute_popularize cp left join user_distribute ub on ub.id = cp.distribute_id" +
 		" left join user u on u.id = ub.user_id",
-		where = "cp.deleted is true")
+		where = "cp.deleted is true and cp.is_general is false")
 public class CouponDistributePopularizeView {
 	@DbField("cp.id")
 	private Long id;

+ 1 - 2
netflix-dao/src/main/java/com/cyksj/model/views/CouponNewUserView.java

@@ -13,8 +13,7 @@ import lombok.Setter;
  */
 @Getter
 @Setter
-@SearchBean(tables = "order_don od left join goods_don_sku gdk on gdk.id = od.sku_id" +
-		" left join goods_don gd on gd.id = gdk.goods_id",
+@SearchBean(tables = "order_don od left join goods_don gd on gd.id = od.goods_id",
 		where = "gd.type = 1 and od.status not in ('close','noPayment')")
 public class CouponNewUserView {
 	@DbField("od.id")

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeView.java

@@ -45,11 +45,26 @@ public class DistributePopularizeView {
 	 */
 	private Integer distributeOrders;
 
+	/**
+	 * 是否是普通推广
+	 */
+	private Boolean isGeneral;
+
 	/**
 	 * 最高返现比例
 	 */
 	private Integer highestRate;
 
+	/**
+	 * 普通专属推广码
+	 */
+	private String generalCode;
+
+	/**
+	 * 普通专属推广折扣
+	 */
+	private String generalDiscount;
+
 	/**
 	 * 普通低分销比例
 	 */

+ 6 - 1
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -6,11 +6,14 @@
     <select id="checkExCode" resultType="com.cyksj.model.dto.CouponPopularizeDto">
         select cp.id         as couponId,
                cdp.id        as popularizeId,
+               cdp.user_id,
+               cdp.distribute_id,
                cp.goods_sku_ids,
                cp.type,
                cp.use_scope,
                cp.scope,
                cdp.coupon_id as popularizeCouponId,
+               cdp.is_general,
                cp.goods_type,
                cp.reduce_money,
                cp.reduce_condition,
@@ -20,7 +23,9 @@
                cp.valid_end_time,
                cp.is_valid_time
         from `coupon` cp
-                 left join (select id, coupon_id, ex_code from `coupon_distribute_popularize` where deleted is true) cdp
+                 left join (select id, distribute_id,coupon_id, ex_code, user_id, is_general
+                            from `coupon_distribute_popularize`
+                            where deleted is true) cdp
                            on cdp.coupon_id = cp.id
         where cp.deleted is true
           and (cp.ex_code = #{couponExCode} or cdp.ex_code = #{couponExCode}) limit 1

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

@@ -610,6 +610,7 @@ public class RedisService {
         IMPORT_ACCOUNT_CACHE_KEY("import_account_cache_key:%s", "导入缓存key", 60 * 10L),
         MAKERTING_MSG_KEY("makerting_msg_key", "营销短信", 60 * 60 * 24 * 30),
         PHONE_AREA_CODE("phone_area_code:key", "国家或地区码", 60 * 60 * 24 * 15),
+        GENERAL_POPULARIZE_CODE("general_popularize_code:", "普通推广者关联优惠券", 10l),
         ;
 
         private String name;

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/DistributeService.java

@@ -20,4 +20,9 @@ public interface DistributeService {
 	 * dsPopularizeId: 后台自定义推广链接id
 	 */
 	void saveDistributionInvitation(Long sharedId, Long userId, Long dsPopularizeId);
+
+	/**
+	 * 普通推广者绑定优惠推广码
+	 */
+	void bindPopularizeCode(Long userId, String code);
 }

+ 53 - 1
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -2,10 +2,16 @@ package com.cyksj.service.distribute.impl;
 
 import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.GoodsDonMapper;
-import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
+import com.cyksj.mapper.manage.distribute.UserBusinessDefaultRateConfigMapper;
+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.market.task.TaskTypeMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.UserDistributeReq;
@@ -46,6 +52,10 @@ public class DistributeServiceImpl implements DistributeService {
 
 	private final RedisService redisService;
 
+	private final CouponMapper couponMapper;
+
+	private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
@@ -148,6 +158,48 @@ public class DistributeServiceImpl implements DistributeService {
 		}
 	}
 
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void bindPopularizeCode(Long userId, String code) {
+		Coupon coupon = couponMapper.getCouponById(Constant.GENERAL_POPULARIZE_COUPON_ID);
+		if (!redisService.setNx(RedisService.key.GENERAL_POPULARIZE_CODE.getName() + code, userId, RedisService.key.GENERAL_POPULARIZE_CODE.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
+		}
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, userId)
+				.eq(UserDistribute::getDeleted, true)
+				.last("limit 1"));
+		if (userDistribute != null) throw BusinessRuntimeException.getInstance("只适用于普通用户进行专属推广");
+		CouponDistributePopularize is_exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+				.eq(CouponDistributePopularize::getUserId, userId)
+				.last("limit 1"));
+		if (is_exists != null) throw BusinessRuntimeException.getInstance("你已设置专属推广优惠码");
+		CouponDistributePopularize couponDistributePopularize = new CouponDistributePopularize();
+		couponDistributePopularize.setCouponId(coupon.getId());
+		couponDistributePopularize.setUserId(userId);
+		couponDistributePopularize.setIsGeneral(true);
+		CouponDistributePopularize exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+				.eq(CouponDistributePopularize::getExCode, code)
+				.eq(CouponDistributePopularize::getDeleted, true)
+				.ne(CouponDistributePopularize::getUserId, userId)
+				.select(CouponDistributePopularize::getId)
+				.last("limit 1"));
+		if (exists != null) {
+			throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
+		} else {
+			Coupon existsCoupon = couponMapper.selectOne(Wrappers.lambdaQuery(Coupon.class)
+					.eq(Coupon::getExCode, couponDistributePopularize.getExCode())
+					.eq(Coupon::getDeleted, true)
+					.select(Coupon::getId)
+					.last("limit 1"));
+			if (existsCoupon != null) {
+				throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
+			}
+		}
+		couponDistributePopularize.setExCode(code);
+		couponDistributePopularizeMapper.insert(couponDistributePopularize);
+	}
+
 	public void checkDistributorAndBusinessRate(Integer distributeGoodsRate, Long goodsId, String goodsName) {
 		UserBusinessDefaultRateConfig defaultGoodsRateConfig = defaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class)
 				.eq(UserBusinessDefaultRateConfig::getGoodsId, goodsId)

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

@@ -206,9 +206,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
-			checkCouponStatus(payRequest.getSkuId(), payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), false);
+			CouponPopularizeDto couponPopularizeDto = checkCouponStatus(payRequest.getSkuId(), payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), false);
 			//记录优惠券使用状态
-			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
+			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), couponPopularizeDto);
 		}
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
@@ -258,7 +258,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setPopularizeId(payRequest.getPopularizeId());
 		}
 		//扣除使用优惠券、余额的订单金额
-		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user);
+		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType());
 
 		orderDon.setSkuId(payRequest.getSkuId());
 		orderDon.setRelationId(relationId);
@@ -579,9 +579,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long renewSkuId = payRequest.getSkuId();
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
-			checkCouponStatus(renewSkuId, payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), true);
+			CouponPopularizeDto couponPopularizeDto = checkCouponStatus(renewSkuId, payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), true);
 			//记录优惠券使用状态
-			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
+			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), couponPopularizeDto);
 		}
 		Long relationId = payRequest.getRelationId();
 		if (relationId == null || relationId <= 0 || renewSkuId == null || payRequest.getNum() == null) {
@@ -681,7 +681,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		orderDon.setRealMoney(orderDon.getMoney());
 		//扣除使用优惠券、余额的订单金额
-		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user);
+		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType());
 		this.saveOrUpdate(orderDon);
 		//订单金额为0 且订单为已完成 更新虚物车票
 		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
@@ -1238,7 +1238,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 	}
 
-	public void checkCouponStatus(Long skuId, String couponExCode, Long couponId, Long userId, Boolean isRenew) throws Exception {
+	public CouponPopularizeDto checkCouponStatus(Long skuId, String couponExCode, Long couponId, Long userId, Boolean isRenew) throws Exception {
 		log.info("开始校验兑换码:{},优惠券id:{}状态", couponExCode, couponId);
 		//实物还是虚物商品
 		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(skuId);
@@ -1251,6 +1251,35 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			if (exists == null) {
 				throw BusinessRuntimeException.getInstance("该优惠码不存在");
 			}
+			//推广码
+			if (exists.getIsGeneral() != null) {
+				if (exists.getIsGeneral() && userId.equals(exists.getUserId())) {
+					throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+				}
+				if (!exists.getIsGeneral()) {
+					UserDistribute userDistribute = userDistributeMapper.selectById(exists.getDistributeId());
+					if (userDistribute != null && userDistribute.getUserId().equals(userId)) {
+						throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+					}
+				}
+				//是否有上下级关系
+				if (exists.getIsGeneral()) {
+					UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class)
+							.eq(UserDistributeShared::getUserId, userId).last("limit 1"));
+					if (userDistributeShared == null) {
+						//是否是 当天注册新用户 且下过单
+						User user = userMapper.selectById(userId);
+						if (user.getCreatedTime().before(DateUtil.beginOfDay(DateTime.now()))) {
+							throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+						}
+						CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
+						if (couponNewUserView != null) throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+					}
+					if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(exists.getUserId())) {
+						throw BusinessRuntimeException.getInstance("您已有推广,无法使用其他人推广码");
+					}
+				}
+			}
 			checkCouponGoods(goodsDon, skuId, exists.getCouponId(), true);
 			//检验是优惠券使用范围
 			if (isRenew && exists.getUseScope() == Coupon.UseScope.orders) {
@@ -1271,6 +1300,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			if (exists.getIsValidTime() && exists.getValidStartTime().after(DateTime.now())) {
 				throw BusinessRuntimeException.getInstance("该优惠码待生效");
 			}
+			return exists;
 		} else if (couponId != null) {
 			CouponUserView couponUserView = beanSearcher.searchFirst(CouponUserView.class, MapUtils.builder()
 					.field(CouponUserView::getCouponId, couponId).op(Operator.Equal)
@@ -1301,23 +1331,24 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 		}
+		return null;
 	}
 
-	private CouponUser couponStatusRecord(String couponExCode, Long couponId, Long userId) {
+	private CouponUser couponStatusRecord(String couponExCode, Long couponId, Long userId, CouponPopularizeDto exists) {
 		log.info("兑换码:{},优惠券id:{},更新其优惠券状态", couponExCode, couponId);
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(couponExCode)) {
-			CouponPopularizeDto exists = couponMapper.checkExCode(couponExCode);
 			if (exists == null) {
 				throw BusinessRuntimeException.getInstance("该优惠码不存在");
 			}
 			couponUser = new CouponUser();
-			couponUser.setCouponId(exists.getCouponId());
+			couponUser.setCouponId(couponId);
 			if (exists.getPopularizeId() != null) {
 				couponUser.setCouponId(exists.getPopularizeCouponId());
 				couponUser.setPopularizeId(exists.getPopularizeId());
 			}
-			if (exists.getPopularizeId() == null) {
+			//非渠道推广 推广优惠码只可使用一次
+			if ((exists.getPopularizeId() != null && exists.getIsGeneral()) || exists.getPopularizeId() == null) {
 				CouponUser received = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponUser.getCouponId()).last("limit 1"));
 				if (received != null && received.getStatus() != CouponUser.Status.unused) {
 					throw BusinessRuntimeException.getInstance("您已使用该优惠码所对应的优惠券");
@@ -1420,11 +1451,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			CouponDistributePopularize couponDistributePopularize = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class).eq(CouponDistributePopularize::getExCode, couponExCode).last("limit 1"));
 			Optional.ofNullable(couponDistributePopularize).ifPresent(popularize -> {
 				try {
-					UserDistribute userDistribute = userDistributeMapper.selectById(popularize.getDistributeId());
-					if (userDistribute == null || !userDistribute.getDeleted()) {
-						return;
+					Long sharedId;
+					//是否是普通推广专属关联
+					if (popularize.getIsGeneral()) {
+						sharedId = popularize.getUserId();
+					} else {
+						UserDistribute userDistribute = userDistributeMapper.selectById(popularize.getDistributeId());
+						if (userDistribute == null || !userDistribute.getDeleted()) {
+							return;
+						}
+						sharedId = userDistribute.getUserId();
 					}
-					Long sharedId = userDistribute.getUserId();
 					if (sharedId.equals(userId)) {
 						return;
 					}
@@ -1774,7 +1811,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	/**
 	 * 使用优惠营销 订单金额抵扣
 	 */
-	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user) {
+	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, Integer goodsType) {
 		//存在优惠券
 		if (couponUser != null) {
 			Long couponId = couponUser.getCouponId();
@@ -1785,6 +1822,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				orderDon.setMoney(discountMoney);
 				couponMoney = orderDon.getRealMoney().subtract(discountMoney);
 			} else if (coupon.getType() == Coupon.Type.reduce) {
+				if (goodsType == 2) {
+					if (skuMoney.compareTo(coupon.getReduceCondition()) < 0) {
+						throw BusinessRuntimeException.getInstance(String.format("满%s可用", coupon.getReduceCondition().divide(BigDecimal.valueOf(100))));
+					}
+				}
 				BigDecimal subtractMoney = orderDon.getMoney().subtract(coupon.getReduceMoney());
 				orderDon.setMoney(subtractMoney);
 				couponMoney = orderDon.getRealMoney().subtract(subtractMoney);

+ 38 - 2
netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java

@@ -9,13 +9,15 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponRecommendMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.model.dto.CouponPopularizeDto;
-import com.cyksj.model.entity.Coupon;
-import com.cyksj.model.entity.CouponSku;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
@@ -53,8 +55,14 @@ public class CouponFrontController {
 
 	private final CouponMapper couponMapper;
 
+	private final UserDistributeMapper userDistributeMapper;
+
 	private final CouponRecommendMapper couponRecommendMapper;
 
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
+	private final UserMapper userMapper;
+
 	/**
 	 * 优惠券领取中心列表
 	 */
@@ -240,6 +248,34 @@ public class CouponFrontController {
 		if (dto == null) {
 			throw BusinessRuntimeException.getInstance("该优惠码不存在");
 		}
+		if (dto.getIsGeneral() != null) {
+			if (dto.getIsGeneral() && userId.equals(dto.getUserId())) {
+				throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+			}
+			if (!dto.getIsGeneral()) {
+				UserDistribute userDistribute = userDistributeMapper.selectById(dto.getDistributeId());
+				if (userDistribute != null && userDistribute.getUserId().equals(userId)) {
+					throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+				}
+			}
+			//是否有上下级关系
+			if (dto.getIsGeneral()) {
+				UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class)
+						.eq(UserDistributeShared::getUserId, userId).last("limit 1"));
+				if (userDistributeShared == null) {
+					//是否是 当天注册新用户 且下过单
+					User user = userMapper.selectById(userId);
+					if (user.getCreatedTime().before(DateUtil.beginOfDay(DateTime.now()))) {
+						throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+					}
+					CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
+					if (couponNewUserView != null) throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+				}
+				if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(dto.getUserId())) {
+					throw BusinessRuntimeException.getInstance("您已有推广,无法使用其他人推广码");
+				}
+			}
+		}
 		if (dto.getScope() == Coupon.Scope.newUser) {
 			CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
 			if (couponNewUserView != null) {

+ 7 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -18,6 +18,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.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
@@ -90,6 +91,8 @@ public class DistributeController {
 
 	private final UserBenefitsService userBenefitsService;
 
+	private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -102,6 +105,10 @@ public class DistributeController {
 		Long businessId = userDistributeReq.getBusinessId();
 		//保存商务人员提成比例
 		userBusinessRateService.saveBusinessRate(businessId);
+		//清除 之前有普通推广专属码
+		couponDistributePopularizeMapper.delete(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+				.eq(CouponDistributePopularize::getUserId, userDistributeReq.getUserId())
+				.eq(CouponDistributePopularize::getIsGeneral, true));
 		return GatewayResponse.SUCCESS.newBuilder().toResult("添加成功");
 	}
 

+ 41 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -13,12 +13,15 @@ import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.SmsUtil;
+import com.cyksj.common.util.ValidatorUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
@@ -27,6 +30,7 @@ import com.cyksj.model.entity.*;
 import com.cyksj.model.request.ApplyMoneyReq;
 import com.cyksj.model.request.TransferAccountsReq;
 import com.cyksj.model.views.*;
+import com.cyksj.service.distribute.DistributeService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.user.UserService;
@@ -84,6 +88,12 @@ public class DistributePopularizeController {
 
 	private final UserBenefitsService userBenefitsService;
 
+	private final DistributeService distributeService;
+
+	private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
+
+	private final CouponMapper couponMapper;
+
 	/**
 	 * 推广订单明细
 	 */
@@ -148,9 +158,21 @@ public class DistributePopularizeController {
 					.build());
 			//最高平台比例
 			distributePopularizeView.setHighestRate(userDistributeView.getRate());
-		}else {
+		} else {
 			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getDeleted, true).eq(GoodsDon::getStatus, true).orderByDesc(GoodsDon::getRate).select(GoodsDon::getRate).last("limit 1"));
+			distributePopularizeView.setIsGeneral(true);
 			distributePopularizeView.setHighestRate(goodsDon.getRate());
+			Optional.ofNullable(couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+					.eq(CouponDistributePopularize::getUserId, userId)
+					.eq(CouponDistributePopularize::getIsGeneral, true)
+					.last("limit 1")))
+					.ifPresent(couponPopularize -> {
+						Coupon coupon = couponMapper.getCouponById(couponPopularize.getCouponId());
+						distributePopularizeView.setGeneralCode(couponPopularize.getExCode());
+						BigDecimal discount = coupon.getDiscount();
+						String discountStr = String.format("%s折", discount.multiply(BigDecimal.valueOf(100)).intValue());
+						distributePopularizeView.setGeneralDiscount(discountStr);
+					});
 		}
 		List<DistributeWaitingSendPoints> distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting).eq(DistributeWaitingSendPoints::getSharedId, userId).select(DistributeWaitingSendPoints::getPoints));
 		BigDecimal waitingPoints = BigDecimal.ZERO;
@@ -345,4 +367,22 @@ public class DistributePopularizeController {
 		distributePopularizeView.setGeneralDistributes(generalDistributes);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(distributePopularizeView);
 	}
+
+	/**
+	 * 设置普通推广码
+	 * 绑定个人专属码
+	 */
+	@PostMapping("/general/code/{code}")
+	public Result<String> setGeneralCode(@PathVariable("code") String code) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		if (StrUtil.isBlank(code)) {
+			throw BusinessRuntimeException.getInstance("专属推广优惠码不能为空");
+		}
+		if (!ValidatorUtil.isEnNum(code) || code.length() > 20) {
+			throw BusinessRuntimeException.getInstance("请输入英文数字组合的专属推广优惠码");
+		}
+		code = code.trim();
+		distributeService.bindPopularizeCode(userId, code);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("设置成功");
+	}
 }