Jelajahi Sumber

feat(coupon): 商家发放优惠券功能

- 在 MercCouponFactory 接口中添加 mercSend 方法,用于商家发放优惠券
- 在 MercCouponFactoryBase 基类中实现 mercSend 方法的逻辑- 在 MercCouponFactoryV2 实现类中添加 mercSend 方法的实现
- 优化 saveOrUpdate 方法,支持批量保存商品和设备
hechunping 4 bulan lalu
induk
melakukan
4d1d0fdbe4

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

@@ -18,4 +18,11 @@ public interface MercCouponFactory {
      * @return
      */
     Integer saveOrUpdate(JMap<String, Object> param);
+
+    /**
+     * 商家发放优惠券
+     *
+     * @param param
+     */
+    void mercSend(JMap<String, Object> param);
 }

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

@@ -1,18 +1,27 @@
 package com.xynet.marketing.service.factory.coupon.merc.impl.base;
 
 import cn.hutool.core.bean.BeanUtil;
+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.CouponValidTypeEnum;
 import com.xynet.marketing.mapper.MercCouponMapper;
+import com.xynet.marketing.service.MemberCouponService;
 import com.xynet.marketing.service.MercProjectDeviceService;
 import com.xynet.marketing.service.MercProjectGoodsService;
 import com.xynet.marketing.service.factory.coupon.merc.MercCouponFactory;
 import com.xynet.marketing.utils.Emptys;
+import com.xynet.marketing.utils.collections.map.JHashMap;
 import com.xynet.marketing.utils.collections.map.JMap;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Objects;
+
 /**
  * 优惠券工厂-基类
  *
@@ -28,6 +37,8 @@ public class MercCouponFactoryBase extends ServiceImpl<MercCouponMapper, MercCou
 
     private MercProjectDeviceService deviceService;
 
+    private MemberCouponService memberCouponService;
+
     @Override
     public Integer saveOrUpdate(JMap<String, Object> param) {
         MercCoupon save = BeanUtil.copyProperties(param, MercCoupon.class);
@@ -49,14 +60,61 @@ public class MercCouponFactoryBase extends ServiceImpl<MercCouponMapper, MercCou
         //保存商品
         if (!save.getIsAllGoods()) {
             //删除原来的商品
-            goodsService.saveBatchByActId(save.getId(), "coupon", param.getList("goodsList"));
+            goodsService.saveBatchByActId(save.getId(), "coupon", param.getListMap("goodsList"));
         }
         //保存设备
         if (!save.getIsAllDevice()) {
-            deviceService.saveBatchByActId(save.getId(), "coupon", param.getList("deviceList"));
+            deviceService.saveBatchByActId(save.getId(), "coupon", param.getListMap("deviceList"));
         }
 
         return save.getId();
+    }
+
+    @Override
+    public void mercSend(JMap<String, Object> param) {
+        List<Object> thirdMemberIdList = param.getList("thirdMemberIdList");
+        if (!Emptys.check(thirdMemberIdList)) {
+            throw new RuntimeException("会员列表不能为空!");
+        }
+        LambdaQueryWrapper<MercCoupon> lqw = new LambdaQueryWrapper<MercCoupon>()
+                .eq(MercCoupon::getMercId, param.getInt("mercId"))
+                .in(MercCoupon::getId, param.getList("couponIdList"));
+        List<MercCoupon> couponList = list(lqw);
+        if (!Emptys.check(couponList)) {
+            throw new RuntimeException("没有可以赠送的优惠券!");
+        }
+        if (thirdMemberIdList.size() > 20) {
+            throw new RuntimeException("一次最多赠送20个用户!");
+        }
+        couponList.forEach(coupon -> {
+            thirdMemberIdList.forEach(memberId -> {
+                memberCouponService.saveOrUpdate(modelSave(coupon, memberId.toString(), param.getString("remark"), null));
+            });
+        });
+    }
+
 
+    public JMap<String, Object> modelSave(MercCoupon mercCoupon, String memberId, String remark, String createOrderId) {
+        LocalDate today = LocalDate.now();
+        //有效时间
+        boolean isDays = Objects.equals(mercCoupon.getValidType(), CouponValidTypeEnum.T_1.getCode());
+        LocalDate validStartDate = isDays ? today : mercCoupon.getValidStartDate();
+        LocalDate validEndDate = isDays ? today.plusDays(mercCoupon.getValidDay() - 1) : mercCoupon.getValidEndDate();
+        MemberCoupon memberCoupon = new MemberCoupon()
+                .setMercId(mercCoupon.getMercId())
+                .setThirdMemberId(memberId)
+                .setCouponId(mercCoupon.getId())
+                .setCouponName(mercCoupon.getName())
+                .setIsAllDevice(mercCoupon.getIsAllDevice())
+                .setIsAllGoods(mercCoupon.getIsAllGoods())
+                .setValidStartDate(validStartDate)
+                .setValidEndDate(validEndDate)
+                .setUseMinPrice(mercCoupon.getUseMinPrice())
+                .setType(mercCoupon.getType())
+                .setPrice(mercCoupon.getPrice())
+                .setCreateDate(today)
+                .setCreateOrderId(createOrderId)
+                .setRemark(remark);
+        return new JHashMap<>(BeanUtil.beanToMap(memberCoupon));
     }
 }

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

@@ -25,4 +25,9 @@ public class MercCouponFactoryV2 extends ServiceImpl<MercCouponMapper, MercCoupo
     public Integer saveOrUpdate(JMap<String, Object> param) {
         return mercCouponFactoryBase.saveOrUpdate(param);
     }
+
+    @Override
+    public void mercSend(JMap<String, Object> param) {
+        mercCouponFactoryBase.saveOrUpdate(param);
+    }
 }