feat(rag-store): 补充知识库文档概览接口

This commit is contained in:
zhiye.sun
2026-05-21 15:35:45 +08:00
parent 541c3ff455
commit 8532628171
11 changed files with 484 additions and 17 deletions

View File

@@ -3,6 +3,8 @@ package com.bruce.rag.controller;
import com.bruce.common.domain.model.RequestResult;
import com.bruce.rag.dto.request.RagStoreQueryRequest;
import com.bruce.rag.dto.request.RagStoreSaveRequest;
import com.bruce.rag.dto.response.RagStoreDocumentOverviewResponse;
import com.bruce.rag.dto.response.RagStoreOverviewResponse;
import com.bruce.rag.dto.response.RagStoreResponse;
import com.bruce.rag.service.IRagStoreService;
import io.swagger.v3.oas.annotations.Operation;
@@ -54,6 +56,26 @@ public class RagStoreController {
return RequestResult.success(response);
}
@Operation(summary = "查询知识库总览")
@GetMapping("/overview")
public RequestResult<RagStoreOverviewResponse> overview() {
log.info("RagStoreController.overview start");
RagStoreOverviewResponse response = ragStoreService.getOverview();
log.info("RagStoreController.overview success, totalStores={}, totalDocuments={}",
response.getTotalStores(), response.getTotalDocuments());
return RequestResult.success(response);
}
@Operation(summary = "查询知识库文档概览")
@GetMapping("/documentOverview")
public RequestResult<RagStoreDocumentOverviewResponse> documentOverview(@RequestParam("storeId") Long storeId) {
log.info("RagStoreController.documentOverview start, storeId={}", storeId);
RagStoreDocumentOverviewResponse response = ragStoreService.getDocumentOverview(storeId);
log.info("RagStoreController.documentOverview success, storeId={}, documentCount={}",
storeId, response.getDocumentCount());
return RequestResult.success(response);
}
@Operation(summary = "新增或修改知识库")
@PostMapping("/save")
public RequestResult<Boolean> saveOrUpdate(@RequestBody RagStoreSaveRequest request) {

View File

@@ -0,0 +1,38 @@
package com.bruce.rag.dto.response;
import com.bruce.common.constant.CommonConsts;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@Schema(description = "RAG知识库文档概览响应")
public class RagStoreDocumentOverviewResponse {
@Schema(description = "知识库ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long storeId;
@Schema(description = "知识库名称")
private String storeName;
@Schema(description = "文档总数")
private Integer documentCount;
@Schema(description = "启用文档数")
private Integer enabledDocumentCount;
@Schema(description = "已解析文档数")
private Integer parsedDocumentCount;
@Schema(description = "已索引文档数")
private Integer indexedDocumentCount;
@Schema(description = "最近上传时间")
@JsonFormat(pattern = CommonConsts.DATE_FORMAT_LONG_STR, timezone = CommonConsts.TIME_ZONE_GMT8)
private Date lastUploadTime;
}

View File

@@ -0,0 +1,21 @@
package com.bruce.rag.dto.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "RAG知识库总览响应")
public class RagStoreOverviewResponse {
@Schema(description = "知识库总数")
private Integer totalStores;
@Schema(description = "文档总数")
private Integer totalDocuments;
@Schema(description = "切片总数")
private Integer totalChunks;
@Schema(description = "可检索知识库数")
private Integer retrievableStores;
}

View File

@@ -3,6 +3,8 @@ package com.bruce.rag.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bruce.rag.dto.request.RagStoreQueryRequest;
import com.bruce.rag.dto.request.RagStoreSaveRequest;
import com.bruce.rag.dto.response.RagStoreDocumentOverviewResponse;
import com.bruce.rag.dto.response.RagStoreOverviewResponse;
import com.bruce.rag.dto.response.RagStoreResponse;
import com.bruce.rag.entity.RagStore;
@@ -16,5 +18,9 @@ public interface IRagStoreService extends IService<RagStore> {
RagStoreResponse getResponseById(Long id);
RagStoreOverviewResponse getOverview();
RagStoreDocumentOverviewResponse getDocumentOverview(Long storeId);
boolean saveOrUpdate(RagStoreSaveRequest request);
}

View File

@@ -1,22 +1,36 @@
package com.bruce.rag.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.common.enums.EnableStatusEnum;
import com.bruce.rag.dto.request.RagDocumentQueryRequest;
import com.bruce.rag.dto.request.RagStoreQueryRequest;
import com.bruce.rag.dto.request.RagStoreSaveRequest;
import com.bruce.rag.dto.response.RagDocumentResponse;
import com.bruce.rag.dto.response.RagStoreDocumentOverviewResponse;
import com.bruce.rag.dto.response.RagStoreOverviewResponse;
import com.bruce.rag.dto.response.RagStoreResponse;
import com.bruce.rag.entity.RagStore;
import com.bruce.rag.enums.RagIndexStatusEnum;
import com.bruce.rag.enums.RagParseStatusEnum;
import com.bruce.rag.mapper.RagStoreMapper;
import com.bruce.rag.service.IRagDocumentService;
import com.bruce.rag.service.IRagStoreService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class RagStoreServiceImpl extends ServiceImpl<RagStoreMapper, RagStore> implements IRagStoreService {
@Autowired
private IRagDocumentService ragDocumentService;
@Override
public List<RagStoreResponse> listResponses() {
log.info("RagStoreServiceImpl.listResponses start");
@@ -47,6 +61,62 @@ public class RagStoreServiceImpl extends ServiceImpl<RagStoreMapper, RagStore> i
return response;
}
@Override
public RagStoreOverviewResponse getOverview() {
log.info("RagStoreServiceImpl.getOverview start");
List<RagStore> stores = list();
List<RagDocumentResponse> documents = ragDocumentService.listResponses();
RagStoreOverviewResponse response = new RagStoreOverviewResponse();
response.setTotalStores(stores.size());
response.setTotalDocuments(documents.size());
response.setTotalChunks(null);
response.setRetrievableStores((int) stores.stream()
.filter(store -> EnableStatusEnum.ENABLED.getLabel().equals(store.getStatus()))
.count());
log.info("RagStoreServiceImpl.getOverview success, totalStores={}, totalDocuments={}, retrievableStores={}",
response.getTotalStores(), response.getTotalDocuments(), response.getRetrievableStores());
return response;
}
@Override
public RagStoreDocumentOverviewResponse getDocumentOverview(Long storeId) {
log.info("RagStoreServiceImpl.getDocumentOverview start, storeId={}", storeId);
if (storeId == null) {
throw new IllegalArgumentException("知识库ID不能为空");
}
RagStore store = getById(storeId);
if (store == null) {
throw new IllegalArgumentException("知识库不存在ID: " + storeId);
}
RagDocumentQueryRequest request = new RagDocumentQueryRequest();
request.setStoreId(storeId);
List<RagDocumentResponse> documents = ragDocumentService.query(request);
RagStoreDocumentOverviewResponse response = new RagStoreDocumentOverviewResponse();
response.setStoreId(storeId);
response.setStoreName(store.getStoreName());
response.setDocumentCount(documents.size());
response.setEnabledDocumentCount((int) documents.stream()
.filter(document -> Boolean.TRUE.equals(document.getEnabled()))
.count());
response.setParsedDocumentCount((int) documents.stream()
.filter(document -> RagParseStatusEnum.PARSED.name().equals(document.getParseStatus()))
.count());
response.setIndexedDocumentCount((int) documents.stream()
.filter(document -> RagIndexStatusEnum.INDEXED.name().equals(document.getIndexStatus()))
.count());
response.setLastUploadTime(documents.stream()
.map(RagDocumentResponse::getCreateTime)
.filter(Objects::nonNull)
.max(Comparator.naturalOrder())
.orElse(null));
log.info("RagStoreServiceImpl.getDocumentOverview success, storeId={}, documentCount={}",
storeId, response.getDocumentCount());
return response;
}
@Override
public boolean saveOrUpdate(RagStoreSaveRequest request) {
log.info("RagStoreServiceImpl.saveOrUpdate start, request={}", request);
@@ -62,13 +132,7 @@ public class RagStoreServiceImpl extends ServiceImpl<RagStoreMapper, RagStore> i
throw new IllegalArgumentException("知识库编码已存在: " + request.getStoreCode().trim());
}
RagStore ragStore = new RagStore();
ragStore.setId(request.getId());
ragStore.setStoreCode(request.getStoreCode().trim());
ragStore.setStoreName(request.getStoreName().trim());
ragStore.setDescription(trimToNull(request.getDescription()));
ragStore.setStatus(StringUtils.hasText(request.getStatus()) ? request.getStatus().trim() : "启用");
ragStore.setRemark(trimToNull(request.getRemark()));
RagStore ragStore = buildEntity(request);
boolean result = super.saveOrUpdate(ragStore);
log.info("RagStoreServiceImpl.saveOrUpdate success, requestId={}, savedId={}, storeCode={}, result={}",
request.getId(), ragStore.getId(), ragStore.getStoreCode(), result);
@@ -90,6 +154,19 @@ public class RagStoreServiceImpl extends ServiceImpl<RagStoreMapper, RagStore> i
request.getId(), request.getStoreCode(), request.getStoreName());
}
public RagStore buildEntity(RagStoreSaveRequest request) {
RagStore ragStore = new RagStore();
ragStore.setId(request.getId());
ragStore.setStoreCode(request.getStoreCode().trim());
ragStore.setStoreName(request.getStoreName().trim());
ragStore.setDescription(trimToNull(request.getDescription()));
ragStore.setStatus(StringUtils.hasText(request.getStatus())
? request.getStatus().trim()
: EnableStatusEnum.ENABLED.getLabel());
ragStore.setRemark(trimToNull(request.getRemark()));
return ragStore;
}
private List<RagStoreResponse> toResponses(List<RagStore> stores) {
return stores.stream()
.map(RagStoreResponse::fromEntity)