fix(aihr): preserve tenant for local imports

This commit is contained in:
2026-07-14 06:53:03 +08:00
parent 6ec1772674
commit c95cb1ff3b
3 changed files with 22 additions and 1 deletions
@@ -466,8 +466,12 @@ public class AihrSopSeedService {
public LocalImportTaskResponse startLocalImportTask(LocalImportRequest request) {
LocalImportPlan plan = localImportPlan(request);
String tenantId = tenantId();
long taskId = createLocalImportTask(plan);
CompletableFuture.runAsync(() -> runLocalImportTask(taskId, plan), scheduledExecutorService);
CompletableFuture.runAsync(() -> TenantHelper.dynamic(tenantId, () -> {
runLocalImportTask(taskId, plan);
return null;
}), scheduledExecutorService);
return localImportTask(taskId).orElseGet(() -> new LocalImportTaskResponse(
taskId, plan.directory(), plan.category(), "导入中", "primary", 0, plan.files().size(), 0, 0, "", formatTime(new Timestamp(System.currentTimeMillis())), formatTime(new Timestamp(System.currentTimeMillis())), ""
));
@@ -4,6 +4,8 @@ import org.dromara.aihr.domain.AihrSopDto;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -80,6 +82,20 @@ public class AihrSopSeedServiceTest {
assertFalse(cleaned.contains("う"));
}
@Test
@Tag("dev")
public void localImportWorkerCarriesTenantContext() throws Exception {
Path source = Path.of("src/main/java/org/dromara/aihr/service/AihrSopSeedService.java");
if (!Files.exists(source)) {
source = Path.of("ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSopSeedService.java");
}
String code = Files.readString(source);
assertTrue(code.contains("String tenantId = tenantId();"));
assertTrue(code.contains("TenantHelper.dynamic(tenantId"));
assertTrue(code.contains("runLocalImportTask(taskId, plan)"));
}
private static AihrSopSeedService.KnowledgeHit hit(Long fragmentId, String title) {
return new AihrSopSeedService.KnowledgeHit(fragmentId, title, "sop", "", "doc-" + fragmentId, "片段内容", 1, 1.0);
}
+1
View File
@@ -98,3 +98,4 @@
- 2026-07-14 剩余固定租户审查:`AihrPracticeSeedService` 仍有 79 处运行时 `TENANT_ID`,覆盖场景、训练记录、派题、复盘、导出和 Prompt 管理;这些路径可按同步请求上下文分批迁移。`AihrUploadQueueService` 仍有 19 处固定租户引用,但其后台 worker 会脱离登录线程并调用 SOP 加工,不能机械替换为 `LoginHelper`;下一步需让队列条目携带租户、worker 按条目租户加工,并补跨租户领取/隔离测试。
- 2026-07-14 训练租户边界修复:`AihrPracticeSeedService` 的场景、训练记录、派题、复盘、导出、Prompt、标注和音频明细运行时查询/写入统一使用当前登录租户;无登录上下文回退本地开发租户 `000000`。定向 AIHR 测试 48/48、管理端完整打包均通过。`AihrUploadQueueService` 仍保留固定租户,原因是后台 worker 需要下一批显式携带条目租户后再调用 SOP 加工,避免机械替换造成跨租户队列停摆。
- 2026-07-14 异步上传队列租户边界修复:请求入队、查询和重试按当前登录租户;后台领取按队列条目租户跨租户扫描,文件加工通过 `TenantHelper.dynamic` 进入对应租户,ZIP 子条目、失败回写和卡死清扫均沿用条目租户;新增队列结构回归测试。AIHR 全量测试 50/50、`ruoyi-admin` 跳测试打包通过;正式多租户文件上传、向量写入和跨租户隔离仍需测试环境回归。
- 2026-07-14 目录导入异步任务租户边界修复:`startLocalImportTask` 捕获当前租户,并用 `TenantHelper.dynamic` 包住整个后台导入 worker,任务进度、取消状态、OSS/片段/向量写入不再因脱离登录线程回退到 `000000`;新增异步上下文回归测试。正式多租户目录导入仍需测试环境验证。