Bladeren bron

优惠券渠道关联

zoujiajian 1 jaar geleden
bovenliggende
commit
ee411d6f13

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -534,4 +534,9 @@ public interface Constant {
 	 * 提现黑名单
 	 */
 	String APPLY_MONEY_BLACK = "apply_money_black";
+
+	/**
+	 * 渠道用户关联优惠券设置key
+	 */
+	String COUPON_DISTRIBUTE_RELATE_COUPON_KEY = "coupon_distribute_relate_coupon_key";
 }

+ 57 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponClassificationCascadeView.java

@@ -0,0 +1,57 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponClassificationCascadeView
+ * 创建者: JavaZou
+ * 创建时间:2025/4/7 15:17
+ */
+@Getter
+@Setter
+@SearchBean(tables = "coupon c inner join coupon_classification cc on cc.id = c.classification_id",
+		where = "c.deleted is true")
+public class CouponClassificationCascadeView {
+
+	@DbField("c.id")
+	private Long id;
+
+	@DbField("c.name")
+	private String name;
+
+	@DbField("c.is_valid_time")
+	private Boolean isValidTime;
+
+	@DbField("c.valid_start_time")
+	private Date validStartTime;
+
+	@DbField("c.valid_end_time")
+	private Date validEndTime;
+
+	@DbField("cc.name")
+	private String category;
+
+	@DbIgnore
+	private String label;
+
+	@DbIgnore
+	private String value;
+
+	private List<CouponChild> children;
+
+	@Getter
+	@Setter
+	public static class CouponChild{
+		private String label;
+
+		private Long value;
+	}
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponDistributePopularizeDetailView.java

@@ -5,6 +5,8 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+
 /**
  * 项目名: yhlxj
  * 文件名: CouponDistributePopularizeDetailView
@@ -47,4 +49,13 @@ public class CouponDistributePopularizeDetailView {
 	 */
 	@DbField("cp.ex_code")
 	private String exCode;
+
+	@DbField("c.is_valid_time")
+	private Boolean isValidTime;
+
+	@DbField("c.valid_start_time")
+	private Date validStartTime;
+
+	@DbField("c.valid_end_time")
+	private Date validEndTime;
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/cps/CpsManageService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.cps;
 
 import cn.hutool.core.date.DateTime;
+import com.cyksj.model.entity.CouponDistributePopularize;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.views.BrokenLineCpsUserWMoneyView;
 import com.cyksj.model.views.CpsUserWMoneyStatisticsDataView;
@@ -27,4 +28,6 @@ public interface CpsManageService {
 	List<CpsUserWMoneyStatisticsDataView> getWMoneyStatisticsDataView(Long cpsUserId, DateTime first, DateTime end);
 
 	BrokenLineCpsUserWMoneyView getWMoneyStatisticsDate(Long cpsUserId, DateTime first, DateTime end);
+
+	void setCouponCode(long cpsUserId, List<CouponDistributePopularize> couponRelates) throws Exception;
 }

+ 86 - 1
netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsManageServiceImpl.java

@@ -1,15 +1,23 @@
 package com.cyksj.service.cps.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.SmsUtil;
 import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
-import com.cyksj.model.entity.User;
+import com.cyksj.mapper.sys.SysConfigMapper;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.views.BrokenLineCpsUserWMoneyView;
 import com.cyksj.model.views.CpsUserWMoneyStatisticsDataView;
 import com.cyksj.redis.RedisService;
@@ -18,6 +26,7 @@ import com.cyksj.service.mail.MailService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -40,6 +49,12 @@ public class CpsManageServiceImpl implements CpsManageService {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final SysConfigMapper sysConfigMapper;
+
+	private final CouponMapper couponMapper;
+
+	private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
+
 	@Override
 	public void getLoginCode(Integer type, String login, Integer cid) {
 		if (type > 2) {
@@ -125,6 +140,76 @@ public class CpsManageServiceImpl implements CpsManageService {
 		return waitingSendPointsMapper.getWMoneyStatisticsDate(cpsUserId, first, end, today);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void setCouponCode(long cpsUserId, List<CouponDistributePopularize> couponRelates) throws Exception {
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.COUPON_DISTRIBUTE_RELATE_COUPON_KEY)
+				.last("limit 1"));
+		List<Long> show_coupon_ids = null;
+		if (sysConfig != null && StrUtil.isNotBlank(sysConfig.getSysValue())) {
+			show_coupon_ids = Jsons.parseList(sysConfig.getSysValue(), Long.class);
+		}
+		if (CollUtil.isEmpty(show_coupon_ids)) {
+			throw BusinessRuntimeException.getInstance("设置优惠码异常");
+		}
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, cpsUserId)
+				.eq(UserDistribute::getDeleted, true)
+				.last("limit 1"));
+		//处理优惠券关联
+		handlerDistributeCouponRelate(userDistribute.getId(), userDistribute.getUserId(), couponRelates,show_coupon_ids);
+	}
+
+	private void handlerDistributeCouponRelate(Long distributeId, Long userId, List<CouponDistributePopularize> couponRelates, List<Long> show_coupon_ids) {
+		couponRelates.forEach(data -> {
+			data.setDistributeId(distributeId);
+			if (data.getCouponId() == null) {
+				throw BusinessRuntimeException.getInstance("存在错误的优惠券,请刷新页面重试");
+			}
+			if (!show_coupon_ids.contains(data.getCouponId())) {
+				throw BusinessRuntimeException.getInstance("存在错误的优惠券,请刷新页面重试");
+			}
+			Integer exists = couponMapper.selectCount(Wrappers.lambdaQuery(Coupon.class).eq(Coupon::getId, data.getCouponId()).eq(Coupon::getDeleted, 1));
+			if (exists == 0) {
+				throw BusinessRuntimeException.getInstance("存在错误的优惠券,请刷新页面重试");
+			}
+			String exCode = data.getExCode();
+			if (StrUtil.isEmpty(exCode)) {
+				throw BusinessRuntimeException.getInstance("优惠码为空");
+			}
+			List<CouponDistributePopularize> popularizeList = couponDistributePopularizeMapper.selectList(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+					.eq(CouponDistributePopularize::getDeleted, 1)
+					.eq(CouponDistributePopularize::getExCode, exCode));
+			//个人渠道
+			for (CouponDistributePopularize couponDistributePopularize : popularizeList) {
+				Long disId = couponDistributePopularize.getDistributeId();
+				if (disId != null && !ObjectUtil.equal(disId, distributeId)) {
+					throw BusinessRuntimeException.getInstance("优惠码:{0}已存在", exCode);
+				}
+				Long uid = couponDistributePopularize.getUserId();
+				if (uid != null && !ObjectUtil.equal(uid, userId)) {
+					throw BusinessRuntimeException.getInstance("优惠码:{0}已存在", exCode);
+				}
+			}
+			Integer count = couponMapper.selectCount(Wrappers.lambdaQuery(Coupon.class).eq(Coupon::getExCode, exCode).eq(Coupon::getDeleted, true));
+			if (count > 0) {
+				throw BusinessRuntimeException.getInstance("优惠码:{0}已存在", exCode);
+			}
+			if (data.getId() != null) {
+//				couponDistributePopularizeMapper.updateById(data);
+			} else {
+				Long couponId = data.getCouponId();
+				Integer selectCount = couponDistributePopularizeMapper.selectCount(Wrappers.lambdaQuery(CouponDistributePopularize.class)
+						.eq(CouponDistributePopularize::getDistributeId, distributeId)
+						.eq(CouponDistributePopularize::getCouponId, couponId)
+						.eq(CouponDistributePopularize::getDeleted, true));
+				if (selectCount == 0) {
+					couponDistributePopularizeMapper.insert(data);
+				}
+			}
+		});
+	}
+
 	public boolean isToday(DateTime first, DateTime end) {
 		boolean today = false;
 		if (first != null && end != null) {

+ 55 - 3
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java

@@ -1,13 +1,17 @@
 package com.cyksj.web.controller.cps;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.*;
 import com.cyksj.service.cps.CpsManageService;
@@ -18,13 +22,12 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -52,6 +55,8 @@ public class CpsDistribtueDataController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final SysConfigMapper sysConfigMapper;
+
 	/**
 	 * 个人分销平台数据详情
 	 */
@@ -219,4 +224,51 @@ public class CpsDistribtueDataController {
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineObjView);
 	}
+
+	/**
+	 * 渠道推广优惠码列表
+	 */
+	@GetMapping("/get/coupon/code/list")
+	public Result<List<CouponDistributePopularizeDetailView>> getCouponCodeList() throws Exception {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, cpsUserId)
+				.eq(UserDistribute::getDeleted, true)
+				.last("limit 1"));
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.COUPON_DISTRIBUTE_RELATE_COUPON_KEY)
+				.last("limit 1"));
+		List<Long> show_coupon_ids = null;
+		if (sysConfig != null && StrUtil.isNotBlank(sysConfig.getSysValue())) {
+			show_coupon_ids = Jsons.parseList(sysConfig.getSysValue(), Long.class);
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (CollUtil.isEmpty(show_coupon_ids)) {
+			show_coupon_ids = List.of(0l);
+		}
+		builder.field(CouponDistributePopularizeDetailView::getCouponId, show_coupon_ids).op(Operator.InList);
+		DateTime now = DateTime.now();
+		List<CouponDistributePopularizeDetailView> couponDistributePopularizeDetailViews = beanSearcher.searchAll(CouponDistributePopularizeDetailView.class, builder.field(CouponDistributePopularizeDetailView::getDistributeId, userDistribute.getId()).build());
+		couponDistributePopularizeDetailViews = couponDistributePopularizeDetailViews.stream().filter(c -> {
+			if (c.getIsValidTime() && c.getValidStartTime() != null) {
+				Date validStartTime = c.getValidStartTime();
+				Date validEndTime = c.getValidEndTime();
+				if (validStartTime.compareTo(now) <= 0 && validEndTime.compareTo(now) >= 0) {
+					return true;
+				}
+				return false;
+			}
+			return true;
+		}).collect(Collectors.toList());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(couponDistributePopularizeDetailViews);
+	}
+
+	/**
+	 * 设置渠道 推广优惠码
+	 */
+	@PostMapping("/set/coupon/code")
+	public Result<String> setCouponCode(@RequestBody List<CouponDistributePopularize> couponRelates) throws Exception {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		cpsManageService.setCouponCode(cpsUserId, couponRelates);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 42 - 4
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java

@@ -1,11 +1,15 @@
 package com.cyksj.web.controller.cps;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
 import cn.hutool.extra.qrcode.QrConfig;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.DistributePopularizeClickRecordMapper;
@@ -14,11 +18,9 @@ import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.UserDistributePosterRecordMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.views.CpsGoodsDonDistributeView;
-import com.cyksj.model.views.DistributePosterGoodsCpsView;
-import com.cyksj.model.views.UserDistributePopularizeView;
-import com.cyksj.model.views.UserDistributePosterOrderDetailView;
+import com.cyksj.model.views.*;
 import com.cyksj.service.cps.CpsPopularizeService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
@@ -34,8 +36,10 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -83,6 +87,8 @@ public class CpsPopularizeController {
 
 	private final BusinessDistributeDefaultSkuRateConfigMapper businessDistributeDefaultSkuRateConfigMapper;
 
+	private final SysConfigMapper sysConfigMapper;
+
 	/**
 	 * 渠道推广链接列表
 	 */
@@ -428,4 +434,36 @@ public class CpsPopularizeController {
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 可绑定优惠券列表
+	 */
+	@GetMapping("/get/available/coupon")
+	public Result<List<CouponView>> getAvailableCoupon() throws Exception {
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.COUPON_DISTRIBUTE_RELATE_COUPON_KEY)
+				.last("limit 1"));
+		List<Long> show_coupon_ids = null;
+		if (sysConfig != null && StrUtil.isNotBlank(sysConfig.getSysValue())) {
+			show_coupon_ids = Jsons.parseList(sysConfig.getSysValue(), Long.class);
+		}
+		if (CollUtil.isEmpty(show_coupon_ids)) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		List<CouponView> couponViews = beanSearcher.searchAll(CouponView.class, MapUtils.flatBuilder(request.getParameterMap()).field(CouponView::getCouponId, show_coupon_ids).op(Operator.InList).onlySelect(CouponView::getCouponId, CouponView::getName, CouponView::getIsValidTime, CouponView::getValidStartTime, CouponView::getValidEndTime).build());
+		DateTime now = DateTime.now();
+		couponViews = couponViews.stream().filter(c -> {
+			if (c.getIsValidTime() && c.getValidStartTime() != null) {
+				Date validStartTime = c.getValidStartTime();
+				Date validEndTime = c.getValidEndTime();
+				if (validStartTime.compareTo(now) <= 0 && validEndTime.compareTo(now) >= 0) {
+					return true;
+				}
+				return false;
+			}
+			c.setValidStartTime(null);
+			c.setValidEndTime(null);
+			return true;
+		}).collect(Collectors.toList());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(couponViews);
+	}
 }

