diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/task/RoomDailyTaskRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/task/RoomDailyTaskRestController.java index f6a9332b..963faf11 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/task/RoomDailyTaskRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/task/RoomDailyTaskRestController.java @@ -2,15 +2,14 @@ package com.red.circle.other.adapter.app.task; import com.red.circle.common.business.dto.cmd.AppExtCommand; import jakarta.validation.constraints.NotNull; -import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskCO; import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskClaimCO; +import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskListCO; import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskClaimCmd; import com.red.circle.other.app.service.task.RoomDailyTaskService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; /** * 每日任务接口 @@ -29,7 +28,7 @@ public class RoomDailyTaskRestController { * @eo.method get */ @GetMapping("/list") - public List getTaskList(AppExtCommand cmd, + public RoomDailyTaskListCO getTaskList(AppExtCommand cmd, @RequestParam @NotNull(message = "任务分类不能为空") Integer taskCategory) { return roomDailyTaskService.getTaskList(cmd.getReqUserId(), taskCategory); } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskQueryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskQueryExe.java index ef31ffc6..2912f92f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskQueryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/task/RoomDailyTaskQueryExe.java @@ -1,6 +1,7 @@ package com.red.circle.other.app.command.task; import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskCO; +import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskListCO; import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskTierCO; import com.red.circle.other.infra.database.rds.entity.task.RoomDailyTaskConfig; import com.red.circle.other.infra.database.rds.entity.task.RoomDailyTaskProgress; @@ -12,6 +13,8 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -26,10 +29,15 @@ public class RoomDailyTaskQueryExe { private final RoomDailyTaskDatabaseService taskDatabaseService; - public List execute(Long userId, Integer taskCategory) { + public RoomDailyTaskListCO execute(Long userId, Integer taskCategory) { List configs = taskDatabaseService.listEnabledConfigs(taskCategory); + + RoomDailyTaskListCO result = new RoomDailyTaskListCO(); + result.setCountdownSeconds(calcCountdownSeconds()); + if (CollectionUtils.isEmpty(configs)) { - return new ArrayList<>(); + result.setTasks(new ArrayList<>()); + return result; } List taskCodes = configs.stream().map(RoomDailyTaskConfig::getTaskCode).collect(Collectors.toList()); @@ -43,9 +51,19 @@ public class RoomDailyTaskQueryExe { Map progressMap = progressList.stream() .collect(Collectors.toMap(RoomDailyTaskProgress::getTaskCode, p -> p, (a, b) -> a)); - return configs.stream() + List tasks = configs.stream() .map(config -> buildTaskCO(config, tierMap.getOrDefault(config.getTaskCode(), new ArrayList<>()), progressMap.get(config.getTaskCode()))) .collect(Collectors.toList()); + + result.setTasks(tasks); + return result; + } + + /** 计算距沙特时间今日午夜的剩余秒数 */ + private long calcCountdownSeconds() { + ZonedDateTime now = ZonedDateTimeAsiaRiyadhUtils.now(); + ZonedDateTime midnight = now.toLocalDate().plusDays(1).atStartOfDay(now.getZone()); + return ChronoUnit.SECONDS.between(now, midnight); } private RoomDailyTaskCO buildTaskCO(RoomDailyTaskConfig config, List tiers, RoomDailyTaskProgress progress) { diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskServiceImpl.java index f67cf828..77baed37 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskServiceImpl.java @@ -2,14 +2,12 @@ package com.red.circle.other.app.service.task; import com.red.circle.other.app.command.task.RoomDailyTaskClaimExe; import com.red.circle.other.app.command.task.RoomDailyTaskQueryExe; -import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskCO; import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskClaimCO; +import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskListCO; import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskClaimCmd; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.List; - @Service @RequiredArgsConstructor public class RoomDailyTaskServiceImpl implements RoomDailyTaskService { @@ -18,7 +16,7 @@ public class RoomDailyTaskServiceImpl implements RoomDailyTaskService { private final RoomDailyTaskClaimExe claimExe; @Override - public List getTaskList(Long userId, Integer taskCategory) { + public RoomDailyTaskListCO getTaskList(Long userId, Integer taskCategory) { return queryExe.execute(userId, taskCategory); } diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/task/RoomDailyTaskListCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/task/RoomDailyTaskListCO.java new file mode 100644 index 00000000..05b11e50 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/task/RoomDailyTaskListCO.java @@ -0,0 +1,17 @@ +package com.red.circle.other.app.dto.clientobject.task; + +import lombok.Data; + +import java.util.List; + +/** + * 每日任务列表返回结构 + */ +@Data +public class RoomDailyTaskListCO { + + /** 距当日结束的剩余秒数(沙特时间午夜重置) */ + private Long countdownSeconds; + + private List tasks; +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskService.java index 04928977..ff641fd4 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskService.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/task/RoomDailyTaskService.java @@ -1,14 +1,12 @@ package com.red.circle.other.app.service.task; -import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskCO; import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskClaimCO; +import com.red.circle.other.app.dto.clientobject.task.RoomDailyTaskListCO; import com.red.circle.other.app.dto.cmd.task.RoomDailyTaskClaimCmd; -import java.util.List; - public interface RoomDailyTaskService { - List getTaskList(Long userId, Integer taskCategory); + RoomDailyTaskListCO getTaskList(Long userId, Integer taskCategory); RoomDailyTaskClaimCO claimReward(RoomDailyTaskClaimCmd cmd); }