Просмотр исходного кода

优惠券使用,状态更新等

skyline 1 год назад
Родитель
Сommit
49d2e8cb00

+ 4 - 2
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -66,7 +66,9 @@ public class ChargerController {
      */
     @SneakyThrows
     @GetMapping("/listStation")
-    R<?> listChargeStation(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+    R<?> listChargeStation(
+            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
         // 请求en+接口
         List<StationVo> response = stationService.queryStationInfo(pageNum, pageSize);
         return R.success(response);
@@ -94,7 +96,7 @@ public class ChargerController {
     @GetMapping("/startCharge/{connectorId}")
     R<?> startCharge(@PathVariable("connectorId") String connectorId,
                      @RequestParam(value = "rechargeRightsId", required = false) Long userRechargeRightsId,
-                     @RequestParam(value = "rechargeRightsId", required = false) Long userCouponId,
+                     @RequestParam(value = "userCouponId", required = false) Long userCouponId,
                      @RequestParam(value = "isBooking", defaultValue = "false") Boolean isBooking,
                      @RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
                      @RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {

+ 12 - 3
service/src/main/java/com/kym/service/admin/impl/CouponServiceImpl.java

@@ -19,7 +19,6 @@ import com.kym.entity.miniapp.UserCoupon;
 import com.kym.mapper.admin.CouponMapper;
 import com.kym.service.admin.ActivityService;
 import com.kym.service.admin.CouponService;
-import com.kym.service.miniapp.UserCouponService;
 import com.kym.service.miniapp.UserService;
 import com.kym.service.mq.producer.UserCouponSender;
 import org.springframework.context.annotation.Lazy;
@@ -75,7 +74,13 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
 
         // 校验优惠券领取方式
         if (coupons.stream().anyMatch(coupon -> coupon.getReceiveType().equals(Coupon.RECEIVE_TYPE_主动领取))) {
-            throw new BusinessException("包含限主动领取的优惠券");
+            throw new BusinessException("包含限自主领取的优惠券");
+        }
+
+        // 校验发放数量是否不大于券剩余数量(数量=0代表不限量)
+        var flag = coupons.stream().findAny().filter(coupon -> coupon.getQuantity() > 0 && userCouponsIssue.getUserIds().size() > (coupon.getQuantity() - coupon.getClaimedQuantity()));
+        if (flag.isPresent()) {
+            throw new BusinessException("优惠券剩余数量不足,优惠券名称:%s,剩余:%d,发放数量:%d".formatted(flag.get().getName(), flag.get().getQuantity() - flag.get().getClaimedQuantity(), userCouponsIssue.getUserIds().size()));
         }
 
         List<User> users = new ArrayList<>();
@@ -86,9 +91,13 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
         }
 
         var activityList = activityService.listByIds(coupons.stream().map(Coupon::getActivityId).toList());
+
+        // 更新优惠券发放数量
+        lambdaUpdate().setSql("claimed_quantity = claimed_quantity + %d".formatted(users.size()))
+                .in(Coupon::getId, coupons.stream().map(Coupon::getId).toList()).update();
+
         users.forEach(user -> {
             for (Coupon coupon : coupons) {
-//                CommUtil.asserts(coupon.getStatus()==Coupon.STATUS_有效, String.format("优惠券[%s]已失效",coupon.getName()));
                 var userCoupon = new UserCoupon();
                 userCoupon.setActivityId(coupon.getActivityId());
                 userCoupon.setActivityName(Objects.requireNonNull(activityList.stream().filter(activity -> activity.getId().equals(coupon.getActivityId())).findFirst().orElse(null)).getName());

+ 5 - 2
service/src/main/java/com/kym/service/factory/DiscountStrategyFactory.java

@@ -1,6 +1,7 @@
 package com.kym.service.factory;
 
 import com.kym.entity.admin.Activity;
+import com.kym.service.admin.CouponService;
 import com.kym.service.miniapp.*;
 import com.kym.service.miniapp.impl.CouponDiscountHandle;
 import com.kym.service.miniapp.impl.NoDiscountHandle;
@@ -20,17 +21,19 @@ public class DiscountStrategyFactory {
 
     private static OrderCouponService orderCouponService;
     private static UserCouponService userCouponService;
+    private static CouponService couponService;
 
-    public DiscountStrategyFactory(OrderRechargeRightsService orderRechargeRightsService, UserRechargeRightsService userRechargeRightsService, OrderCouponService orderCouponService, UserCouponService userCouponService) {
+    public DiscountStrategyFactory(OrderRechargeRightsService orderRechargeRightsService, UserRechargeRightsService userRechargeRightsService, OrderCouponService orderCouponService, UserCouponService userCouponService, CouponService couponService) {
         this.orderRechargeRightsService = orderRechargeRightsService;
         this.userRechargeRightsService = userRechargeRightsService;
         this.orderCouponService = orderCouponService;
         this.userCouponService = userCouponService;
+        this.couponService = couponService;
     }
 
     public static DiscountService getDiscountStrategy(String discountType) {
         if (Activity.DISCOUNT_TYPE_优惠券.equals(discountType)) {
-            return new CouponDiscountHandle(orderCouponService, userCouponService);
+            return new CouponDiscountHandle(orderCouponService, userCouponService, couponService);
         } else if (Activity.DISCOUNT_TYPE_服务费折扣权益.equals(discountType)) {
             return new RechargeRightsDiscountHandle(orderRechargeRightsService, userRechargeRightsService);
         } else {

+ 11 - 1
service/src/main/java/com/kym/service/miniapp/impl/CouponDiscountHandle.java

@@ -1,10 +1,12 @@
 package com.kym.service.miniapp.impl;
 
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.kym.entity.admin.Coupon;
 import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.entity.miniapp.OrderCoupon;
 import com.kym.entity.miniapp.UserCoupon;
+import com.kym.service.admin.CouponService;
 import com.kym.service.miniapp.DiscountService;
 import com.kym.service.miniapp.OrderCouponService;
 import com.kym.service.miniapp.UserCouponService;
@@ -23,9 +25,12 @@ public class CouponDiscountHandle implements DiscountService {
     private final OrderCouponService orderCouponService;
     private final UserCouponService userCouponService;
 
-    public CouponDiscountHandle(OrderCouponService orderCouponService, UserCouponService userCouponService) {
+    private final CouponService couponService;
+
+    public CouponDiscountHandle(OrderCouponService orderCouponService, UserCouponService userCouponService, CouponService couponService) {
         this.orderCouponService = orderCouponService;
         this.userCouponService = userCouponService;
+        this.couponService = couponService;
     }
 
 
@@ -80,6 +85,11 @@ public class CouponDiscountHandle implements DiscountService {
                         .eq(OrderCoupon::getUserCouponId, userCoupon.getId())
                         .update();
 
+                // 优惠券使用情况数据
+                // 手动切换数据源
+                DynamicDataSourceContextHolder.push("db-admin");
+                couponService.lambdaUpdate().setSql("usage_count = usage_count + 1").eq(Coupon::getId, userCoupon.getCouponId()).update();
+                DynamicDataSourceContextHolder.poll();
             } else {
                 log.error("订单使用优惠券失败:订单号:{},优惠券id{}:服务费未达到优惠券使用门槛", chargeOrder.getStartChargeSeq(), userCoupon.getCouponId());
             }

+ 13 - 4
service/src/main/java/com/kym/service/miniapp/impl/UserCouponServiceImpl.java

@@ -19,7 +19,6 @@ import com.kym.service.admin.ActivityService;
 import com.kym.service.admin.CouponService;
 import com.kym.service.miniapp.UserCouponService;
 import com.kym.service.miniapp.UserService;
-import com.kym.service.mq.producer.UserCouponSender;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
@@ -47,14 +46,13 @@ public class UserCouponServiceImpl extends MPJBaseServiceImpl<UserCouponMapper,
 
     private final CouponService couponService;
 
-    private final UserCouponSender userCouponSender;
 
-    public UserCouponServiceImpl(RedisTemplate<String, String> redisTemplate, ActivityService activityService, UserService userService, CouponService couponService, UserCouponSender userCouponSender) {
+    public UserCouponServiceImpl(RedisTemplate<String, String> redisTemplate, ActivityService activityService,
+                                 UserService userService, CouponService couponService) {
         this.redisTemplate = redisTemplate;
         this.activityService = activityService;
         this.userService = userService;
         this.couponService = couponService;
-        this.userCouponSender = userCouponSender;
     }
 
     @Override
@@ -114,6 +112,16 @@ public class UserCouponServiceImpl extends MPJBaseServiceImpl<UserCouponMapper,
 
         // 活动
         var activity = activityService.getById(coupon.getActivityId());
+
+        // 更新优惠券已领取数量
+        coupon.setClaimedQuantity(coupon.getClaimedQuantity() + 1);
+
+        // 校验优惠券数量是否已领完
+        if(coupon.getClaimedQuantity() >= coupon.getQuantity()){
+            coupon.setStatus(Coupon.STATUS_已结束);
+        }
+        couponService.updateById(coupon);
+
         DynamicDataSourceContextHolder.poll();
 
         // 存入缓存和数据库
@@ -136,6 +144,7 @@ public class UserCouponServiceImpl extends MPJBaseServiceImpl<UserCouponMapper,
 //        userCouponSender.sendMessage(userCoupon);
         save(userCoupon);
 
+
         // todo 优惠券活动终止时处理redis数据,优惠券失效或者使用之后该做什么操作?
     }