package com.tcm.training.admin.upload; import com.obs.services.model.ProgressStatus; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Service public class UploadProgressService { private final ConcurrentMap progressMap = new ConcurrentHashMap<>(); public void init(String taskId) { if (!StringUtils.hasText(taskId)) { return; } UploadProgressInfo info = new UploadProgressInfo(); info.setTaskId(taskId); info.setStatus(UploadProgressInfo.STATUS_UPLOADING); info.setPercent(0); info.setTransferredBytes(0L); info.setTotalBytes(0L); progressMap.put(taskId, info); } public void update(String taskId, ProgressStatus status) { if (!StringUtils.hasText(taskId) || status == null) { return; } UploadProgressInfo info = progressMap.computeIfAbsent(taskId, this::createUploadingInfo); info.setStatus(UploadProgressInfo.STATUS_UPLOADING); info.setPercent(status.getTransferPercentage()); info.setTransferredBytes(status.getTransferredBytes()); info.setTotalBytes(status.getTotalBytes()); } public void markSuccess(String taskId, UploadFileResult result) { if (!StringUtils.hasText(taskId)) { return; } UploadProgressInfo info = progressMap.computeIfAbsent(taskId, this::createUploadingInfo); info.setStatus(UploadProgressInfo.STATUS_SUCCESS); info.setPercent(100); info.setUrl(result.getUrl()); info.setFileName(result.getFileName()); } public void markFailed(String taskId, String errorMessage) { if (!StringUtils.hasText(taskId)) { return; } UploadProgressInfo info = progressMap.computeIfAbsent(taskId, this::createUploadingInfo); info.setStatus(UploadProgressInfo.STATUS_FAILED); info.setErrorMessage(errorMessage); } public UploadProgressInfo get(String taskId) { if (!StringUtils.hasText(taskId)) { throw new IllegalArgumentException("上传任务ID不能为空"); } return progressMap.getOrDefault(taskId, createUploadingInfo(taskId)); } private UploadProgressInfo createUploadingInfo(String taskId) { UploadProgressInfo info = new UploadProgressInfo(); info.setTaskId(taskId); info.setStatus(UploadProgressInfo.STATUS_UPLOADING); info.setPercent(0); info.setTransferredBytes(0L); info.setTotalBytes(0L); return info; } }