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, long totalBytes) { 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(Math.max(totalBytes, 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()); if (status.getTotalBytes() > 0) { info.setTotalBytes(status.getTotalBytes()); } } public void markSuccess(String taskId, UploadFileResult result, long totalBytes) { if (!StringUtils.hasText(taskId)) { return; } UploadProgressInfo info = progressMap.computeIfAbsent(taskId, this::createUploadingInfo); info.setStatus(UploadProgressInfo.STATUS_SUCCESS); info.setPercent(100); info.setTotalBytes(Math.max(totalBytes, 0L)); info.setTransferredBytes(Math.max(totalBytes, 0L)); 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; } }