Kaynağa Gözat

fix 可用优惠卷;续费时使用校验

zoujiajian 3 yıl önce
ebeveyn
işleme
10616346fd

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java

@@ -14,7 +14,7 @@ import java.util.List;
  *创建时间:2022/11/18 11:43
  */
 public interface CouponUserMapper extends BaseMapper<CouponUser> {
-	List<CouponUserView> getAvailableCouponList(@Param("skuId") Long skuId, @Param("userId") Long userId);
+	List<CouponUserView> getAvailableCouponList(@Param("skuId") Long skuId, @Param("userId") Long userId, @Param("isRenew") Boolean isRenew);
 
-	Integer countAvailableCouponList(@Param("skuId") Long skuId, @Param("userId") Long userId);
+	Integer countAvailableCouponList(@Param("skuId") Long skuId, @Param("userId") Long userId, @Param("isRenew") Boolean isRenew);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CouponPopularizeDto.java

@@ -22,6 +22,8 @@ public class CouponPopularizeDto {
 
 	private Coupon.Type type;
 
+	private Boolean isRenew;
+
 	/**
 	 * 优惠卷推广者关联id
 	 */

+ 1 - 0
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -8,6 +8,7 @@
                cdp.id as popularizeId,
                cp.goods_sku_ids,
                cp.type,
+               cp.is_renew,
                cdp.coupon_id as popularizeCouponId
         from `coupon` cp
                  left join `coupon_distribute_popularize` cdp on cdp.coupon_id = cp.id

+ 18 - 12
netflix-dao/src/main/resources/mapper/CouponUserMapper.xml

@@ -8,7 +8,7 @@
                         cp.name,
                         cp.goods_type,
                         cp.type,
-                        cp.sku_ids,
+                        cp.goods_sku_ids,
                         cp.discount,
                         cp.reduce_money,
                         cp.is_valid_time,
@@ -16,24 +16,30 @@
                         cp.valid_end_time,
                         cp.valid_days,
                         cu.created_time,
+                        cp.is_renew,
+                        cu.status as couponUserStatus,
                         if(ck.id is null, 0, 1) as 'isAvailable'
         from `coupon_user` cu
-                 left join `coupon` cp on cp.id = cu.coupon_id
-                 left join `coupon_sku` ck on ck.coupon_id = cp.id
-        where ck.id = #{skuId}
-          and cu.user_id = #{userId}
-          and cu.status = 'unused'
-        group by cu.id, cp.name, cp.goods_type, cp.type, cp.sku_ids, cp.discount, cp.reduce_money, cp.is_valid_time,
-                 cp.valid_start_time, cp.valid_end_time, cp.valid_days, cu.created_time
+        left join `coupon` cp on cp.id = cu.coupon_id
+        left join `coupon_sku` ck on ck.coupon_id = cp.id
+        and ck.sku_id = #{skuId}
+        <if test="isRenew != null">
+            and cp.is_renew = #{isRenew}
+        </if>
+        and cu.status != 'used'
+        where cu.user_id = #{userId}
         order by isAvailable desc
     </select>
 
     <select id="countAvailableCouponList" resultType="java.lang.Integer">
         select count(distinct cu.id)
         from `coupon_user` cu
-                 left join `coupon` cp on cp.id = cu.coupon_id
-                 left join `coupon_sku` ck on ck.coupon_id = cp.id
-        where ck.id = #{skuId} and cu.user_id = #{userId}
-          and cu.status = 'unused'
+        left join `coupon` cp on cp.id = cu.coupon_id
+        left join `coupon_sku` ck on ck.coupon_id = cp.id
+        where ck.sku_id = #{skuId} and cu.user_id = #{userId}
+        and cu.status = 'unused'
+        <if test="isRenew != null">
+            and cp.is_renew = #{isRenew}
+        </if>
     </select>
 </mapper>

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/coupon/CouponFontService.java

@@ -37,7 +37,7 @@ public interface CouponFontService {
 	/**
 	 * 可用/不可用优惠卷
 	 */
-	List<CouponUserView> getAvailableCouponList(Long skuId, Long userId);
+	List<CouponUserView> getAvailableCouponList(Long skuId, Long userId, Boolean isRenew);
 
 	/**
 	 * 优惠卷状态

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -147,9 +147,9 @@ public class CouponFontServiceImpl implements CouponFontService {
 	}
 
 	@Override
-	public List<CouponUserView> getAvailableCouponList(Long skuId, Long userId) {
+	public List<CouponUserView> getAvailableCouponList(Long skuId, Long userId, Boolean isRenew) {
 		DateTime now = DateTime.now();
-		List<CouponUserView> availableCouponList = couponUserMapper.getAvailableCouponList(skuId, userId);
+		List<CouponUserView> availableCouponList = couponUserMapper.getAvailableCouponList(skuId, userId, isRenew);
 		Optional.ofNullable(availableCouponList).ifPresent(list->{
 			list.stream().forEach(data->{
 				if (!data.getIsValidTime()) {

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -45,7 +45,7 @@ public interface OrderDonService extends IService<OrderDon> {
      */
     void closeOrder(Long orderId);
 
-    OrderDon renewal(OrderPayRequest request);
+    OrderDon renewal(OrderPayRequest request) throws Exception;
 
     OrderDonView getDetail(Long orderId, long userId);
 

+ 35 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -135,7 +135,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
-			checkCouponStatus(payRequest.getSkuId(), payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
+			checkCouponStatus(payRequest.getSkuId(), payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), false);
 			//记录优惠卷使用状态
 			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
 		}
@@ -457,9 +457,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	}
 
 	@Override
-	public OrderDon renewal(OrderPayRequest payRequest) {
+	public OrderDon renewal(OrderPayRequest payRequest) throws Exception {
 		User user = userMapper.selectById(payRequest.getUserId());
-
+		CouponUser couponUser = null;
+		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
+			checkCouponStatus(payRequest.getSkuId(), payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), true);
+			//记录优惠卷使用状态
+			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
+		}
 		Long relationId = payRequest.getRelationId();
 		if (relationId == null || relationId <= 0 || payRequest.getSkuId() == null || payRequest.getNum() == null) {
 			throw new BusinessRuntimeException("缺少必填参数");
@@ -504,6 +509,24 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setStatus(OrderDon.Status.noPayment);
 		orderDon.setUserId(user.getId());
 		orderDon.setGoodsId(goodsDon.getId());
+		orderDon.setRealMoney(payRequest.getDonMoney());
+		//存在优惠卷
+		if (couponUser != null) {
+			Long couponId = couponUser.getCouponId();
+			Coupon coupon = couponMapper.selectById(couponId);
+			BigDecimal couponMoney = null;
+			if (coupon.getType() == Coupon.Type.discount) {
+				BigDecimal discountMoney = payRequest.getDonMoney().multiply(coupon.getDiscount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
+				orderDon.setMoney(discountMoney);
+				couponMoney = payRequest.getDonMoney().subtract(discountMoney);
+			} else if (coupon.getType() == Coupon.Type.reduce) {
+				BigDecimal subtractMoney = payRequest.getDonMoney().subtract(coupon.getReduceMoney());
+				orderDon.setMoney(subtractMoney);
+				couponMoney = payRequest.getDonMoney().subtract(subtractMoney);
+			}
+			orderDon.setCouponMoney(couponMoney);
+			orderDon.setCouponUserId(couponUser.getId());
+		}
 		this.saveOrUpdate(orderDon);
 
 		jobManager.addJob(EXPIRY_TIME, () -> {
@@ -987,7 +1010,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		});
 	}
 
-	public void checkCouponStatus(Long skuId, String couponExCode, Long couponId, Long userId) throws Exception {
+	public void checkCouponStatus(Long skuId, String couponExCode, Long couponId, Long userId, Boolean isRenew) throws Exception {
 		log.info("开始校验兑换码:{},优惠卷id:{}状态", couponExCode, couponId);
 		//实物还是虚物商品
 		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(skuId);
@@ -1001,7 +1024,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				throw BusinessRuntimeException.getInstance("该优惠码不存在");
 			}
 			checkCouponGoods(goodsDon, skuId, exists.getType(), exists.getGoodsSkuIds());
-
+			//检验是否续费可使用
+			if (isRenew && !exists.getIsRenew()) {
+				throw BusinessRuntimeException.getInstance("该优惠卷续费时不可使用");
+			}
 		} else if (couponId != null) {
 			CouponUserView couponUserView = beanSearcher.searchFirst(CouponUserView.class, MapUtils.builder()
 					.field(CouponUserView::getCouponId, couponId).op(Operator.Equal)
@@ -1022,6 +1048,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				throw BusinessRuntimeException.getInstance("该优惠卷不可使用");
 			}
 			checkCouponGoods(goodsDon, skuId, couponUserView.getType(), couponUserView.getGoodsSkuIds());
+			//检验是否续费可使用
+			if (isRenew && !couponUserView.getIsRenew()) {
+				throw BusinessRuntimeException.getInstance("该优惠卷续费时不可使用");
+			}
 		}
 	}
 

+ 5 - 7
netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java

@@ -88,14 +88,12 @@ public class CouponFrontController {
 	 * 可用优惠卷
 	 */
 	@GetMapping("/available/list")
-	public Result<SearchResult<CouponUserView>> availableCouponList(Long skuId) {
+	public Result<SearchResult<CouponUserView>> availableCouponList(Long skuId, Boolean isRenew) {
+		StpUserUtil.login(8116l);
 		Long userId = StpUserUtil.getLoginIdAsLong();
-		Integer count = couponUserMapper.countAvailableCouponList(skuId, userId);
-		SearchResult<CouponUserView> couponUserViews = new SearchResult<>();
-		if (count != 0) {
-			List<CouponUserView> couponActiveViewList = couponFontService.getAvailableCouponList(skuId, userId);
-			couponUserViews = new SearchResult<>(couponActiveViewList);
-		}
+		Integer count = couponUserMapper.countAvailableCouponList(skuId, userId, isRenew);
+		List<CouponUserView> couponActiveViewList = couponFontService.getAvailableCouponList(skuId, userId, isRenew);
+		SearchResult<CouponUserView> couponUserViews = new SearchResult<>(couponActiveViewList);
 		couponUserViews.setTotalCount(count);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponUserViews);
 	}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -62,7 +62,7 @@ public class GroupRelationController {
     }
 
     @PostMapping("/post/renewal")
-    public Result<OrderDon> renewal(@RequestBody OrderPayRequest request) {
+    public Result<OrderDon> renewal(@RequestBody OrderPayRequest request) throws Exception {
         long userId = StpUserUtil.getLoginIdAsLong();
         request.setUserId(userId);