complete model load api

This commit is contained in:
douxu 2024-11-27 15:41:22 +08:00
parent 42e7d02625
commit eba41890c6
6 changed files with 118 additions and 24 deletions

View File

@ -39,7 +39,7 @@ func QueryTopologicByPageID(ctx context.Context, logger *zap.Logger, pageID int6
} }
// InitCircuitDiagramTopologic return circuit diagram topologic info from postgres // InitCircuitDiagramTopologic return circuit diagram topologic info from postgres
func InitCircuitDiagramTopologic(topologicNodes []orm.Topologic) error { func InitCircuitDiagramTopologic(pageID int64, topologicNodes []orm.Topologic) error {
var rootVertex uuid.UUID var rootVertex uuid.UUID
for _, node := range topologicNodes { for _, node := range topologicNodes {
@ -57,6 +57,7 @@ func InitCircuitDiagramTopologic(topologicNodes []orm.Topologic) error {
} }
topologicSet.AddEdge(node.UUIDFrom, node.UUIDTo) topologicSet.AddEdge(node.UUIDFrom, node.UUIDTo)
} }
diagram.DiagramsOverview.Store(pageID, topologicSet)
return nil return nil
} }
@ -74,12 +75,11 @@ func QueryTopologicFromDB(ctx context.Context, logger *zap.Logger, gridID, zoneI
logger.Error("query topologic info by pageID failed", zap.Int64("pageID", page.ID), zap.Error(err)) logger.Error("query topologic info by pageID failed", zap.Int64("pageID", page.ID), zap.Error(err))
return err return err
} }
err = InitCircuitDiagramTopologic(topologicInfos) err = InitCircuitDiagramTopologic(page.ID, topologicInfos)
if err != nil { if err != nil {
logger.Error("init topologic failed", zap.Error(err)) logger.Error("init topologic failed", zap.Error(err))
return err return err
} }
} }
return nil return nil
} }

View File

