2024-11-22 16:41:04 +08:00
|
|
|
// Package database define database operation functions
|
|
|
|
|
package database
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"time"
|
|
|
|
|
|
2024-11-27 09:11:48 +08:00
|
|
|
"modelRT/diagram"
|
2024-11-22 16:41:04 +08:00
|
|
|
"modelRT/orm"
|
2024-12-03 16:38:17 +08:00
|
|
|
"modelRT/sql"
|
2024-11-22 16:41:04 +08:00
|
|
|
|
2024-11-27 09:11:48 +08:00
|
|
|
"github.com/gofrs/uuid"
|
2024-11-22 16:41:04 +08:00
|
|
|
"go.uber.org/zap"
|
2025-01-09 15:56:40 +08:00
|
|
|
"gorm.io/gorm"
|
2024-11-22 16:41:04 +08:00
|
|
|
"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) {
|
2024-11-22 16:41:04 +08:00
|
|
|
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)
|
2024-11-22 16:41:04 +08:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-27 09:11:48 +08:00
|
|
|
// 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)
|
2024-11-27 09:11:48 +08:00
|
|
|
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)
|
2024-11-27 09:11:48 +08:00
|
|
|
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)
|
2024-11-27 09:11:48 +08:00
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("init topologic failed", zap.Error(err))
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-22 16:41:04 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
2024-12-03 16:38:17 +08:00
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
}
|