package handlers import ( "github.com/gin-gonic/gin" "smart-customer-service/config" "smart-customer-service/internal/database" "smart-customer-service/internal/models" "strconv" ) type KnowledgeHandler struct { cfg *config.Config } // 知识库列表 func (h *KnowledgeHandler) ListKnowledgeBases(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) pagesize := c.DefaultQuery("page_size", "10") page := c.DefaultQuery("page", "1") limit, _ := strconv.Atoi(pagesize) offset, _ := strconv.Atoi(page) var bases []models.KnowledgeBase var total int64 db := database.DB.Where("tenant_id = ?", tenantID) db.Count(\&total) db.Order("sort_order ASC, created_at DESC").Limit(limit).Offset((offset-1)*limit).Find(\&bases) c.JSON(200, gin.H{ "total": total, "page": page, "page_size": limit, "knowledge_bases": bases, }) } // 创建知识库 func (h *KnowledgeHandler) CreateKnowledgeBase(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) var base models.KnowledgeBase if err := c.ShouldBindJSON(\&base); err != nil { c.JSON(400, gin.H{"error": "参数错误", "message": err.Error()}) return } base.TenantID = tenantID if base.Status == "" { base.Status = models.KBStatusDraft } if err := database.DB.Create(\&base).Error; err != nil { c.JSON(500, gin.H{"error": "创建失败", "message": err.Error()}) return } c.JSON(201, gin.H{ "message": "知识库创建成功", "base_id": base.ID, }) } // 更新知识库 func (h *KnowledgeHandler) UpdateKnowledgeBase(c *gin.Context) { idStr := c.Param("id") id, _ := strconv.ParseUint(idStr, 10, 32) var base models.KnowledgeBase if err := database.DB.First(\&base, uint(id)).Error; err != nil { c.JSON(404, gin.H{"error": "知识库不存在"}) return } if err := c.ShouldBindJSON(\&base); err != nil { c.JSON(400, gin.H{"error": "参数错误", "message": err.Error()}) return } if err := database.DB.Save(\&base).Error; err != nil { c.JSON(500, gin.H{"error": "更新失败", "message": err.Error()}) return } c.JSON(200, gin.H{"message": "知识库更新成功"}) } // 删除知识库 func (h *KnowledgeHandler) DeleteKnowledgeBase(c *gin.Context) { idStr := c.Param("id") id, _ := strconv.ParseUint(idStr, 10, 32) if err := database.DB.Delete(\&models.KnowledgeBase{}, uint(id)).Error; err != nil { c.JSON(500, gin.H{"error": "删除失败", "message": err.Error()}) return } c.JSON(200, gin.H{"message": "知识库删除成功"}) } // 知识条目列表 func (h *KnowledgeHandler) ListKnowledgeItems(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) status := c.Query("status") pagesize := c.DefaultQuery("page_size", "10") page := c.DefaultQuery("page", "1") limit, _ := strconv.Atoi(pagesize) offset, _ := strconv.Atoi(page) var items []models.KnowledgeItem var total int64 db := database.DB.Where("tenant_id = ?", tenantID) if status != "" { db = db.Where("status = ?", status) } db.Count(\&total) db.Preload("KnowledgeBase").Order("updated_at DESC").Limit(limit).Offset((offset-1)*limit).Find(\&items) c.JSON(200, gin.H{ "total": total, "page": page, "page_size": limit, "items": items, }) } // 创建知识条目 func (h *KnowledgeHandler) CreateKnowledgeItem(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) knowledgeBaseID := c.PostForm("knowledge_base_id") var item models.KnowledgeItem if err := c.ShouldBindJSON(\&item); err != nil { c.JSON(400, gin.H{"error": "参数错误", "message": err.Error()}) return } item.TenantID = tenantID if knowledgeBaseID != "" { kbID, _ := strconv.ParseUint(knowledgeBaseID, 10, 32) item.KnowledgeBaseID = uint(kbID) } if item.Status == "" { item.Status = models.KnowledgeStatusDraft } if err := database.DB.Create(\&item).Error; err != nil { c.JSON(500, gin.H{"error": "创建失败", "message": err.Error()}) return } c.JSON(201, gin.H{ "message": "知识条目创建成功", "item_id": item.ID, }) } // 更新知识条目 func (h *KnowledgeHandler) UpdateKnowledgeItem(c *gin.Context) { idStr := c.Param("id") id, _ := strconv.ParseUint(idStr, 10, 32) var item models.KnowledgeItem if err := database.DB.First(\&item, uint(id)).Error; err != nil { c.JSON(404, gin.H{"error": "知识条目不存在"}) return } if err := c.ShouldBindJSON(\&item); err != nil { c.JSON(400, gin.H{"error": "参数错误", "message": err.Error()}) return } if err := database.DB.Save(\&item).Error; err != nil { c.JSON(500, gin.H{"error": "更新失败", "message": err.Error()}) return } c.JSON(200, gin.H{"message": "知识条目更新成功"}) } // 删除知识条目 func (h *KnowledgeHandler) DeleteKnowledgeItem(c *gin.Context) { idStr := c.Param("id") id, _ := strconv.ParseUint(idStr, 10, 32) if err := database.DB.Delete(\&models.KnowledgeItem{}, uint(id)).Error; err != nil { c.JSON(500, gin.H{"error": "删除失败", "message": err.Error()}) return } c.JSON(200, gin.H{"message": "知识条目删除成功"}) } // 搜索知识条目 func (h *KnowledgeHandler) Search(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) keyword := c.Query("keyword") category := c.Query("category") var items []models.KnowledgeItem db := database.DB.Where("tenant_id = ? AND (title LIKE ? OR content LIKE ?)", tenantID, "%"+keyword+"%", "%"+keyword+"%") if category != "" { db = db.Where("category = ?", category) } db.Preload("KnowledgeBase").Limit(20).Find(\&items) c.JSON(200, gin.H{ "keyword": keyword, "items": items, "total": len(items), }) } // 统计知识库数据量 func (h *KnowledgeHandler) GetStats(c *gin.Context) { tenantID, _ := c.Get("tenant_id").(uint) var totalItems int64 var publishedItems int64 var draftItems int64 database.DB.Model(\&models.KnowledgeItem{}).Where("tenant_id = ?", tenantID).Count(\&totalItems) database.DB.Model(\&models.KnowledgeItem{}).Where("tenant_id = ? AND status = ?", tenantID, models.KnowledgeStatusPublished).Count(\&publishedItems) database.DB.Model(\&models.KnowledgeItem{}).Where("tenant_id = ? AND status = ?", tenantID, models.KnowledgeStatusDraft).Count(\&draftItems) c.JSON(200, gin.H{ "total_items": totalItems, "published": publishedItems, "draft": draftItems, }) }