feat: complete pet SOP governance workflow
This commit is contained in:
63
internal/scenario/references.go
Normal file
63
internal/scenario/references.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user