saveKnowledgeChunkWithTransaction 使用事务保存知识点
(eid int64, userID int64, req *SaveKnowledgeChunkRequest)
| 105 | |
| 106 | // saveKnowledgeChunkWithTransaction 使用事务保存知识点 |
| 107 | func saveKnowledgeChunkWithTransaction(eid int64, userID int64, req *SaveKnowledgeChunkRequest) (*SaveKnowledgeChunkResult, error) { |
| 108 | var result *SaveKnowledgeChunkResult |
| 109 | var isUpdate bool = req.ChunkID != nil |
| 110 | var fileID int64 |
| 111 | |
| 112 | // 确定是否需要自动分检索块 |
| 113 | autoSplitRetrieval := true // 默认值 |
| 114 | if req.AutoSplitRetrieval != nil { |
| 115 | autoSplitRetrieval = *req.AutoSplitRetrieval |
| 116 | } else { |
| 117 | // 新增默认分,更新默认不分 |
| 118 | autoSplitRetrieval = !isUpdate |
| 119 | } |
| 120 | |
| 121 | err := model.DB.Transaction(func(tx *gorm.DB) error { |
| 122 | var knowledgeChunk *model.DocumentChunk |
| 123 | |
| 124 | if isUpdate { |
| 125 | // 更新模式:获取现有分块信息 |
| 126 | existingChunk, err := model.GetDocumentChunkByID(eid, *req.ChunkID) |
| 127 | if err != nil { |
| 128 | return fmt.Errorf("获取现有分块失败: %v", err) |
| 129 | } |
| 130 | |
| 131 | fileID = existingChunk.FileID |
| 132 | |
| 133 | existingChunk.Content = req.Content |
| 134 | existingChunk.IsManualEdited = true |
| 135 | if autoSplitRetrieval { |
| 136 | existingChunk.EmbeddingStatus = model.DocumentChunkEmbeddingStatusPending |
| 137 | existingChunk.VectorID = "" |
| 138 | } |
| 139 | |
| 140 | tokenizerService := rag.NewTokenizerService() |
| 141 | tokenCount, err := tokenizerService.CountTokens(req.Content) |
| 142 | if err == nil { |
| 143 | existingChunk.TokenCount = tokenCount |
| 144 | } |
| 145 | |
| 146 | if err := tx.Model(existingChunk).Updates(existingChunk).Error; err != nil { |
| 147 | return fmt.Errorf("更新分块失败: %v", err) |
| 148 | } |
| 149 | |
| 150 | knowledgeChunk = existingChunk |
| 151 | } else { |
| 152 | fileID = req.FileID |
| 153 | |
| 154 | tokenizerService := rag.NewTokenizerService() |
| 155 | tokenCount, err := tokenizerService.CountTokens(req.Content) |
| 156 | if err != nil { |
| 157 | tokenCount = 0 |
| 158 | } |
| 159 | |
| 160 | newChunk := &model.DocumentChunk{ |
| 161 | Eid: eid, |
| 162 | FileID: fileID, |
| 163 | LibraryID: req.LibraryID, |
| 164 | Content: req.Content, |
no test coverage detected