Răsfoiți Sursa

折扣链接配置下单

zoujiajian 1 an în urmă
părinte
comite
5e87f5e21a

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

@@ -319,6 +319,11 @@ public interface Constant {
 	 */
 	List<String> NO_SIGN_CHANNEL_NAMES = List.of("百度", "巨量");
 
+	/**
+	 * 折扣推广链接key
+	 */
+	String DISCOUNT_POPULARIZE_KEY = "discount_popularize_key";
+
 	/**
 	 * 设备客服活码用户分销专用
 	 */

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonUserDiscountPopularizeRecordMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonUserDiscountPopularizeRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonUserDiscountPopularizeRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/9/20 15:16
+ */
+public interface OrderDonUserDiscountPopularizeRecordMapper extends BaseMapper<OrderDonUserDiscountPopularizeRecord> {
+	Integer selectUserPopularzieDiscountRecordByUidAndPid(@Param("userIds") List<Long> userIds, @Param("popularizeId") Long popularizeId);
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/DiscountPopularizeDto.java

@@ -0,0 +1,21 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: DiscountPopularizeDto
+ * 创建者: JavaZou
+ * 创建时间:2024/9/20 15:23
+ */
+@Getter
+@Setter
+public class DiscountPopularizeDto {
+	private List<Long> popularizeIds;
+
+	private BigDecimal discount;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -299,6 +299,11 @@ public class OrderDon extends BaseEntity implements Serializable {
     @TableField(exist = false)
     private Boolean isMirror;
 
+    @DbIgnore
+    @TableField(exist = false)
+    @JsonIgnore
+    private OrderDonUserDiscountPopularizeRecord discountPopularizeRecord;
+
     public enum Status {
         /**
          * 订单状态

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonUserDiscountPopularizeRecord.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonUserDiscountPopularizeRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/9/20 15:15
+ */
+@Getter
+@Setter
+public class OrderDonUserDiscountPopularizeRecord extends BaseEntity{
+	private Long popularizeId;
+
+	private BigDecimal discount;
+
+	private Long orderId;
+
+	private Long userId;
+
+	private String ip;
+}

+ 14 - 0
netflix-dao/src/main/resources/mapper/OrderDonUserDiscountPopularizeRecordMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.OrderDonUserDiscountPopularizeRecordMapper">
+
+
+    <select id="selectUserPopularzieDiscountRecordByUidAndPid" resultType="java.lang.Integer">
+        select count(1) from (select order_id from order_don_user_discount_popularize_record where user_id in
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        and popularize_id = #{popularizeId}) opp inner join order_don o on o.id = opp.order_id where o.status not in
+        ('close','noPayment')
+    </select>
+</mapper>

+ 52 - 9
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -327,6 +327,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserIpRecordMapper userIpRecordMapper;
 
+	private final OrderDonUserDiscountPopularizeRecordMapper orderDonUserDiscountPopularizeRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -591,6 +593,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getIsDp() && payRequest.getAddressId() != null) {
 			redisService.set(RedisService.key.PLUS_GOODS_ADDRESS_KEY.getName() + orderDon.getId(), payRequest.getAddressId(), RedisService.key.PLUS_GOODS_ADDRESS_KEY.getTimeout());
 		}
+		if (orderDon.getDiscountPopularizeRecord() != null) {
+			OrderDonUserDiscountPopularizeRecord discountPopularizeRecord = orderDon.getDiscountPopularizeRecord();
+			discountPopularizeRecord.setOrderId(orderDon.getId());
+			discountPopularizeRecord.setIp(payRequest.getIp());
+			orderDonUserDiscountPopularizeRecordMapper.insert(discountPopularizeRecord);
+		}
 		if (orderDon.getStatus() == OrderDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
 				closeOrder(orderDon.getId(), null);
@@ -2263,7 +2271,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	/**
 	 * 使用优惠营销 订单金额抵扣
 	 */
-	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, Integer goodsType, BigDecimal gcCash, List<Long> gcpIds, Boolean isAcReduce, Long subsidyId) {
+	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, Integer goodsType, BigDecimal gcCash, List<Long> gcpIds, Boolean isAcReduce, Long subsidyId) throws Exception {
 		if (gcCash != null && gcCash.compareTo(BigDecimal.ZERO) > 0 && couponUser != null) {
 			throw BusinessRuntimeException.getInstance("现金卡不能与其他优惠叠加使用");
 		}
@@ -2391,21 +2399,45 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 											orderDon.setMoney(discountMoney);
 										}
 									}
-
 								} catch (Exception e) {
 								}
 							}
 						}
+					} else {
+						SysConfig discountPopularizeConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+								.eq(SysConfig::getSysKey, Constant.DISCOUNT_POPULARIZE_KEY).last("limit 1"));
+						if (discountPopularizeConfig != null) {
+							String sysValue = discountPopularizeConfig.getSysValue();
+							if (StrUtil.isNotBlank(sysValue)) {
+								if (user == null) {
+									throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+								}
+								DiscountPopularizeDto discountPopularizeDto = Jsons.parseObject(sysValue, DiscountPopularizeDto.class);
+								List<Long> popularizeIds = discountPopularizeDto.getPopularizeIds();
+								if (CollUtil.isNotEmpty(popularizeIds) && popularizeIds.contains(orderDon.getPopularizeId())) {
+									List<Long> userIdList = userBindRelationService.getRelationUserIdList(user.getId(), user);
+									Integer count = orderDonUserDiscountPopularizeRecordMapper.selectUserPopularzieDiscountRecordByUidAndPid(userIdList, orderDon.getPopularizeId());
+									if (count == 0) {
+										log.info("用户:{}首次使用折扣特殊链接:{} 折扣:{},修改支付金额", user.getId(), orderDon.getPopularizeId(), discountPopularizeDto.getDiscount());
+										BigDecimal discountMoney = orderDon.getMoney().multiply(discountPopularizeDto.getDiscount());
+										orderDon.setMoney(discountMoney);
+
+										//记录用户使用折扣链接
+										orderDon.setDiscountPopularizeRecord(createPopularizeDiscountRecord(orderDon, discountPopularizeDto.getDiscount()));
+									}
+								}
+							}
+						}
 					}
 				} else {
 					//360
-					if (Constant.CHANNEL_NAME_360.equals(name)) {
-						SysConfig sysConfig = sysConfigService.getBaseMapper().selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.CHANNEL_360_DISCOUNT));
-						if (sysConfig != null) {
-							BigDecimal discountMoney = orderDon.getMoney().multiply(BigDecimal.valueOf(Double.valueOf(sysConfig.getSysValue())));
-							orderDon.setMoney(discountMoney);
-						}
-					}
+//					if (Constant.CHANNEL_NAME_360.equals(name)) {
+//						SysConfig sysConfig = sysConfigService.getBaseMapper().selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.CHANNEL_360_DISCOUNT));
+//						if (sysConfig != null) {
+//							BigDecimal discountMoney = orderDon.getMoney().multiply(BigDecimal.valueOf(Double.valueOf(sysConfig.getSysValue())));
+//							orderDon.setMoney(discountMoney);
+//						}
+//					}
 				}
 			}
 		}
@@ -2413,6 +2445,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		deductBalancePayOrderMoney(orderDon, balance, user);
 	}
 
+	/**
+	 * 生成用户使用折扣链接记录
+	 */
+	private OrderDonUserDiscountPopularizeRecord createPopularizeDiscountRecord(OrderDon orderDon, BigDecimal discount) {
+		OrderDonUserDiscountPopularizeRecord discountPopularizeRecord = new OrderDonUserDiscountPopularizeRecord();
+		discountPopularizeRecord.setDiscount(discount);
+		discountPopularizeRecord.setUserId(orderDon.getUserId());
+		discountPopularizeRecord.setPopularizeId(orderDon.getPopularizeId());
+		return discountPopularizeRecord;
+	}
+
 	/**
 	 * 更新车票状态
 	 */