|
|
@@ -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);
|