Переглянути джерело

feat(coupon): 新增优惠券发放功能

hechunping 3 місяців тому
батько
коміт
b612bc0911

+ 22 - 0
src/main/java/com/xynet/marketing/service/factory/coupon/merc/MercCouponFactory.java

@@ -25,4 +25,26 @@ public interface MercCouponFactory {
      * @param param
      */
     void mercSend(JMap<String, Object> param);
+
+    /**
+     * 注册赠送
+     *
+     * @param param
+     */
+    void registerSend(JMap<String, Object> param);
+
+    /**
+     * 购物后赠送
+     *
+     * @param param
+     * @return
+     */
+    void orderSend(JMap<String, Object> param);
+
+    /**
+     * 自动发放
+     *
+     * @param param
+     */
+    void autoSend(JMap<String, Object> param);
 }

+ 76 - 0
src/main/java/com/xynet/marketing/service/factory/coupon/merc/impl/base/MercCouponFactoryBase.java

@@ -1,10 +1,13 @@
 package com.xynet.marketing.service.factory.coupon.merc.impl.base;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xynet.marketing.entity.MemberCoupon;
 import com.xynet.marketing.entity.MercCoupon;
+import com.xynet.marketing.enums.CouponSendTypeEnum;
 import com.xynet.marketing.enums.CouponValidTypeEnum;
 import com.xynet.marketing.mapper.MercCouponMapper;
 import com.xynet.marketing.service.MemberCouponService;
@@ -20,6 +23,7 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -93,6 +97,78 @@ public class MercCouponFactoryBase extends ServiceImpl<MercCouponMapper, MercCou
         });
     }
 
+    @Override
+    public void registerSend(JMap<String, Object> param) {
+        LocalDate today = LocalDate.now();
+        String thirdMemberId = param.getString("thirdMemberId");
+        //查找商家可赠送的优惠券
+        LambdaQueryWrapper<MercCoupon> lqw = new LambdaQueryWrapper<MercCoupon>()
+                .eq(MercCoupon::getMercId, param.getInt("mercId"))
+                .eq(MercCoupon::getStatus, true)
+                .eq(MercCoupon::getSendType, CouponSendTypeEnum.T_2.getCode())
+                .and(wrapper -> wrapper.isNull(MercCoupon::getSendStartDate)
+                        .or()
+                        .le(MercCoupon::getSendStartDate, today))
+                .and(wrapper -> wrapper.isNull(MercCoupon::getSendEndDate)
+                        .or()
+                        .ge(MercCoupon::getSendEndDate, today));
+        List<MercCoupon> list = list(lqw);
+        if (!Emptys.check(list)) {
+            throw new RuntimeException("没有可赠送的优惠券!");
+        }
+        list.forEach(mercCoupon -> {
+            //查询券是否已领取过了
+            JMap<String, Object> existParam = new JHashMap<String, Object>()
+                    .set("mercId", mercCoupon.getMercId())
+                    .set("thirdMemberId", thirdMemberId)
+                    .set("couponId", mercCoupon.getId());
+            Map<String, Object> existNewMember = memberCouponService.obj(existParam);
+            if (!Emptys.check(existNewMember)) {
+                memberCouponService.saveOrUpdate(modelSave(mercCoupon, thirdMemberId, "新注册赠送", null));
+            }
+        });
+    }
+
+    @Override
+    public void orderSend(JMap<String, Object> param) {
+        String thirdMemberId = param.getString("thirdMemberId");
+        LocalDate orderCreateTime = param.getTimestamp("orderCreateTime").toLocalDateTime().toLocalDate();
+        //查找商家可赠送的优惠券
+        LambdaQueryWrapper<MercCoupon> lqw = new LambdaQueryWrapper<MercCoupon>()
+                .eq(MercCoupon::getMercId, param.getInt("mercId"))
+                .eq(MercCoupon::getStatus, true)
+                .eq(MercCoupon::getSendType, CouponSendTypeEnum.T_3.getCode())
+                .and(wrapper -> wrapper.isNull(MercCoupon::getSendStartDate)
+                        .or()
+                        .le(MercCoupon::getSendStartDate, orderCreateTime))
+                .and(wrapper -> wrapper.isNull(MercCoupon::getSendEndDate)
+                        .or()
+                        .ge(MercCoupon::getSendEndDate, orderCreateTime));
+        List<MercCoupon> list = list(lqw);
+        if (!Emptys.check(list)) {
+            throw new RuntimeException("没有可赠送的优惠券!");
+        }
+        //TODO 判断设备条件
+        list.forEach(mercCoupon -> {
+            JSONObject sendConfig = JSONUtil.parseObj(mercCoupon.getSendConfig());
+            Float limitAmount = sendConfig.getFloat("limitAmount");
+            //判断支付金额是否 >= 优惠券最低金额
+            if (param.getInt("payMoney") >= limitAmount * 100) {
+                memberCouponService.saveOrUpdate(modelSave(mercCoupon, thirdMemberId, "购物后赠送", param.getString("orderId")));
+            }
+        });
+    }
+
+    @Override
+    public void autoSend(JMap<String, Object> param) {
+        LocalDate today = LocalDate.now();
+        //获取自动赠送的列表
+        List<String> enumByAutoSend = CouponSendTypeEnum.getEnumByAutoSend(true);
+        //TODO 没完成
+
+
+    }
+
 
     public JMap<String, Object> modelSave(MercCoupon mercCoupon, String memberId, String remark, String createOrderId) {
         LocalDate today = LocalDate.now();

+ 15 - 0
src/main/java/com/xynet/marketing/service/factory/coupon/merc/impl/v2/MercCouponFactoryV2.java

@@ -30,4 +30,19 @@ public class MercCouponFactoryV2 extends ServiceImpl<MercCouponMapper, MercCoupo
     public void mercSend(JMap<String, Object> param) {
         mercCouponFactoryBase.saveOrUpdate(param);
     }
+
+    @Override
+    public void registerSend(JMap<String, Object> param) {
+        mercCouponFactoryBase.registerSend(param);
+    }
+
+    @Override
+    public void orderSend(JMap<String, Object> param) {
+        mercCouponFactoryBase.registerSend(param);
+    }
+
+    @Override
+    public void autoSend(JMap<String, Object> param) {
+        mercCouponFactoryBase.autoSend(param);
+    }
 }