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

+ 31 - 14
admin/src/main/java/com/kym/admin/jobs/ActivityDelayJob.java

@@ -2,24 +2,18 @@ package com.kym.admin.jobs;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.kym.common.utils.CommUtil;
-import com.kym.entity.admin.Activity;
-import com.kym.entity.admin.ActivityStation;
-import com.kym.entity.admin.Banner;
-import com.kym.entity.admin.RechargeRights;
+import com.kym.entity.admin.*;
 import com.kym.entity.admin.delay.DelayActivity;
-import com.kym.service.admin.ActivityService;
-import com.kym.service.admin.ActivityStationService;
-import com.kym.service.admin.BannerService;
-import com.kym.service.admin.RechargeRightsService;
+import com.kym.service.admin.*;
 import com.kym.service.jobs.DelayService;
 import com.kym.service.jobs.DelayedItem;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
-import org.springframework.context.annotation.Scope;
 import java.util.concurrent.DelayQueue;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -43,16 +37,19 @@ public class ActivityDelayJob implements DelayService<DelayActivity> {
     private final ActivityService activityService;
     private final ActivityStationService activityStationService;
     private final RechargeRightsService rechargeRightsService;
+
+    private final CouponService couponService;
     private final BannerService bannerService;
     /**
      * 线程池
      */
     private final ExecutorService executor = Executors.newFixedThreadPool(1);
 
-    public ActivityDelayJob(ActivityService activityService, ActivityStationService activityStationService, RechargeRightsService rechargeRightsService, BannerService bannerService) {
+    public ActivityDelayJob(ActivityService activityService, ActivityStationService activityStationService, RechargeRightsService rechargeRightsService, CouponService couponService, BannerService bannerService) {
         this.activityService = activityService;
         this.activityStationService = activityStationService;
         this.rechargeRightsService = rechargeRightsService;
+        this.couponService = couponService;
         this.bannerService = bannerService;
     }
 
@@ -68,6 +65,7 @@ public class ActivityDelayJob implements DelayService<DelayActivity> {
                         .setId(act.getId())
                         .setName(act.getName())
                         .setExecuteTime(act.getStartTime())
+                        .setDiscountType(act.getDiscountType())
                         .setType(DelayActivity.TYPE_启动))
                 .toList();
 
@@ -76,6 +74,7 @@ public class ActivityDelayJob implements DelayService<DelayActivity> {
                         .setId(act.getId())
                         .setName(act.getName())
                         .setExecuteTime(act.getEndTime())
+                        .setDiscountType(act.getDiscountType())
                         .setType(DelayActivity.TYPE_结束))
                 .toList();
 
@@ -99,8 +98,17 @@ public class ActivityDelayJob implements DelayService<DelayActivity> {
                         activityService.lambdaUpdate().set(Activity::getStatus, Activity.STATUS_进行中).eq(Activity::getId, delayActivity.getId()).update();
                         // 修改活动站点关联表状态为进行中
                         activityStationService.lambdaUpdate().set(ActivityStation::getStatus, Activity.STATUS_进行中).eq(ActivityStation::getActivityId, delayActivity.getId()).update();
-                        // 修改充值权益为进行中
-                        rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, RechargeRights.STATUS_进行中).eq(RechargeRights::getActivityId, delayActivity.getId()).update();
+
+                        // 判断活动优惠类型,分别处理活动启动逻辑
+                        if (delayActivity.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益)) {
+                            // 修改充值权益为进行中
+                            rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, RechargeRights.STATUS_进行中).eq(RechargeRights::getActivityId, delayActivity.getId()).update();
+                        }
+                        if (delayActivity.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券)) {
+                            // 修改优惠券状态为进行中
+                            couponService.lambdaUpdate().set(Coupon::getStatus, Coupon.STATUS_进行中).eq(Coupon::getActivityId, delayActivity.getId()).update();
+                        }
+
                         // 修改banner状态为有效
                         bannerService.lambdaUpdate().set(Banner::getStatus, Banner.STATUS_有效).eq(Banner::getActivityId, delayActivity.getId()).update();
                         log.info("活动id:{},活动名:{}启动中...", delayActivity.getId(), delayActivity.getName());
@@ -111,8 +119,17 @@ public class ActivityDelayJob implements DelayService<DelayActivity> {
                         activityService.lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, delayActivity.getId()).update();
                         // 修改活动站点关联表状态为已结束
                         activityStationService.lambdaUpdate().set(ActivityStation::getStatus, Activity.STATUS_已结束).eq(ActivityStation::getActivityId, delayActivity.getId()).update();
