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

fix(onboarding): 注册/绑定推荐人不再发放CF值,新增首次报告上传任务(300 CF)

Sisyphus Agent 5 дней назад
Родитель
Сommit
f7e019f80a

+ 12 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -11270,6 +11270,18 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
         log.info("迁移342: octopus_key_person.referrer_id 列已添加");
         ensureColumn("octopus_key_person", "system_user_id", "BIGINT DEFAULT NULL COMMENT '匹配到的系统用户ID(如有)'");
         log.info("迁移342: octopus_key_person.system_user_id 列已添加");
+
+        try {
+            Integer reportCount = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM admin_task_templates WHERE title = 'REPORT_UPLOAD' AND onboarding_sequence IS NOT NULL", Integer.class);
+            if (reportCount == null || reportCount == 0) {
+                jdbcTemplate.execute("INSERT INTO admin_task_templates (title, description, points, category, need_review, is_active, task_type, frequency, onboarding_sequence, created_at, updated_at) VALUES " +
+                        "('REPORT_UPLOAD', '完成首次报告上传', 300, '成长', 0, 1, 'onetime', 'none', 8, NOW(), NOW())");
+                log.info("迁移343: 已插入完成首次报告上传新人引导任务模板");
+            }
+        } catch (Exception e) {
+            log.warn("迁移343: 插入完成首次报告上传任务模板失败或已存在: {}", e.getMessage());
+        }
     }
 
     /**

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java

@@ -42,6 +42,7 @@ import com.etotem.cfc.service.ReportTransferService;
 import com.etotem.cfc.service.ReportBlockAssembler;
 import com.etotem.cfc.service.ReportBlockService;
 import com.etotem.cfc.service.StorageService;
+import com.etotem.cfc.service.OnboardingService;
 import com.etotem.cfc.service.TongueDiagnosisService;
 import com.etotem.cfc.service.BasicQuotaService;
 import com.etotem.cfc.service.BodyFatScaleService;
@@ -182,6 +183,9 @@ public class HealthReportController {
     @Resource
     private com.etotem.cfc.service.ReportFeedbackService reportFeedbackService;
 
+    @Resource
+    private OnboardingService onboardingService;
+
     /**
      * 创建健康报告(含指标明细)
      */
@@ -617,6 +621,9 @@ public class HealthReportController {
 
             healthReportDraftService.markConfirmed(draft.getId(), created.getId());
 
+            // 新手任务联动:完成首次报告上传任务(老用户无任务记录时静默跳过)
+            try { onboardingService.completeTask(userId, "REPORT_UPLOAD"); } catch (Exception e) { log.warn("新手任务 REPORT_UPLOAD 更新失败: {}", e.getMessage()); }
+
             Map<String, Object> detail = healthReportService.getReportDetail(created.getId());
             detail.put("matchedMemberId", matchedMemberId);
             detail.put("matchedMemberName", matchedMemberName);

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ReportCollectService.java

@@ -86,6 +86,9 @@ public class ReportCollectService {
     @Resource(name = "taskExecutor")
     private Executor taskExecutor;
 
+    @Resource
+    private TaskService taskService;
+
     @Resource
     private RestTemplate restTemplate;
 
@@ -620,6 +623,9 @@ public class ReportCollectService {
         }
 
         healthReportDraftService.markCollectCompleted(draft.getId(), created.getId());
+
+        // 新手任务联动:完成首次报告上传任务(老用户无任务记录时静默跳过)
+        try { taskService.completeOnboardingTask(draft.getUserId(), "REPORT_UPLOAD"); } catch (Exception e) { log.warn("新手任务 REPORT_UPLOAD 完成失败: {}", e.getMessage()); }
     }
 
     private HealthReport buildReportFromPayload(HealthReportDraft draft, ParsedReportPayload.Payload payload, Long subjectId) {

+ 5 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/TaskService.java

@@ -949,6 +949,10 @@ public List<Task> getTodayTasks(Long memberId, String dimensionCode) {
         // CF 额度取任务基础积分,不含连胜里程碑加成与迟到惩罚,避免奖励被放大/倒挂。
         try {
             int cfAmount = task.getPoints() != null && task.getPoints() > 0 ? task.getPoints() : 0;
+            // 注册/绑定推荐人为引流类任务,不发可提现的CF值(积分照发,防止刷CF)
+            if (cfAmount > 0 && ("REGISTER".equals(task.getTitle()) || "BIND_REFERRAL".equals(task.getTitle()))) {
+                cfAmount = 0;
+            }
             if (cfAmount > 0) {
                 String remark = "完成任务: " + task.getTitle();
                 if (child != null && child.getUserId() != null) {
@@ -1877,7 +1881,7 @@ return 0; // 达到每日扣分上限
                 .eq(Task::getFamilyMemberId, member.getId())
                 .eq(Task::getSourceType, "onboarding")
                 .eq(Task::getTitle, templateTitle)
-                .eq(Task::getStatus, "pending")
+                .in(Task::getStatus, "pending", "locked")
                 .last("LIMIT 1"));
         if (task != null) {
             awardTaskCompletionRewards(task, member.getId(), new Date());