zoujiajian 3 vuotta sitten
vanhempi
sitoutus
0dd5b5c934

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

@@ -34,6 +34,8 @@ public class CouponPopularizeDto {
 
 	private Coupon.Scope scope;
 
+	private Long distributeId;
+
 	/**
 	 * 优惠券推广者关联id
 	 */
@@ -44,6 +46,8 @@ public class CouponPopularizeDto {
 	 */
 	private Boolean isGeneral;
 
+	private Long userId;
+
 	/**
 	 * 优惠券推广者关联优惠券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")

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

@@ -6,6 +6,8 @@
     <select id="checkExCode" resultType="com.cyksj.model.dto.CouponPopularizeDto">
         select cp.id         as couponId,
                cdp.id        as popularizeId,
+               cdp.user_id,
+               dp.distribute_id,
                cp.goods_sku_ids,
                cp.type,
                cp.use_scope,
@@ -21,7 +23,7 @@
                cp.valid_end_time,
                cp.is_valid_time
         from `coupon` cp
-                 left join (select id, coupon_id, ex_code, is_general
+                 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

+ 46 - 11
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,18 +1331,18 @@ 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());
@@ -1781,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();
@@ -1792,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) {