modelRT/database/query_topologic.go

80 lines
2.3 KiB
Go
Raw Normal View History

// Package database define database operation functions
package database
import (
"context"
"time"
"modelRT/diagram"
"modelRT/orm"
"modelRT/sql"
"github.com/gofrs/uuid"
"go.uber.org/zap"
2025-01-09 15:56:40 +08:00
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
// QueryTopologicByPageID return the topologic info of the circuit diagram query by pageID
2025-01-09 15:56:40 +08:00
func QueryTopologicByPageID(ctx context.Context, tx *gorm.DB, logger *zap.Logger, pageID int64) ([]orm.Topologic, error) {
var topologics []orm.Topologic
// ctx超时判断
cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
2025-01-09 15:56:40 +08:00
result := tx.WithContext(cancelCtx).Clauses(clause.Locking{Strength: "UPDATE"}).Raw(sql.RecursiveSQL, pageID).Scan(&topologics)
if result.Error != nil {
logger.Error("query circuit diagram topologic info by pageID failed", zap.Int64("pageID", pageID), zap.Error(result.Error))
return nil, result.Error
}
return topologics, nil
}
// QueryTopologicFromDB return the result of query topologic info from postgresDB
2025-01-09 15:56:40 +08:00
func QueryTopologicFromDB(ctx context.Context, tx *gorm.DB, logger *zap.Logger, gridID, zoneID, stationID int64) error {
allPages, err := QueryAllPages(ctx, tx, logger, gridID, zoneID, stationID)
if err != nil {
logger.Error("query all pages info failed", zap.Int64("gridID", gridID), zap.Int64("zoneID", zoneID), zap.Int64("stationID", stationID), zap.Error(err))
return err
}
for _, page := range allPages {
2025-01-09 15:56:40 +08:00
topologicInfos, err := QueryTopologicByPageID(ctx, tx, logger, page.ID)
if err != nil {
logger.Error("query topologic info by pageID failed", zap.Int64("pageID", page.ID), zap.Error(err))
return err
}
2025-01-09 15:56:40 +08:00
2024-11-27 15:41:22 +08:00
err = InitCircuitDiagramTopologic(page.ID, topologicInfos)
if err != nil {
logger.Error("init topologic failed", zap.Error(err))
return err
}
}
return nil
}
// InitCircuitDiagramTopologic return circuit diagram topologic info from postgres
func InitCircuitDiagramTopologic(pageID int64, topologicNodes []orm.Topologic) error {
var rootVertex uuid.UUID
for _, node := range topologicNodes {
if node.UUIDFrom.IsNil() {
rootVertex = node.UUIDTo
break
}
}
topologicSet := diagram.NewGraph(rootVertex)
for _, node := range topologicNodes {
if node.UUIDFrom.IsNil() {
continue
}
// TODO 增加对 node.flag值的判断
topologicSet.AddEdge(node.UUIDFrom, node.UUIDTo)
}
diagram.StoreGraphMap(pageID, topologicSet)
return nil
}