feat: complete pet SOP governance workflow

This commit is contained in:
Eric 1549169735@qq.com
2026-08-08 22:58:35 +08:00
parent 97a76250f7
commit 4b240499c2
85 changed files with 1316 additions and 269 deletions

View File

@@ -0,0 +1,63 @@
package scenario
import (
"encoding/json"
"git.iwork-ai.com/xdc/iqudo-top1/internal/model"
)
func (h *Handler) fieldReferencedByReleasedSOP(scenarioID uint64, fieldKey string, tenantID uint64) bool {
statuses := []string{"published", "offline", "superseded"}
var nodes []model.SOPNode
err := h.db.Table("sop_nodes n").Select("n.*").Joins("JOIN sop_versions sv ON sv.id = n.sop_version_id").Joins("JOIN sops s ON s.id = sv.sop_id").Where("s.scenario_id = ? AND n.tenant_id = ? AND sv.status IN ?", scenarioID, tenantID, statuses).Scan(&nodes).Error
if err != nil {
return true
}
for _, node := range nodes {
if jsonReferencesField(node.Config, fieldKey) {
return true
}
}
var edges []model.SOPEdge
err = h.db.Table("sop_edges e").Select("e.*").Joins("JOIN sop_versions sv ON sv.id = e.sop_version_id").Joins("JOIN sops s ON s.id = sv.sop_id").Where("s.scenario_id = ? AND e.tenant_id = ? AND sv.status IN ?", scenarioID, tenantID, statuses).Scan(&edges).Error
if err != nil {
return true
}
for _, edge := range edges {
if jsonReferencesField(edge.Condition, fieldKey) {
return true
}
}
return false
}
func jsonReferencesField(raw []byte, fieldKey string) bool {
var value interface{}
if err := json.Unmarshal(raw, &value); err != nil {
return true
}
return valueReferencesField(value, fieldKey)
}
func valueReferencesField(value interface{}, fieldKey string) bool {
switch typed := value.(type) {
case map[string]interface{}:
for key, child := range typed {
if key == "field_key" || key == "field" {
if child == fieldKey {
return true
}
}
if valueReferencesField(child, fieldKey) {
return true
}
}
case []interface{}:
for _, child := range typed {
if child == fieldKey || valueReferencesField(child, fieldKey) {
return true
}
}
}
return false
}