+ 40 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java

@@ -40,9 +40,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.Min;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /*
@@ -547,4 +545,43 @@ public class CouponController {
 		BigDecimal money = Optional.ofNullable(orderDonMapper.getCouponUsedMoney(couponId)).orElse(BigDecimal.ZERO);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(money.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
 	}
+
+	/**
+	 * 优惠券级联列表
+	 */
+	@GetMapping("/get/cascade")
+	public Result<List<CouponClassificationCascadeView>> getCouponClassificationCascade() {
+		List<CouponClassificationCascadeView> couponClassificationCascadeViews = beanSearcher.searchAll(CouponClassificationCascadeView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+
+		List<CouponClassificationCascadeView> views = new ArrayList<>();
+		DateTime now = DateTime.now();
+		couponClassificationCascadeViews.stream().filter(c -> {
+			if (c.getIsValidTime() && c.getValidStartTime() != null) {
+				Date validStartTime = c.getValidStartTime();
+				Date validEndTime = c.getValidEndTime();
+				if (validStartTime.compareTo(now) <= 0 && validEndTime.compareTo(now) >= 0) {
+					return true;
+				}
+				return false;
+			}
+			return true;
+		}).collect(Collectors.groupingBy(CouponClassificationCascadeView::getCategory)).forEach((category, coupons) -> {
+			CouponClassificationCascadeView couponClassificationCascadeView = new CouponClassificationCascadeView();
+			couponClassificationCascadeView.setLabel(category);
+			couponClassificationCascadeView.setValue(category);
+			List<CouponClassificationCascadeView.CouponChild> couponChildren = coupons.stream()
+					.map(view -> convertToCouponChild(view))
+					.collect(Collectors.toList());
+			couponClassificationCascadeView.setChildren(couponChildren);
+			views.add(couponClassificationCascadeView);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
+	}
+
+	private CouponClassificationCascadeView.CouponChild convertToCouponChild(CouponClassificationCascadeView view) {
+		CouponClassificationCascadeView.CouponChild couponChild = new CouponClassificationCascadeView.CouponChild();
+		couponChild.setLabel(view.getName());
+		couponChild.setValue(view.getId());
+		return couponChild;
+	}
 }