Files
AI-CS/backend/service/knowledge_base_service.go
T
2026-02-02 21:41:47 +08:00

131 lines
3.1 KiB
Go

package service
import (
"errors"
"github.com/2930134478/AI-CS/backend/models"
"github.com/2930134478/AI-CS/backend/repository"
)
// KnowledgeBaseService 知识库管理服务
type KnowledgeBaseService struct {
kbRepo *repository.KnowledgeBaseRepository
docRepo *repository.DocumentRepository
}
// NewKnowledgeBaseService 创建知识库服务实例
func NewKnowledgeBaseService(kbRepo *repository.KnowledgeBaseRepository, docRepo *repository.DocumentRepository) *KnowledgeBaseService {
return &KnowledgeBaseService{
kbRepo: kbRepo,
docRepo: docRepo,
}
}
// CreateKnowledgeBase 创建知识库
func (s *KnowledgeBaseService) CreateKnowledgeBase(input CreateKnowledgeBaseInput) (*KnowledgeBaseSummary, error) {
if input.Name == "" {
return nil, errors.New("知识库名称不能为空")
}
kb := &models.KnowledgeBase{
Name: input.Name,
Description: input.Description,
DocumentCount: 0,
}
if err := s.kbRepo.Create(kb); err != nil {
return nil, err
}
return s.toSummary(kb), nil
}
// GetKnowledgeBase 获取知识库详情
func (s *KnowledgeBaseService) GetKnowledgeBase(id uint) (*KnowledgeBaseSummary, error) {
kb, err := s.kbRepo.GetByID(id)
if err != nil {
return nil, err
}
// 更新文档数量
count, err := s.docRepo.CountByKnowledgeBaseID(id)
if err == nil {
kb.DocumentCount = int(count)
s.kbRepo.UpdateDocumentCount(id, int(count))
}
return s.toSummary(kb), nil
}
// ListKnowledgeBases 获取知识库列表
func (s *KnowledgeBaseService) ListKnowledgeBases() ([]KnowledgeBaseSummary, error) {
kbs, err := s.kbRepo.List()
if err != nil {
return nil, err
}
// 更新每个知识库的文档数量
summaries := make([]KnowledgeBaseSummary, len(kbs))
for i, kb := range kbs {
count, _ := s.docRepo.CountByKnowledgeBaseID(kb.ID)
kb.DocumentCount = int(count)
summaries[i] = *s.toSummary(&kb)
}
return summaries, nil
}
// UpdateKnowledgeBase 更新知识库
func (s *KnowledgeBaseService) UpdateKnowledgeBase(id uint, input UpdateKnowledgeBaseInput) (*KnowledgeBaseSummary, error) {
kb, err := s.kbRepo.GetByID(id)
if err != nil {
return nil, err
}
if input.Name != nil {
if *input.Name == "" {
return nil, errors.New("知识库名称不能为空")
}
kb.Name = *input.Name
}
if input.Description != nil {
kb.Description = *input.Description
}
if input.RAGEnabled != nil {
kb.RAGEnabled = *input.RAGEnabled
}
if err := s.kbRepo.Update(kb); err != nil {
return nil, err
}
return s.toSummary(kb), nil
}
// DeleteKnowledgeBase 删除知识库
func (s *KnowledgeBaseService) DeleteKnowledgeBase(id uint) error {
// 检查是否有文档
count, err := s.docRepo.CountByKnowledgeBaseID(id)
if err != nil {
return err
}
if count > 0 {
return errors.New("知识库包含文档,无法删除")
}
return s.kbRepo.Delete(id)
}
// toSummary 转换为摘要
func (s *KnowledgeBaseService) toSummary(kb *models.KnowledgeBase) *KnowledgeBaseSummary {
return &KnowledgeBaseSummary{
ID: kb.ID,
Name: kb.Name,
Description: kb.Description,
DocumentCount: int64(kb.DocumentCount),
RAGEnabled: kb.RAGEnabled,
CreatedAt: kb.CreatedAt,
UpdatedAt: kb.UpdatedAt,
}
}