package run import ( "encoding/json" "git.iwork-ai.com/xdc/iqudo-top1/internal/model" "gorm.io/gorm" ) type KnowledgeView struct { CardID uint64 `json:"card_id"` CardVersionID uint64 `json:"card_version_id"` Version int `json:"version"` Title string `json:"title"` StandardCopy string `json:"standard_copy"` ForbiddenCopy string `json:"forbidden_copy"` RiskNote string `json:"risk_note"` } type NodeView struct { model.SOPNode Knowledge *KnowledgeView `json:"knowledge,omitempty"` } type knowledgeNodeConfig struct { KnowledgeCardID uint64 `json:"knowledge_card_id"` KnowledgeCardVersionID uint64 `json:"knowledge_card_version_id"` } func (h *Handler) nodeView(db *gorm.DB, node model.SOPNode, tenantID uint64) (NodeView, error) { view := NodeView{SOPNode: node} if node.Type != "knowledge" { return view, nil } knowledge, err := loadKnowledgeView(db, node, tenantID) if err != nil { return view, err } view.Knowledge = &knowledge return view, nil } func loadKnowledgeView(db *gorm.DB, node model.SOPNode, tenantID uint64) (KnowledgeView, error) { var config knowledgeNodeConfig if err := json.Unmarshal(node.Config, &config); err != nil { return KnowledgeView{}, err } type row struct { model.KnowledgeCardVersion Title string `gorm:"column:title"` } var version row query := db.Table("knowledge_card_versions kv").Select("kv.*, kc.title"). Joins("JOIN knowledge_cards kc ON kc.id = kv.knowledge_card_id"). Where("kv.tenant_id = ? AND kc.tenant_id = ? AND kv.knowledge_card_id = ?", tenantID, tenantID, config.KnowledgeCardID) if config.KnowledgeCardVersionID != 0 { query = query.Where("kv.id = ?", config.KnowledgeCardVersionID) } else { query = query.Where("kv.status = ?", "published").Order("kv.version DESC") } if err := query.First(&version).Error; err != nil { return KnowledgeView{}, err } var content struct { StandardCopy string `json:"standard_copy"` ForbiddenCopy string `json:"forbidden_copy"` RiskNote string `json:"risk_note"` } if err := json.Unmarshal(version.Content, &content); err != nil { return KnowledgeView{}, err } return KnowledgeView{ CardID: version.KnowledgeCardID, CardVersionID: version.ID, Version: version.Version, Title: version.Title, StandardCopy: content.StandardCopy, ForbiddenCopy: content.ForbiddenCopy, RiskNote: content.RiskNote, }, nil }