Explorar el Código

活动管理更新

liuchengsen hace 1 mes
padre
commit
5481c48157

+ 21 - 11
zhijiayun-activity/src/main/java/com/xuekairui/activity/service/ActivityInviteService.java

@@ -95,7 +95,11 @@ public class ActivityInviteService implements ActivityInviteGate {
             return;
         }
 
-        // REGISTRATION 模式 → 立即发放
+        // REGISTRATION 模式 → 校验被邀请人入驻审核通过后发放
+        if (!isInviteeLicenseApproved(inviteeId)) {
+            log.info("被邀请人入驻未审核通过,跳过发奖(等待入驻审核通过后触发): inviter={}, invitee={}", inviterId, inviteeId);
+            return;
+        }
         grantWithLimit(inviterId, inviteeId, config, "REGISTRATION");
     }
 
@@ -110,11 +114,7 @@ public class ActivityInviteService implements ActivityInviteGate {
     @Override
     public void grantRewardForApprovedUser(Long inviterId, Long inviteeId) {
         // 验证入驻状态:必须是 APPROVED 才发放奖励
-        Long approvedCount = businessLicenseMapper.selectCount(
-                new LambdaQueryWrapper<BusinessLicense>()
-                        .eq(BusinessLicense::getUserId, inviteeId)
-                        .eq(BusinessLicense::getReviewStatus, LicenseStatus.APPROVED.name()));
-        if (approvedCount == null || approvedCount == 0) {
+        if (!isInviteeLicenseApproved(inviteeId)) {
             log.warn("被邀请人入驻状态非APPROVED,跳过补填发奖: inviteeId={}", inviteeId);
             return;
         }
@@ -262,11 +262,7 @@ public class ActivityInviteService implements ActivityInviteGate {
         }
 
         // 二次验证入驻状态:必须是 APPROVED 才发放奖励
-        Long approvedCount = businessLicenseMapper.selectCount(
-                new LambdaQueryWrapper<BusinessLicense>()
-                        .eq(BusinessLicense::getUserId, userId)
-                        .eq(BusinessLicense::getReviewStatus, LicenseStatus.APPROVED.name()));
-        if (approvedCount == null || approvedCount == 0) {
+        if (!isInviteeLicenseApproved(userId)) {
             log.warn("被邀请人入驻状态非APPROVED,跳过邀请奖励: inviteeId={}", userId);
             return;
         }
@@ -405,6 +401,20 @@ public class ActivityInviteService implements ActivityInviteGate {
                 "ACTIVITY_INVITE", "邀请有礼:邀请用户" + inviteeId + "奖励" + days + "天高级会员");
     }
 
+    /**
+     * 校验被邀请人入驻信息是否审核通过。
+     *
+     * @param inviteeId 被邀请人ID
+     * @return true=已审核通过,false=未提交/审核中/审核失败
+     */
+    private boolean isInviteeLicenseApproved(Long inviteeId) {
+        Long approvedCount = businessLicenseMapper.selectCount(
+                new LambdaQueryWrapper<BusinessLicense>()
+                        .eq(BusinessLicense::getUserId, inviteeId)
+                        .eq(BusinessLicense::getReviewStatus, LicenseStatus.APPROVED.name()));
+        return approvedCount != null && approvedCount > 0;
+    }
+
     private boolean isActive(ActivityInviteConfig config) {
         return config.getEnabled() != null && config.getEnabled() == 1 && inWindow(config);
     }

+ 3 - 18
zhijiayun-invite/src/main/java/com/xuekairui/invite/service/InviteService.java

@@ -641,10 +641,7 @@ public class InviteService {
             userMapper.updateById(invitee);
         }
 
-        // 9. 委托活动模块根据 rewardTrigger 配置决定是否发放奖励
-        if (activityInviteGate != null) {
-            activityInviteGate.grantInviteReward(inviterId, inviteeId);
-        }
+        // 9. 绑定时不发放任何权益,奖励统一由被邀请人入驻审核通过后触发
     }
 
     /**
@@ -755,22 +752,10 @@ public class InviteService {
         user.setInviterId(inviterId);
         userMapper.updateById(user);
 
-        // 10. 根据活动配置决定是否发奖
-        com.xuekairui.user.entity.BusinessLicense license = businessLicenseService.getByUserId(userId);
-        if (license != null && LicenseStatus.APPROVED.name().equals(license.getReviewStatus())) {
-            // 已入驻 → 发奖(依赖活动开关)
-            if (activityInviteGate != null) {
-                activityInviteGate.grantRewardForApprovedUser(inviterId, userId);
-            } else {
-                log.warn("活动模块未加载,无法发放已入驻用户补填奖励: inviter={}, invitee={}", inviterId, userId);
-            }
-        } else if (activityInviteGate != null) {
-            // 未入驻 → 委托活动模块根据 rewardTrigger 配置决定
-            activityInviteGate.grantInviteReward(inviterId, userId);
-        }
+        // 10. 绑定时不发放任何权益,奖励统一由被邀请人入驻审核通过后触发
 
         log.info("补填邀请码成功: invitee={}, inviter={}", userId, inviterId);
-        return "补填邀请码成功!邀请人获赠1个月会员时长";
+        return "补填邀请码成功!";
     }
 
     // ==========================================

+ 24 - 0
zhijiayun-test/src/main/resources/static/activity-test.html

@@ -646,6 +646,30 @@ const FIELD_DESC = {
         ['data[].chanceId', 'Long', '抽奖机会ID'],
         ['data[].createTime', 'DateTime', '抽奖时间']
     ],
+    'activityAvailable': [
+        ['data.activities[].activityType', 'String', '活动类型:INVITE/CHECKIN/LOTTERY'],
+        ['data.activities[].activityName', 'String', '活动名称'],
+        ['data.activities[].description', 'String', '活动描述'],
+        ['data.activities[].enabled', 'Boolean', '活动是否启用'],
+        ['data.activities[].inWindow', 'Boolean', '是否在活动时间窗内'],
+        ['data.activities[].startTime', 'DateTime', '活动开始时间'],
+        ['data.activities[].endTime', 'DateTime', '活动结束时间'],
+        ['data.activities[].rewardedCount', 'Long', '已获奖励次数'],
+        ['data.activities[].maxRewardCount', 'Integer', '最多可获奖励次数'],
+        ['data.activities[].remainingCount', 'Long', '剩余可获奖励次数'],
+        ['data.activities[].cycleStart', 'Date', '当前周期起始日(CHECKIN)'],
+        ['data.activities[].cycleEnd', 'Date', '当前周期截止日(CHECKIN)'],
+        ['data.activities[].checkinCount', 'Integer', '当前周期已签到天数(CHECKIN)'],
+        ['data.activities[].requiredDays', 'Integer', '周期需达签到天数(CHECKIN)'],
+        ['data.activities[].reachedTarget', 'Boolean', '当前周期是否已达标(CHECKIN)'],
+        ['data.activities[].rewardDays', 'Integer', '达标可获会员天数(CHECKIN)'],
+        ['data.activities[].eligible', 'Boolean', '是否满足参与资格(LOTTERY)'],
+        ['data.activities[].membershipLevel', 'String', '当前会员等级(LOTTERY)'],
+        ['data.activities[].requireMembershipLevel', 'String', '所需会员等级(LOTTERY)'],
+        ['data.activities[].availableChances', 'Integer', '今日可用抽奖机会(LOTTERY)'],
+        ['data.activities[].usedChances', 'Integer', '今日已用抽奖机会(LOTTERY)'],
+        ['data.activities[].reason', 'String/null', '状态原因说明(LOTTERY,机会为0时返回原因)']
+    ],
     'activityRewards': [
         ['data.records[].id', 'Long', '记录ID'],
         ['data.records[].userId', 'Long', '用户ID'],