浏览代码

feat: 订单抵扣优惠卷

wrj 1 年之前
父节点
当前提交
b4e326cf6c

+ 28 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/enums/DiscountTypeEnum.java

@@ -0,0 +1,28 @@
+package com.ylx.massage.enums;
+
+/**
+ * @author 优惠类型,1:无门槛, 2:折扣, 3:满减
+ * @date 2024-05-15 10:33
+ */
+public enum DiscountTypeEnum {
+
+    NO_THRESHOLD(1, "无门槛"),
+    DISCOUNT(2, "折扣"),
+    FULL_DISCOUNT(3, "满减");
+
+    private final Integer code;
+    private final String info;
+
+    DiscountTypeEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/CouponReceiveService.java

@@ -22,5 +22,7 @@ public interface CouponReceiveService extends IService<CouponReceive> {
 
 
     List<CouponReceiveVo> getByOpenId(String openid);
+
+    void removeCoupons(List<CouponReceiveVo> coupons);
 }
 

+ 18 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CouponReceiveServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ylx.massage.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.massage.domain.Coupon;
 import com.ylx.massage.domain.vo.CouponReceiveVo;
@@ -10,10 +11,12 @@ import com.ylx.massage.service.CouponReceiveService;
 import com.ylx.massage.service.CouponService;
 import com.ylx.massage.utils.DateTimeUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 优惠券领取表(CouponReceive)表服务实现类
@@ -40,7 +43,7 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         queryWrapper.eq(CouponReceive::getOpenid, couponReceive.getOpenid()).eq(CouponReceive::getCouponId, couponReceive.getCouponId());
         //限制没人只能领x张
         List<CouponReceive> one = this.list(queryWrapper);
-        if (coupon.getUserLimit() >= one.size()) {
+        if (coupon.getUserLimit() <= one.size()) {
             return null;
         }
         couponReceive.setExpirationTime(DateTimeUtils.addDays(new Date(), coupon.getTermDays()));
@@ -53,5 +56,19 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         return couponReceiveMapper.getByOpenId(openid);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeCoupons(List<CouponReceiveVo> coupons) {
+
+        boolean b = this.removeByIds(coupons.stream().map(CouponReceiveVo::getId).collect(Collectors.toList()));
+        //使用数量+1
+        coupons.forEach(coup -> {
+            UpdateWrapper<Coupon> wrapper = new UpdateWrapper<>();
+            wrapper.lambda().eq(Coupon::getId, coup.getCouponId());
+            wrapper.setSql(" used_num = used_num + " + 1);
+            couponService.update(wrapper);
+        });
+    }
+
 }
 

+ 20 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -13,7 +13,9 @@ import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.core.domain.R;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.massage.domain.*;
+import com.ylx.massage.domain.vo.CouponReceiveVo;
 import com.ylx.massage.enums.BillTypeEnum;
+import com.ylx.massage.enums.DiscountTypeEnum;
 import com.ylx.massage.enums.JsStatusEnum;
 import com.ylx.massage.enums.OrderStatusEnum;
 import com.ylx.massage.mapper.TOrderMapper;
@@ -30,6 +32,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -101,6 +104,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
      * @param order
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public TOrder addOrder(TOrder order) {
 
         if (StringUtils.isBlank(order.getcJsId())) {
@@ -118,14 +122,16 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             }
         }
         //优惠卷减免
-        couponReceiveService.getByOpenId(order.getcOpenId());
+        List<CouponReceiveVo> coupons = couponReceiveService.getByOpenId(order.getcOpenId());
+        BigDecimal preferential = this.setCoupon(coupons);
+        order.setPreferential(preferential);
 
         //订单价格
         List<TXiangmu> list = JSONObject.parseArray(order.getcGoods().toJSONString(), TXiangmu.class);
         BigDecimal sum = list.stream().map(TXiangmu::getSum).reduce(BigDecimal.ZERO, BigDecimal::add);
         order.setdTotalMoney(sum);
-        //总价
-        order.setTotalPrice(sum.add(Optional.ofNullable(order.getFare()).orElse(BigDecimal.ZERO)));
+        //总价 = 订单 + 车费 - 优惠
+        order.setTotalPrice(sum.add(Optional.ofNullable(order.getFare()).orElse(BigDecimal.ZERO)).subtract(preferential));
         if (order.getOrderType() == 2) {
             //升级订单 补差价
             TOrder partOrder = this.getByNo(order.getParentNo());
@@ -145,9 +151,20 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         order.setOrderNo(generator.generateNextOrderNumber(OrderNumberGenerator.KEY_PREFIX_ORDER));
         order.setnStatus(OrderStatusEnum.WAIT_PAY.getCode());
         order.setDtCreateTime(LocalDateTime.now());
+
         save(order);
         return order;
     }
+    private BigDecimal setCoupon(List<CouponReceiveVo> coupons) {
+        //过滤过期的优惠券
+        coupons = coupons.stream().filter(coupon -> coupon.getExpirationTime().after(new Date())).collect(Collectors.toList());
+        //无门槛优惠券
+        List<CouponReceiveVo> collect = coupons.stream().filter(coupon -> coupon.getDiscountType().equals(DiscountTypeEnum.NO_THRESHOLD.getCode())).collect(Collectors.toList());
+        //删除优惠卷
+        couponReceiveService.removeCoupons(collect);
+        //计算优惠金额
+        return collect.stream().map(CouponReceiveVo::getDiscountValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
 
 
     @Override