@ -8,12 +8,14 @@ import (
cmap "github.com/orcaman/concurrent-map/v2" cmap "github.com/orcaman/concurrent-map/v2"
) )
// DiagramsOverview define struct of storage all circuit diagram data
var DiagramsOverview sync.Map var DiagramsOverview sync.Map
func GetComponentMap(key string) (*cmap.ConcurrentMap[string, any], error) { // GetComponentMap define func of get circuit diagram data by global uuid
value, ok := DiagramsOverview.Load(key) func GetComponentMap(uuid string) (*cmap.ConcurrentMap[string, any], error) {
value, ok := DiagramsOverview.Load(uuid)
if !ok { if !ok {
return nil, fmt.Errorf("can not find graph by pageID:%s", key) return nil, fmt.Errorf("can not find graph by global uuid:%s", uuid)
} }
paramsMap, ok := value.(*cmap.ConcurrentMap[string, any]) paramsMap, ok := value.(*cmap.ConcurrentMap[string, any])
if !ok { if !ok {

View File

@ -6,12 +6,14 @@ import (
"sync" "sync"
) )
// GraphOverview define struct of storage all circuit diagram topologic data
var GraphOverview sync.Map var GraphOverview sync.Map
func GetGraphMap(key string) (*Graph, error) { // GetGraphMap define func of get circuit diagram topologic data by pageID
value, ok := GraphOverview.Load(key) func GetGraphMap(pageID int64) (*Graph, error) {
value, ok := GraphOverview.Load(pageID)
if !ok { if !ok {
return nil, fmt.Errorf("can not find graph by pageID:%s", key) return nil, fmt.Errorf("can not find graph by pageID:%d", pageID)
} }
graph, ok := value.(*Graph) graph, ok := value.(*Graph)
if !ok { if !ok {

View File

@ -2,19 +2,83 @@ package handler
import ( import (
"fmt" "fmt"
"net/http"
"strconv"
"modelRT/database" "modelRT/diagram"
"modelRT/log"
"modelRT/network"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"go.uber.org/zap"
) )
// ModelLoad define model load process API // ModelLoad define model load process API
func ModelLoad(ctx *gin.Context) { func ModelLoad(c *gin.Context) {
ctx.Writer.Write([]byte("Hi Boy")) logger := log.LoggerInstance()
pgClient := database.GetPostgresDBInstance(ctx, "") pageID, err := strconv.ParseInt(c.Query("page_id"), 10, 64)
fmt.Println(pgClient) if err != nil {
// TODO logger.Error("get pageID from url param failed", zap.Error(err))
// step1 查询电路具体信息表 circuit_diagram_xxx获取所有 uuid header := network.ResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()}
// step2 根据 uuid 获取所有的电路图map 结构 resp := network.BasicResponse{
// step3 json化相关数据并返回结果 ResponseHeader: header,
PayLoad: map[string]interface{}{
"page_id": pageID,
},
}
c.JSON(http.StatusOK, resp)
}
topologicInfo, err := diagram.GetGraphMap(pageID)
if err != nil {
logger.Error("get topologic data from set by pageID failed", zap.Error(err))
header := network.ResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()}
resp := network.BasicResponse{
ResponseHeader: header,
PayLoad: map[string]interface{}{
"page_id": pageID,
},
}
c.JSON(http.StatusOK, resp)
}
payLoad := make(map[string]interface{})
payLoad["root_vertex"] = topologicInfo.RootVertex
payLoad["topologic"] = topologicInfo.VerticeLinks
componentParamMap := make(map[string][]byte)
for _, VerticeLink := range topologicInfo.VerticeLinks {
fmt.Println(VerticeLink)
for _, componentUUID := range VerticeLink {
UUIDStr := componentUUID.String()
componentParams, err := diagram.GetComponentMap(UUIDStr)
if err != nil {
logger.Error("get component data from set by uuid failed", zap.Error(err))
header := network.ResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()}
resp := network.BasicResponse{
ResponseHeader: header,
PayLoad: map[string]interface{}{
"uuid": UUIDStr,
},
}
c.JSON(http.StatusOK, resp)
}
byteSlice, err := componentParams.MarshalJSON()
if err != nil {
logger.Error("marshal component data failed", zap.Error(err))
header := network.ResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()}
resp := network.BasicResponse{
ResponseHeader: header,
}
c.JSON(http.StatusOK, resp)
}
componentParamMap[UUIDStr] = byteSlice
}
}
payLoad["component_params"] = componentParamMap
resp := network.DiagramLoadResponse{
ResponseHeader: network.ResponseHeader{Status: http.StatusOK, ErrMsg: ""},
PayLoad: payLoad,
}
c.JSON(http.StatusOK, resp)
} }

View File

@ -13,8 +13,9 @@ import (
) )
var ( var (
logger *zap.Logger once sync.Once
once sync.Once _globalLoggerMu sync.RWMutex
_globalLogger *zap.Logger
) )
// CutLogConfig define log config of wave record project // CutLogConfig define log config of wave record project
@ -69,16 +70,24 @@ func initLogger(lCfg CutLogConfig) *zap.Logger {
} }
core := zapcore.NewCore(encoder, writeSyncer, l) core := zapcore.NewCore(encoder, writeSyncer, l)
logger = zap.New(core, zap.AddCaller()) _globalLogger = zap.New(core, zap.AddCaller())
zap.ReplaceGlobals(logger) zap.ReplaceGlobals(_globalLogger)
return logger return _globalLogger
} }
// GetLoggerInstance return instance of zap logger // GetLoggerInstance return instance of zap logger
func GetLoggerInstance(lCfg CutLogConfig) *zap.Logger { func GetLoggerInstance(lCfg CutLogConfig) *zap.Logger {
once.Do(func() { once.Do(func() {
logger = initLogger(lCfg) _globalLogger = initLogger(lCfg)
}) })
return _globalLogger
}
// LoggerInstance returns the global logger instance It's safe for concurrent use.
func LoggerInstance() *zap.Logger {
_globalLoggerMu.RLock()
logger := _globalLogger
_globalLoggerMu.RUnlock()
return logger return logger
} }

17
network/resp.go Normal file
View File

@ -0,0 +1,17 @@
// Package network define struct of network operation
package network
type ResponseHeader struct {
Status int `json:"status"`
ErrMsg string `json:"err_msg"`
}
type BasicResponse struct {
ResponseHeader
PayLoad map[string]interface{} `json:"payload"`
}
type DiagramLoadResponse struct {
ResponseHeader
PayLoad map[string]interface{} `json:"payload"`
}