-                        // 修改充值权益为进行中
-                        rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, RechargeRights.STATUS_已结束).eq(RechargeRights::getActivityId, delayActivity.getId()).update();
+
+                        // 判断活动优惠类型,分别处理活动结束逻辑
+                        if (delayActivity.getDiscountType().equals(Activity.DISCOUNT_TYPE_服务费折扣权益)) {
+                            // 修改充值权益为已结束
+                            rechargeRightsService.lambdaUpdate().set(RechargeRights::getStatus, RechargeRights.STATUS_已结束).eq(RechargeRights::getActivityId, delayActivity.getId()).update();
+                        }
+                        if (delayActivity.getDiscountType().equals(Activity.DISCOUNT_TYPE_优惠券)) {
+                            // 修改优惠券状态为已结束
+                            couponService.lambdaUpdate().set(Coupon::getStatus, Coupon.STATUS_已结束).eq(Coupon::getActivityId, delayActivity.getId()).update();
+                        }
+
                         // 修改banner状态为失效
                         bannerService.lambdaUpdate().set(Banner::getStatus, Banner.STATUS_无效).eq(Banner::getActivityId, delayActivity.getId()).update();
                         log.info("活动id:{},活动名:{}已结束...", delayActivity.getId(), delayActivity.getName());

+ 7 - 0
entity/src/main/java/com/kym/entity/admin/delay/DelayActivity.java

@@ -44,4 +44,11 @@ public class DelayActivity implements Serializable {
      */
     private String type;
 
+    /**
+     * 折扣类型:
+     * 充值权益:RechargeRights
+     * 优惠券:Coupon
+     */
+    private String discountType = "RechargeRights";
+
 }

+ 8 - 5
service/src/main/java/com/kym/service/admin/impl/ActivityServiceImpl.java

@@ -112,9 +112,8 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
         }
 
         // 加入活动延迟启停队列
-        // todo 优惠券活动延迟启停改造
-        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getStartTime(), DelayActivity.TYPE_启动));
-        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getEndTime(), DelayActivity.TYPE_结束));
+        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getStartTime(), DelayActivity.TYPE_启动, activity.getDiscountType()));
+        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getEndTime(), DelayActivity.TYPE_结束, activity.getDiscountType()));
     }
 
 
@@ -199,13 +198,17 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
                     if (userCoupons != null) {
                         couponList.forEach(coupon -> {
                             // 筛选出活动相关的数据
-                            var coupon2user = userCoupons.stream().filter(userCoupon -> userCoupon.startsWith(String.valueOf(coupon.getId())));
-                            redisTemplate.opsForSet().remove(RedisKeys.COUPON_ID_TO_USERS, coupon2user.toArray());
+                            var coupon2user = userCoupons.stream().filter(userCoupon -> userCoupon.startsWith(String.valueOf(coupon.getId()))).toArray();
+                            if (coupon2user.length > 0) {
+                                redisTemplate.opsForSet().remove(RedisKeys.COUPON_ID_TO_USERS, coupon2user);
+                            }
                         });
                     }
 
                 }
             }
+            // 修改活动状态
+            lambdaUpdate().set(Activity::getStatus, Activity.STATUS_已结束).eq(Activity::getId, activityId).update();
         }
 
     }

+ 27 - 27
service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java

