fix: 修复异步方法返回类型不兼容问题

将@Async方法的返回类型从String改为CompletableFuture<ImportResultVO>,
并使用CompletableFuture.completedFuture()立即返回已完成的Future,
既符合@Async的要求,又能实现立即返回的效果。

修改文件:
- ICcdiEmployeeService.java: 更新接口返回类型
- CcdiEmployeeServiceImpl.java: 使用CompletableFuture.completedFuture()
- CcdiEmployeeController.java: 调用future.get()获取结果(不会阻塞)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-06 09:59:30 +08:00
parent 20bead7ddf
commit 50ac577297
5 changed files with 19 additions and 13 deletions

View File

@@ -82,7 +82,9 @@
"Bash(git reset:*)", "Bash(git reset:*)",
"Skill(xlsx)", "Skill(xlsx)",
"mcp__chrome-devtools__evaluate_script", "mcp__chrome-devtools__evaluate_script",
"Skill(superpowers:using-git-worktrees)" "Skill(superpowers:using-git-worktrees)",
"Bash(git -C D:ccdiccdi show 97bb899 --stat)",
"Bash(git show:*)"
] ]
}, },
"enabledMcpjsonServers": [ "enabledMcpjsonServers": [

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
/** /**
* 员工信息Controller * 员工信息Controller
@@ -137,13 +138,10 @@ public class CcdiEmployeeController extends BaseController {
} }
// 异步导入,立即返回taskId // 异步导入,立即返回taskId
String taskId = employeeService.importEmployeeAsync(list, updateSupport); CompletableFuture<ImportResultVO> future = employeeService.importEmployeeAsync(list, updateSupport);
// 构建返回结果 // future已经完成,get()不会阻塞
ImportResultVO result = new ImportResultVO(); ImportResultVO result = future.get();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
return AjaxResult.success("导入任务已提交,正在后台处理", result); return AjaxResult.success("导入任务已提交,正在后台处理", result);
} }

View File

@@ -11,6 +11,7 @@ import com.ruoyi.ccdi.domain.vo.ImportResultVO;
import com.ruoyi.ccdi.domain.vo.ImportStatusVO; import com.ruoyi.ccdi.domain.vo.ImportStatusVO;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
/** /**
* 员工信息 服务层 * 员工信息 服务层
@@ -91,9 +92,9 @@ public interface ICcdiEmployeeService {
* *
* @param excelList Excel数据列表 * @param excelList Excel数据列表
* @param isUpdateSupport 是否更新已存在的数据 * @param isUpdateSupport 是否更新已存在的数据
* @return 任务ID * @return 任务结果Future
*/ */
String importEmployeeAsync(List<CcdiEmployeeExcel> excelList, Boolean isUpdateSupport); CompletableFuture<ImportResultVO> importEmployeeAsync(List<CcdiEmployeeExcel> excelList, Boolean isUpdateSupport);
/** /**
* 查询导入状态 * 查询导入状态

View File

@@ -231,12 +231,12 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
* *
* @param excelList Excel数据列表 * @param excelList Excel数据列表
* @param isUpdateSupport 是否更新已存在的数据 * @param isUpdateSupport 是否更新已存在的数据
* @return 任务ID * @return 任务结果Future
*/ */
@Override @Override
@Async("importExecutor") @Async("importExecutor")
@Transactional @Transactional
public String importEmployeeAsync(List<CcdiEmployeeExcel> excelList, Boolean isUpdateSupport) { public CompletableFuture<ImportResultVO> importEmployeeAsync(List<CcdiEmployeeExcel> excelList, Boolean isUpdateSupport) {
String taskId = UUID.randomUUID().toString(); String taskId = UUID.randomUUID().toString();
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
@@ -272,8 +272,13 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
redisTemplate.opsForHash().putAll(statusKey, errorData); redisTemplate.opsForHash().putAll(statusKey, errorData);
} }
// 立即返回taskId,让调用者可以查询状态 // 立即返回结果,不等待后台任务完成
return taskId; ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
return CompletableFuture.completedFuture(result);
} }
/** /**