knowledge_base_service.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package service
  2. import (
  3. "errors"
  4. "github.com/2930134478/AI-CS/backend/models"
  5. "github.com/2930134478/AI-CS/backend/repository"
  6. )
  7. // KnowledgeBaseService 知识库管理服务
  8. type KnowledgeBaseService struct {
  9. kbRepo *repository.KnowledgeBaseRepository
  10. docRepo *repository.DocumentRepository
  11. }
  12. // NewKnowledgeBaseService 创建知识库服务实例
  13. func NewKnowledgeBaseService(kbRepo *repository.KnowledgeBaseRepository, docRepo *repository.DocumentRepository) *KnowledgeBaseService {
  14. return &KnowledgeBaseService{
  15. kbRepo: kbRepo,
  16. docRepo: docRepo,
  17. }
  18. }
  19. // CreateKnowledgeBase 创建知识库
  20. func (s *KnowledgeBaseService) CreateKnowledgeBase(input CreateKnowledgeBaseInput) (*KnowledgeBaseSummary, error) {
  21. if input.Name == "" {
  22. return nil, errors.New("知识库名称不能为空")
  23. }
  24. kb := &models.KnowledgeBase{
  25. Name: input.Name,
  26. Description: input.Description,
  27. DocumentCount: 0,
  28. }
  29. if err := s.kbRepo.Create(kb); err != nil {
  30. return nil, err
  31. }
  32. return s.toSummary(kb), nil
  33. }
  34. // GetKnowledgeBase 获取知识库详情
  35. func (s *KnowledgeBaseService) GetKnowledgeBase(id uint) (*KnowledgeBaseSummary, error) {
  36. kb, err := s.kbRepo.GetByID(id)
  37. if err != nil {
  38. return nil, err
  39. }
  40. // 更新文档数量
  41. count, err := s.docRepo.CountByKnowledgeBaseID(id)
  42. if err == nil {
  43. kb.DocumentCount = int(count)
  44. s.kbRepo.UpdateDocumentCount(id, int(count))
  45. }
  46. return s.toSummary(kb), nil
  47. }
  48. // ListKnowledgeBases 获取知识库列表
  49. func (s *KnowledgeBaseService) ListKnowledgeBases() ([]KnowledgeBaseSummary, error) {
  50. kbs, err := s.kbRepo.List()
  51. if err != nil {
  52. return nil, err
  53. }
  54. // 更新每个知识库的文档数量
  55. summaries := make([]KnowledgeBaseSummary, len(kbs))
  56. for i, kb := range kbs {
  57. count, _ := s.docRepo.CountByKnowledgeBaseID(kb.ID)
  58. kb.DocumentCount = int(count)
  59. summaries[i] = *s.toSummary(&kb)
  60. }
  61. return summaries, nil
  62. }
  63. // UpdateKnowledgeBase 更新知识库
  64. func (s *KnowledgeBaseService) UpdateKnowledgeBase(id uint, input UpdateKnowledgeBaseInput) (*KnowledgeBaseSummary, error) {
  65. kb, err := s.kbRepo.GetByID(id)
  66. if err != nil {
  67. return nil, err
  68. }
  69. if input.Name != nil {
  70. if *input.Name == "" {
  71. return nil, errors.New("知识库名称不能为空")
  72. }
  73. kb.Name = *input.Name
  74. }
  75. if input.Description != nil {
  76. kb.Description = *input.Description
  77. }
  78. if input.RAGEnabled != nil {
  79. kb.RAGEnabled = *input.RAGEnabled
  80. }
  81. if err := s.kbRepo.Update(kb); err != nil {
  82. return nil, err
  83. }
  84. return s.toSummary(kb), nil
  85. }
  86. // DeleteKnowledgeBase 删除知识库
  87. func (s *KnowledgeBaseService) DeleteKnowledgeBase(id uint) error {
  88. // 检查是否有文档
  89. count, err := s.docRepo.CountByKnowledgeBaseID(id)
  90. if err != nil {
  91. return err
  92. }
  93. if count > 0 {
  94. return errors.New("知识库包含文档,无法删除")
  95. }
  96. return s.kbRepo.Delete(id)
  97. }
  98. // toSummary 转换为摘要
  99. func (s *KnowledgeBaseService) toSummary(kb *models.KnowledgeBase) *KnowledgeBaseSummary {
  100. return &KnowledgeBaseSummary{
  101. ID: kb.ID,
  102. Name: kb.Name,
  103. Description: kb.Description,
  104. DocumentCount: int64(kb.DocumentCount),
  105. RAGEnabled: kb.RAGEnabled,
  106. CreatedAt: kb.CreatedAt,
  107. UpdatedAt: kb.UpdatedAt,
  108. }
  109. }