| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- 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,
- }
- }
|