From b6074ec0d9ecc9e8ea6358a4ed36d9f87ab2693f Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Wed, 4 Mar 2026 10:45:23 +0800 Subject: [PATCH] =?UTF-8?q?roomDailyTask=20=E6=96=B0=E5=A2=9E=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/RoomDailyTaskProgressUpdateExe.java | 85 +++++++++++++++++++ .../RoomDailyTaskProgressServiceImpl.java | 18 ++++ .../task/RoomDailyTaskProgressUpdateCmd.java | 24 ++++++ .../task/RoomDailyTaskProgressService.java | 8 ++ 4 files changed, 135 insertions(+) create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskProgressUpdateExe.java create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressServiceImpl.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/task/RoomDailyTaskProgressUpdateCmd.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressService.java diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskProgressUpdateExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskProgressUpdateExe.java new file mode 100644 index 00000000..59df96af --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskProgressUpdateExe.java @@ -0,0 +1,85 @@ +package com.red.circle.other.app.command.task; + +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; +import com.red.circle.other.infra.database.rds.entity.task.RoomDailyTaskConfig; +import com.red.circle.other.infra.database.rds.entity.task.RoomDailyTaskProgress; +import com.red.circle.other.infra.database.rds.entity.task.RoomDailyTaskTier; +import com.red.circle.other.infra.database.rds.service.RoomDailyTaskDatabaseService; +import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; + +/** + * 更新每日任务进度 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RoomDailyTaskProgressUpdateExe { + + private final RoomDailyTaskDatabaseService taskDatabaseService; + + @Transactional(rollbackFor = Exception.class) + public void execute(RoomDailyTaskProgressUpdateCmd cmd) { + Long userId = cmd.getUserId(); + String taskCode = cmd.getTaskCode(); + Integer progressValue = cmd.getProgressValue(); + + RoomDailyTaskConfig config = taskDatabaseService.getConfigByCode(taskCode); + if (config == null) { + log.warn("任务配置不存在或已下线, taskCode={}", taskCode); + return; + } + + List tiers = taskDatabaseService.listTiersByTaskCodes(Collections.singletonList(taskCode)); + if (tiers.isEmpty()) { + log.warn("任务档位未配置, taskCode={}", taskCode); + return; + } + + LocalDate today = ZonedDateTimeAsiaRiyadhUtils.now().toLocalDate(); + RoomDailyTaskProgress progress = taskDatabaseService.getProgress(userId, taskCode, today); + + if (progress == null) { + progress = new RoomDailyTaskProgress(); + progress.setUserId(userId); + progress.setTaskId(config.getId()); + progress.setTaskCode(taskCode); + progress.setTaskCategory(config.getTaskCategory()); + progress.setCycleDate(today); + progress.setCurrentValue(0); + progress.setMaxTierCompleted(0); + progress.setMaxTierClaimed(0); + progress.setCreateTime(LocalDateTime.now()); + } + + // 所有档位均已领取,不再更新 + if (progress.getMaxTierClaimed() >= tiers.size()) { + log.info("所有档位已领取,无需更新进度, userId={}, taskCode={}", userId, taskCode); + return; + } + + progress.setCurrentValue(progressValue); + + // 计算当前达到的最高档位 + int maxTierCompleted = 0; + for (RoomDailyTaskTier tier : tiers) { + if (progressValue >= tier.getTargetValue()) { + maxTierCompleted = tier.getTierIndex(); + } + } + progress.setMaxTierCompleted(maxTierCompleted); + progress.setUpdateTime(LocalDateTime.now()); + + taskDatabaseService.saveOrUpdateProgress(progress); + + log.info("任务进度更新成功, userId={}, taskCode={}, progressValue={}, maxTierCompleted={}", userId, taskCode, progressValue, maxTierCompleted); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressServiceImpl.java new file mode 100644 index 00000000..c7f3edc8 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressServiceImpl.java @@ -0,0 +1,18 @@ +package com.red.circle.other.app.service.task; + +import com.red.circle.other.app.command.task.RoomDailyTaskProgressUpdateExe; +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class RoomDailyTaskProgressServiceImpl implements RoomDailyTaskProgressService { + + private final RoomDailyTaskProgressUpdateExe progressUpdateExe; + + @Override + public void updateTaskProgress(RoomDailyTaskProgressUpdateCmd cmd) { + progressUpdateExe.execute(cmd); + } +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/task/RoomDailyTaskProgressUpdateCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/task/RoomDailyTaskProgressUpdateCmd.java new file mode 100644 index 00000000..d0108945 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/task/RoomDailyTaskProgressUpdateCmd.java @@ -0,0 +1,24 @@ +package com.red.circle.other.app.dto.cmd.task; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 更新每日任务进度命令 + */ +@Data +@Accessors(chain = true) +public class RoomDailyTaskProgressUpdateCmd { + + @NotNull(message = "用户ID不能为空") + private Long userId; + + @NotBlank(message = "任务编码不能为空") + private String taskCode; + + /** 当前进度值(绝对值,非增量) */ + @NotNull(message = "进度值不能为空") + private Integer progressValue; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressService.java new file mode 100644 index 00000000..b75c75ba --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskProgressService.java @@ -0,0 +1,8 @@ +package com.red.circle.other.app.service.task; + +import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskProgressUpdateCmd; + +public interface RoomDailyTaskProgressService { + + void updateTaskProgress(RoomDailyTaskProgressUpdateCmd cmd); +}