|
@@ -1,7 +1,10 @@
|
|
|
package com.chelvc.cloud.vehicle.server.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.chelvc.cloud.vehicle.api.constant.CouponClaimType;
|
|
|
+import com.chelvc.cloud.vehicle.api.constant.PromotionStatus;
|
|
|
import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
|
|
|
import com.chelvc.cloud.vehicle.api.dto.UserCouponDTO;
|
|
|
import com.chelvc.cloud.vehicle.api.param.UserCouponModifyParam;
|
|
@@ -9,9 +12,12 @@ import com.chelvc.cloud.vehicle.api.param.UserCouponPagingParam;
|
|
|
import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
|
|
|
import com.chelvc.cloud.vehicle.server.copier.UserCouponCopier;
|
|
|
import com.chelvc.cloud.vehicle.server.dao.UserCouponMapper;
|
|
|
+import com.chelvc.cloud.vehicle.server.entity.Coupon;
|
|
|
import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
|
|
|
+import com.chelvc.cloud.vehicle.server.service.CouponService;
|
|
|
import com.chelvc.cloud.vehicle.server.service.UserCouponService;
|
|
|
import com.chelvc.framework.base.context.SessionContextHolder;
|
|
|
+import com.chelvc.framework.base.exception.ResourceUnavailableException;
|
|
|
import com.chelvc.framework.base.util.ResourceUtils;
|
|
|
import com.chelvc.framework.common.model.Pagination;
|
|
|
import com.chelvc.framework.database.util.PagingUtils;
|
|
@@ -37,6 +43,8 @@ import java.util.stream.Collectors;
|
|
|
public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService,
|
|
|
com.chelvc.cloud.vehicle.api.service.UserCouponService {
|
|
|
|
|
|
+ private final CouponService couponService;
|
|
|
+
|
|
|
@Override
|
|
|
public List<UserCouponDTO> listUserCoupons(@NonNull UserCouponQueryParam param) {
|
|
|
Long userId = SessionContextHolder.getId();
|
|
@@ -99,6 +107,45 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
|
|
|
return PagingUtils.convert(page, userCoupons);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Long claimCoupon(@NonNull Long couponId) {
|
|
|
+ Coupon coupon = ResourceUtils.required(couponService.getById(couponId), "优惠券不存在");
|
|
|
+ if (CouponClaimType.FREE.equals(coupon.getClaimType())) {
|
|
|
+ throw new ResourceUnavailableException("当前优惠券不允许免费领取");
|
|
|
+ }
|
|
|
+ Long userId = SessionContextHolder.getId();
|
|
|
+ // 检查该用户可领取的优惠券的数量
|
|
|
+ this.checkCouponLimit(coupon, userId);
|
|
|
+ // 保存优惠券领取记录
|
|
|
+ UserCoupon userCoupon = UserCoupon.builder().userId(userId).couponId(couponId)
|
|
|
+ .type(coupon.getType()).used(false).build();
|
|
|
+ this.save(userCoupon);
|
|
|
+ // 修改优惠券的领取数量
|
|
|
+ couponService.updateCouponReceivedNum(couponId, 1);
|
|
|
+ return userCoupon.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查该用户可领取的优惠券的数量
|
|
|
+ *
|
|
|
+ * @param coupon 要领取的优惠券
|
|
|
+ * @param userId 用户ID
|
|
|
+ */
|
|
|
+ public void checkCouponLimit(Coupon coupon, Long userId) {
|
|
|
+ Integer haveCoupons = this.lambdaQuery()
|
|
|
+ .eq(UserCoupon::getUserId, userId)
|
|
|
+ .eq(UserCoupon::getCouponId, coupon.getId()).count();
|
|
|
+ if (!PromotionStatus.START.name().equals(coupon.getPromotionStatus())) {
|
|
|
+ throw new ResourceUnavailableException("当前优惠券已经被领取完了,下次要早点来哦");
|
|
|
+ }
|
|
|
+ if (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum()) {
|
|
|
+ throw new ResourceUnavailableException("优惠券剩余领取数量不足");
|
|
|
+ }
|
|
|
+ if (!coupon.getLimitNum().equals(0) && haveCoupons >= coupon.getLimitNum()) {
|
|
|
+ throw new ResourceUnavailableException("超出领取限制,此优惠券最多领取" + coupon.getLimitNum() + "张");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 转换优惠券领取记录信息
|
|
|
*
|