Jelajahi Sumber

修改活动逻辑

zc 2 bulan lalu
induk
melakukan
41287aa417

+ 11 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreOperationalActivityController.java

@@ -57,6 +57,11 @@ public class StoreOperationalActivityController {
     @GetMapping("/detail")
     public R<StoreOperationalActivityDetailVo> getActivityDetail(@RequestParam("id") Integer id,
                                                                  @RequestParam("userId") Integer userId) {
+        /*
+         * 活动详情接口:
+         * 1. id 与 userId 必传,分别用于活动查询与用户报名状态判断。
+         * 2. 业务计算在服务层完成,控制器仅做参数透传与异常转换。
+         */
         log.info("StoreOperationalActivityController.getActivityDetail id={}, userId={}", id, userId);
         try {
             StoreOperationalActivityDetailVo result = operationalActivityService.getActivityDetail(id, userId);
@@ -244,6 +249,12 @@ public class StoreOperationalActivityController {
     @PostMapping("/signup/delete")
     public R<String> deleteSignup(@RequestParam("activityId") Integer activityId,
                                   @RequestParam("signupId") Integer signupId) {
+        /*
+         * 删除报名及成果接口:
+         * 1. 入参为活动ID与报名ID,必须匹配同一条报名记录。
+         * 2. 服务层校验报名是否存在且未删除。
+         * 3. 同时逻辑删除报名与关联成果记录。
+         */
         try {
             boolean result = operationalActivityService.deleteSignup(activityId, signupId);
             return result ? R.success("删除成功") : R.fail("删除失败");

+ 15 - 3
alien-store/src/main/java/shop/alien/store/service/StoreOperationalActivityService.java

@@ -15,9 +15,15 @@ import java.util.List;
 public interface StoreOperationalActivityService {
 
     /**
-     * 查询活动详情
+     * 查询活动详情。
+     * <p>
+     * 说明:
+     * 1. id 为活动主键,userId 用于判断报名相关状态。
+     * 2. 若活动不存在,返回 null。
+     * </p>
      *
      * @param id 活动ID
+     * @param userId 用户ID
      * @return 活动详情
      */
     StoreOperationalActivityDetailVo getActivityDetail(Integer id, Integer userId);
@@ -40,11 +46,17 @@ public interface StoreOperationalActivityService {
     List<StoreOperationalActivityMySignupVo> listMySignups(Integer userId);
 
     /**
-     * 删除报名及其成果
+     * 删除报名及其成果。
+     * <p>
+     * 规则:
+     * 1. 必须传入活动ID与报名ID。
+     * 2. 报名必须存在且属于该活动。
+     * 3. 删除报名信息与关联成果信息(逻辑删除)。
+     * </p>
      *
      * @param activityId 活动ID
      * @param signupId 报名ID
-     * @return 是否成功
+     * @return 是否删除成功
      */
     boolean deleteSignup(Integer activityId, Integer signupId);
 

+ 24 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -3453,8 +3453,30 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
             return new ArrayList<>();
         }
 
+        // 过滤活动:MARKETING 且报名未开始的不展示
+        Date now = new Date();
+        List<StoreOperationalActivity> filteredActivities = activities.stream()
+                .filter(activity -> {
+                    if (activity == null) {
+                        return false;
+                    }
+                    if (!"MARKETING".equals(activity.getActivityType())) {
+                        return true;
+                    }
+                    Integer status = activity.getStatus();
+                    if (status == null || (status != 2 && status != 4 && status != 5 && status != 7)) {
+                        return false;
+                    }
+                    Date signupStartTime = activity.getSignupStartTime();
+                    return signupStartTime == null || !now.before(signupStartTime);
+                })
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(filteredActivities)) {
+            return new ArrayList<>();
+        }
+
         // 获取活动ID列表
-        List<Integer> activityIds = activities.stream()
+        List<Integer> activityIds = filteredActivities.stream()
                 .map(StoreOperationalActivity::getId)
                 .collect(Collectors.toList());
 
@@ -3470,7 +3492,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         }
 
         // 活动类型映射到图片返回值
-        Map<Integer, String> activityTypeMap = activities.stream()
+        Map<Integer, String> activityTypeMap = filteredActivities.stream()
                 .collect(Collectors.toMap(StoreOperationalActivity::getId,
                         activity -> activity.getActivityType() == null ? "" : activity.getActivityType(),
                         (a, b) -> a));

+ 21 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreOperationalActivityServiceImpl.java

@@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.store.LifeDiscountCoupon;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.entity.store.StoreInfo;
@@ -50,6 +51,12 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
 
     @Override
     public StoreOperationalActivityDetailVo getActivityDetail(Integer id, Integer userId) {
+        /**
+         * 活动详情查询:
+         * 1. 校验活动ID有效性;
+         * 2. 组装详情数据(报名状态、报名人数、活动图片等);
+         * 3. 根据用户报名状态计算 detailStatus。
+         */
         log.info("StoreOperationalActivityServiceImpl.getActivityDetail: id={}, userId={}", id, userId);
         if (id == null) {
             throw new IllegalArgumentException("活动ID不能为空");
@@ -62,9 +69,12 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         StoreOperationalActivityDetailVo vo = new StoreOperationalActivityDetailVo();
         BeanUtils.copyProperties(activity, vo);
         vo.setStatusName(resolveStatusName(activity.getStatus()));
+        // 报名状态相关字段填充
         fillSignupFlags(vo, activity, userId);
+        // 报名人数统计
         fillSignupCounts(vo);
         Integer signupStatus = resolveCurrentUserSignupStatus(activity.getId(), userId);
+        // 详情按钮状态计算
         vo.setDetailStatus(resolveDetailStatus(activity, signupStatus));
 
         if (activity.getCouponId() != null) {
@@ -74,6 +84,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
             }
         }
 
+        // 店铺信息与活动图片
         attachStoreInfo(vo);
         fillActivityImages(vo);
         return vo;
@@ -136,6 +147,7 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean deleteSignup(Integer activityId, Integer signupId) {
         if (activityId == null) {
             throw new IllegalArgumentException("活动ID不能为空");
@@ -143,12 +155,21 @@ public class StoreOperationalActivityServiceImpl implements StoreOperationalActi
         if (signupId == null) {
             throw new IllegalArgumentException("报名ID不能为空");
         }
+        StoreOperationalActivitySignup signup = signupMapper.selectById(signupId);
+        if (signup == null || (signup.getDeleteFlag() != null && signup.getDeleteFlag() == 1)) {
+            throw new IllegalArgumentException("报名信息不存在或已删除");
+        }
+        if (!activityId.equals(signup.getActivityId())) {
+            throw new IllegalArgumentException("报名信息与活动不匹配");
+        }
         int deletedSignup = signupMapper.delete(new LambdaQueryWrapper<StoreOperationalActivitySignup>()
                 .eq(StoreOperationalActivitySignup::getId, signupId)
                 .eq(StoreOperationalActivitySignup::getActivityId, activityId));
         int deletedAchievement = achievementMapper.delete(new LambdaQueryWrapper<StoreOperationalActivityAchievement>()
                 .eq(StoreOperationalActivityAchievement::getSignupId, signupId)
                 .eq(StoreOperationalActivityAchievement::getActivityId, activityId));
+        log.info("deleteSignup success. activityId={}, signupId={}, deletedSignup={}, deletedAchievement={}",
+                activityId, signupId, deletedSignup, deletedAchievement);
         return deletedSignup > 0 || deletedAchievement > 0;
     }