roomDailyTask 新增进度更新接口
This commit is contained in:
parent
05af847f40
commit
b6074ec0d9
@ -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<RoomDailyTaskTier> 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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user