This commit is contained in:
Eric 1549169735@qq.com
2026-09-13 20:08:13 +08:00
parent 7cc06976ab
commit da3f16e6db
65 changed files with 3855 additions and 2153 deletions

View File

@@ -18,8 +18,6 @@ func EnqueueBackfill(db *gorm.DB) (int, error) {
{"scenario_field", &model.ScenarioField{}},
{"scenario_rule", &model.ScenarioRule{}},
{"sop", &model.SOP{}},
{"knowledge_item", &model.KnowledgeItem{}},
{"knowledge_relation", &model.KnowledgeRelation{}},
{"sop_run", &model.SOPRun{}},
}
count := 0

View File

@@ -33,10 +33,6 @@ func (p *Projector) Project(ctx context.Context, event model.MultiTableOutbox) e
return p.scenarioRule(ctx, event)
case "sop":
return p.sop(ctx, event)
case "knowledge_item":
return p.knowledgeItem(ctx, event)
case "knowledge_relation":
return p.knowledgeRelation(ctx, event)
case "sop_run":
if err := p.run(ctx, event); err != nil {
return err
@@ -184,55 +180,6 @@ func (p *Projector) sop(ctx context.Context, event model.MultiTableOutbox) error
return nil
}
func (p *Projector) knowledgeItem(ctx context.Context, event model.MultiTableOutbox) error {
var item model.KnowledgeItem
err := p.db.Where("id = ? AND tenant_id = ?", event.ResourceID, event.TenantID).First(&item).Error
if err == nil {
return p.client.Upsert(ctx, p.tables.KnowledgeItems, id(item.ID), knowledgeItemProjection(item, statusFor(item.Status)))
}
if !errors.Is(err, gorm.ErrRecordNotFound) || event.Action != "archive" {
return err
}
var payload struct {
ScenarioID uint64 `json:"scenario_id"`
Key string `json:"key"`
Name string `json:"name"`
Type string `json:"type"`
Status string `json:"status"`
SortOrder int `json:"sort_order"`
}
if err := json.Unmarshal(event.Payload, &payload); err != nil {
return err
}
return p.client.Upsert(ctx, p.tables.KnowledgeItems, id(event.ResourceID), common(event.ResourceID, event.TenantID, "已归档", event.UpdatedAt, map[string]interface{}{
"场景来源ID": id(payload.ScenarioID), "知识标识": payload.Key, "名称": payload.Name, "知识类型": payload.Type, "知识状态": payload.Status, "排序": payload.SortOrder,
}))
}
func (p *Projector) knowledgeRelation(ctx context.Context, event model.MultiTableOutbox) error {
var item model.KnowledgeRelation
err := p.db.Where("id = ? AND tenant_id = ?", event.ResourceID, event.TenantID).First(&item).Error
if err == nil {
return p.client.Upsert(ctx, p.tables.KnowledgeRelations, id(item.ID), knowledgeRelationProjection(item, "正常"))
}
if !errors.Is(err, gorm.ErrRecordNotFound) || event.Action != "archive" {
return err
}
var payload struct {
ScenarioID uint64 `json:"scenario_id"`
FromKnowledge uint64 `json:"from_knowledge_id"`
RelationType string `json:"relation_type"`
ToKnowledge uint64 `json:"to_knowledge_id"`
SortOrder int `json:"sort_order"`
}
if err := json.Unmarshal(event.Payload, &payload); err != nil {
return err
}
return p.client.Upsert(ctx, p.tables.KnowledgeRelations, id(event.ResourceID), common(event.ResourceID, event.TenantID, "已归档", event.UpdatedAt, map[string]interface{}{
"场景来源ID": id(payload.ScenarioID), "起点知识来源ID": id(payload.FromKnowledge), "关系类型": payload.RelationType, "终点知识来源ID": id(payload.ToKnowledge), "排序": payload.SortOrder,
}))
}
func (p *Projector) run(ctx context.Context, event model.MultiTableOutbox) error {
var row struct {
model.SOPRun
@@ -282,14 +229,6 @@ func scenarioRuleProjection(item model.ScenarioRule, status string) map[string]i
return common(item.ID, item.TenantID, status, item.UpdatedAt, map[string]interface{}{"场景来源ID": id(item.ScenarioID), "规则标识": item.RuleKey, "名称": item.Name, "优先级": item.Priority, "规则状态": item.Status})
}
func knowledgeItemProjection(item model.KnowledgeItem, status string) map[string]interface{} {
return common(item.ID, item.TenantID, status, item.UpdatedAt, map[string]interface{}{"场景来源ID": id(item.ScenarioID), "知识标识": item.ItemKey, "名称": item.Name, "知识类型": item.Type, "知识状态": item.Status, "排序": item.SortOrder})
}
func knowledgeRelationProjection(item model.KnowledgeRelation, status string) map[string]interface{} {
return common(item.ID, item.TenantID, status, item.UpdatedAt, map[string]interface{}{"场景来源ID": id(item.ScenarioID), "起点知识来源ID": id(item.FromKnowledgeID), "关系类型": item.RelationType, "终点知识来源ID": id(item.ToKnowledgeID), "排序": item.SortOrder})
}
func id(value uint64) string { return strconv.FormatUint(value, 10) }
func formatTime(value *time.Time) string {
if value == nil {

View File

@@ -15,8 +15,6 @@ func TestNewResourceProjections(t *testing.T) {
want map[string]interface{}
}{
{"scenario rule", scenarioRuleProjection(model.ScenarioRule{Base: model.Base{ID: 11, UpdatedAt: now}, TenantID: 2, ScenarioID: 3, RuleKey: "match", Name: "匹配", Priority: 10, Status: "active"}, "正常"), map[string]interface{}{"来源ID": "11", "场景来源ID": "3", "规则标识": "match", "优先级": 10}},
{"knowledge item", knowledgeItemProjection(model.KnowledgeItem{Base: model.Base{ID: 12, UpdatedAt: now}, TenantID: 2, ScenarioID: 3, ItemKey: "soft", Name: "软便", Type: "symptom", Status: "active", SortOrder: 4}, "正常"), map[string]interface{}{"来源ID": "12", "知识标识": "soft", "知识类型": "symptom", "排序": 4}},
{"knowledge relation", knowledgeRelationProjection(model.KnowledgeRelation{Base: model.Base{ID: 13, UpdatedAt: now}, TenantID: 2, ScenarioID: 3, FromKnowledgeID: 12, RelationType: "recommended_copy", ToKnowledgeID: 14, SortOrder: 5}, "正常"), map[string]interface{}{"来源ID": "13", "起点知识来源ID": "12", "关系类型": "recommended_copy", "终点知识来源ID": "14"}},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {