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<String, UploadProgressInfo> 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;
|
}
|
}
|