@@ -266,35 +266,35 @@ public class EnNotifyServiceImpl implements EnNotifyService {
         var account = accountService.getAccountByUserId(chargeOrder.getUserId());
 
         // EN+平台推送重试策略是当天失败第二天再推送一次,仅此一次。EN+订单页面可以多次手动推送,所以这里要先判断订单状态,避免重复处理。
-//        if (chargeOrder.getChargeStatus() != ChargeOrder.CHARGE_STATUS_已结束 || chargeOrder.getOrderStatus() != ChargeOrder.ORDER_STATUS_成功) {
-        // 更新订单信息
-        chargeOrder
-                .setStartTime(LocalDateTime.parse(data.getString("StartTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
-                .setEndTime(LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
-                .setTotalPower(data.getDoubleValue("TotalPower"))
-                .setElecMoney((int) Math.round(data.getDouble("TotalElecMoney") * 100))
-                .setServiceMoney((int) Math.round(data.getDoubleValue("TotalSeviceMoney") * 100)) // 这里文档service单词错误,按文档填写
-                .setTotalMoney((int) Math.round(data.getDoubleValue("TotalMoney") * 100))
-                .setStopReason(data.getIntValue("StopReason"))
-                .setSumPeriod(data.getIntValue("SumPeriod"))
-                .setChargeDetail(data.getString("ChargeDetails"))
-                // 实付金额初始化为订单总金额
-                .setPayAmount(chargeOrder.getTotalMoney());
-
-        // 结束时间
-        var endTime = LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-
-        // 处理充值权益优惠逻辑/优惠券优惠逻辑
-        // 优惠金额
-        DiscountStrategyFactory.getDiscountStrategy(chargeOrder.getDiscountType()).computeDiscount(chargeOrder, account);
-
-        // 更新订单优惠金额
-        chargeOrderService.updateById(chargeOrder);
+        if (chargeOrder.getChargeStatus() != ChargeOrder.CHARGE_STATUS_已结束 || chargeOrder.getOrderStatus() != ChargeOrder.ORDER_STATUS_成功) {
+            // 更新订单信息
+            chargeOrder
+                    .setStartTime(LocalDateTime.parse(data.getString("StartTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
+                    .setEndTime(LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
+                    .setTotalPower(data.getDoubleValue("TotalPower"))
+                    .setElecMoney((int) Math.round(data.getDouble("TotalElecMoney") * 100))
+                    .setServiceMoney((int) Math.round(data.getDoubleValue("TotalSeviceMoney") * 100)) // 这里文档service单词错误,按文档填写
+                    .setTotalMoney((int) Math.round(data.getDoubleValue("TotalMoney") * 100))
+                    .setStopReason(data.getIntValue("StopReason"))
+                    .setSumPeriod(data.getIntValue("SumPeriod"))
+                    .setChargeDetail(data.getString("ChargeDetails"))
+                    // 实付金额初始化为订单总金额
+                    .setPayAmount(chargeOrder.getTotalMoney());
+
+            // 结束时间
+            var endTime = LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+            // 处理充值权益优惠逻辑/优惠券优惠逻辑
+            // 优惠金额
+            DiscountStrategyFactory.getDiscountStrategy(chargeOrder.getDiscountType()).computeDiscount(chargeOrder, account);
+
+            // 更新订单优惠金额
+            chargeOrderService.updateById(chargeOrder);
 
-        // 扣费等资金操作
-        deductions(chargeOrder, account, endTime);
+            // 扣费等资金操作
+            deductions(chargeOrder, account, endTime);
+        }
 
-//        }
         return """
                 {
                     "StartChargeSeq":"%s",

+ 31 - 21
service/src/main/java/com/kym/service/miniapp/impl/CouponDiscountHandle.java

@@ -48,30 +48,40 @@ public class CouponDiscountHandle implements DiscountService {
                     .one();
 
             // 检查是否达到使用门槛
-            if (chargeOrder.getServiceMoney() < userCoupon.getMinServiceMoney()) {
-                log.info("订单:{}优惠券{}使用失败:服务费未达到优惠券使用门槛", chargeOrder.getStartChargeSeq(), userCoupon.getCouponId());
-            }
+            if (chargeOrder.getServiceMoney() > userCoupon.getMinServiceMoney()) {
+                // 根据优惠券类型处理
+                switch (userCoupon.getCouponType()) {
+                    case Coupon.COUPON_TYPE_满减券:
+                        discountAmount = chargeOrder.getServiceMoney() - userCoupon.getDiscount();
+                        break;
+                    case Coupon.COUPON_TYPE_折扣券:
+                        discountAmount = chargeOrder.getServiceMoney() * (100 - userCoupon.getDiscount());
+                        break;
+                    default:
+                        break;
+                }
 
-            // 根据优惠券类型处理
-            switch (userCoupon.getCouponType()) {
-                case Coupon.COUPON_TYPE_满减券:
-                    discountAmount = chargeOrder.getServiceMoney() - userCoupon.getDiscount();
-                    break;
-                case Coupon.COUPON_TYPE_折扣券:
-                    discountAmount = chargeOrder.getServiceMoney() * (100 - userCoupon.getDiscount());
-                    break;
-                default:
-                    // 其他类型券
-                    break;
-            }
+                // 订单优惠金额更新
+                chargeOrder.setDiscountAmount(discountAmount);
+                chargeOrder.setServiceMoneyDiscount(discountAmount);
 
-            // 订单优惠金额更新
-            chargeOrder.setDiscountAmount(discountAmount);
-            chargeOrder.setServiceMoneyDiscount(discountAmount);
+                // 更新用户优惠券信息
+                userCouponService.lambdaUpdate()
+                        .set(UserCoupon::getStatus, UserCoupon.STATUS_无效)
+                        .set(UserCoupon::getUsageStatus, UserCoupon.USAGE_STATUS_已使用)
+                        .eq(UserCoupon::getId, userCoupon.getId())
+                        .update();
 
-            // 更新用户优惠券信息
-            userCoupon.setDiscount(discountAmount);
-            userCouponService.updateById(userCoupon);
+                // 更新订单优惠券关联信息
+                orderCouponService.lambdaUpdate()
+                        .set(OrderCoupon::getDiscountAmount, discountAmount)
+                        .eq(OrderCoupon::getStartChargeSeq, chargeOrder.getStartChargeSeq())
+                        .eq(OrderCoupon::getUserCouponId, userCoupon.getId())
+                        .update();
+
+            } else {
+                log.error("订单使用失败:订单号:{},优惠券id{}:服务费未达到优惠券使用门槛", chargeOrder.getStartChargeSeq(), userCoupon.getCouponId());
+            }
         } catch (Exception e) {
             log.error("处理优惠券失败", e);
             // 可以添加一些错误处理逻辑,比如重试机制、发送告警等