feat(studio): 补齐剩余工作台聚合接口与真实对接

This commit is contained in:
2026-06-01 05:28:11 +08:00
parent 8f7ffd6cc9
commit ebe0fc5a12
35 changed files with 2092 additions and 123 deletions

View File

@@ -0,0 +1,129 @@
package com.bruce.rag.ingestion;
import com.bruce.modelprovider.dto.response.RagStoreModelConfigResponse;
import com.bruce.modelprovider.service.IRagStoreModelConfigService;
import com.bruce.rag.dto.response.RagDocumentResponse;
import com.bruce.rag.dto.response.RagStoreResponse;
import com.bruce.rag.entity.RagChunk;
import com.bruce.rag.entity.RagChunkEmbedding;
import com.bruce.rag.entity.RagDocumentParseResult;
import com.bruce.rag.service.IRagChunkEmbeddingService;
import com.bruce.rag.service.IRagChunkService;
import com.bruce.rag.service.IRagDocumentParseResultService;
import com.bruce.rag.service.IRagDocumentService;
import com.bruce.rag.service.IRagStoreService;
import com.bruce.rag.service.impl.IngestionRunServiceImpl;
import com.bruce.rag.vo.IngestionRunVO;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Date;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class IngestionRunServiceTests {
@Mock
private IRagStoreService ragStoreService;
@Mock
private IRagDocumentService ragDocumentService;
@Mock
private IRagDocumentParseResultService ragDocumentParseResultService;
@Mock
private IRagChunkService ragChunkService;
@Mock
private IRagChunkEmbeddingService ragChunkEmbeddingService;
@Mock
private IRagStoreModelConfigService ragStoreModelConfigService;
@InjectMocks
private IngestionRunServiceImpl ingestionRunService;
@Test
void getRunShouldAggregatePipelinePreviewAndLogs() {
RagStoreResponse store = new RagStoreResponse();
store.setId(1001L);
store.setStoreCode("PROD_DOC");
store.setStoreName("产品制度库");
RagDocumentResponse document = new RagDocumentResponse();
document.setId(11L);
document.setStoreId(1001L);
document.setAttachmentId(901L);
document.setDocumentTitle("售前方案模板.pdf");
document.setParseStatus("PARSED");
document.setIndexStatus("INDEXED");
document.setCreateTime(new Date(1748780000000L));
document.setUpdateTime(new Date(1748780300000L));
RagDocumentParseResult parseResult = new RagDocumentParseResult();
parseResult.setDocumentId(11L);
parseResult.setParsedText("私有化部署章节应覆盖基础设施、网络、安全与运维边界。平台需说明模型服务商、知识库索引策略与日志留存周期。");
parseResult.setTextLength(1280);
parseResult.setPageCount(12);
parseResult.setCreateTime(new Date(1748780100000L));
RagChunk chunk = new RagChunk();
chunk.setDocumentId(11L);
chunk.setChunkIndex(24);
chunk.setChunkSummary("chunk_size=800, overlap=120, strategy=FIXED_LENGTH");
chunk.setChunkContent("该切片将进入 rag_chunk 并在向量化后写入 rag_chunk_embedding。");
chunk.setCreateTime(new Date(1748780200000L));
RagChunkEmbedding embedding = new RagChunkEmbedding();
embedding.setDocumentId(11L);
embedding.setEmbeddingDimension(1024);
embedding.setCreateTime(new Date(1748780250000L));
RagStoreModelConfigResponse config = new RagStoreModelConfigResponse();
config.setStoreId(1001L);
config.setEmbeddingModelId(88L);
config.setEmbeddingDimension(1024);
config.setChunkStrategy(1);
config.setChunkSize(800);
config.setChunkOverlap(120);
when(ragStoreService.getResponseById(1001L)).thenReturn(store);
when(ragDocumentService.getResponseById(11L)).thenReturn(document);
when(ragDocumentParseResultService.getByDocumentId(11L)).thenReturn(parseResult);
when(ragChunkService.list(org.mockito.ArgumentMatchers.<com.baomidou.mybatisplus.core.conditions.Wrapper<RagChunk>>any()))
.thenReturn(List.of(chunk));
when(ragChunkEmbeddingService.list(org.mockito.ArgumentMatchers.<com.baomidou.mybatisplus.core.conditions.Wrapper<RagChunkEmbedding>>any()))
.thenReturn(List.of(embedding));
when(ragStoreModelConfigService.getByStoreId(1001L)).thenReturn(config);
IngestionRunVO view = ingestionRunService.getRun(1001L, 11L);
assertNotNull(view);
assertEquals(1001L, view.getStoreId());
assertEquals(11L, view.getDocumentId());
assertEquals("PROD_DOC", view.getStoreCode());
assertEquals("产品制度库", view.getStoreName());
assertEquals(1, view.getFiles().size());
assertEquals(5, view.getSteps().size());
assertEquals("done", view.getSteps().get(1).getStatus());
assertEquals("done", view.getSteps().get(2).getStatus());
assertEquals("done", view.getSteps().get(3).getStatus());
assertEquals("done", view.getSteps().get(4).getStatus());
assertEquals(88L, view.getEmbeddingModelId());
assertEquals(1024, view.getEmbeddingDimension());
assertEquals(800, view.getChunkSize());
assertEquals(120, view.getChunkOverlap());
assertEquals(4, view.getLogs().size());
assertEquals("售前方案模板.pdf", view.getFiles().get(0).getFileName());
assertEquals(true, view.getParsedTextPreview().contains("私有化部署章节"));
assertEquals(true, view.getChunkPreview().contains("chunk_size=800"));
}
}