2024-11-22 16:41:04 +08:00
|
|
|
|
// entry function
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"flag"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"modelRT/config"
|
|
|
|
|
|
"modelRT/database"
|
2024-12-06 16:13:11 +08:00
|
|
|
|
_ "modelRT/docs"
|
2024-11-22 16:41:04 +08:00
|
|
|
|
"modelRT/handler"
|
2024-12-25 16:34:57 +08:00
|
|
|
|
"modelRT/logger"
|
2024-11-22 16:41:04 +08:00
|
|
|
|
"modelRT/middleware"
|
2024-12-05 14:57:23 +08:00
|
|
|
|
"modelRT/pool"
|
2024-12-18 16:25:49 +08:00
|
|
|
|
realtimedata "modelRT/real-time-data"
|
2024-11-22 16:41:04 +08:00
|
|
|
|
|
2024-12-06 16:13:11 +08:00
|
|
|
|
swaggerFiles "github.com/swaggo/files"
|
|
|
|
|
|
ginSwagger "github.com/swaggo/gin-swagger"
|
|
|
|
|
|
|
2024-11-22 16:41:04 +08:00
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
"github.com/panjf2000/ants/v2"
|
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var limiter *middleware.Limiter
|
|
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
|
limiter = middleware.NewLimiter(10, 1*time.Minute) // 设置限流器,允许每分钟最多请求10次
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
modelRTConfigDir = flag.String("modelRT_config_dir", "./config", "config file dir of model runtime service")
|
|
|
|
|
|
modelRTConfigName = flag.String("modelRT_config_name", "config", "config file name of model runtime service")
|
|
|
|
|
|
modelRTConfigType = flag.String("modelRT_config_type", "yaml", "config file type of model runtime service")
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
modelRTConfig config.ModelRTConfig
|
|
|
|
|
|
postgresDBClient *gorm.DB
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger *zap.Logger
|
2024-11-22 16:41:04 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2024-12-02 16:13:16 +08:00
|
|
|
|
// TODO 使用 wire 依赖注入管理 DVIE 面板注册的 panel
|
2024-11-22 16:41:04 +08:00
|
|
|
|
func main() {
|
|
|
|
|
|
flag.Parse()
|
|
|
|
|
|
ctx := context.TODO()
|
|
|
|
|
|
|
|
|
|
|
|
modelRTConfig = config.ReadAndInitConfig(*modelRTConfigDir, *modelRTConfigName, *modelRTConfigType)
|
|
|
|
|
|
// init postgresDBClient
|
2024-11-28 15:29:34 +08:00
|
|
|
|
postgresDBClient = database.InitPostgresDBInstance(ctx, modelRTConfig.PostgresDBURI)
|
2024-11-22 16:41:04 +08:00
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
sqlDB, err := postgresDBClient.DB()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
sqlDB.Close()
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// init logger
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger = logger.InitLoggerInstance(modelRTConfig.LoggerConfig)
|
|
|
|
|
|
defer zapLogger.Sync()
|
2024-11-22 16:41:04 +08:00
|
|
|
|
|
2024-12-18 16:25:49 +08:00
|
|
|
|
// init model parse ants pool
|
|
|
|
|
|
parsePool, err := ants.NewPoolWithFunc(modelRTConfig.ParseConcurrentQuantity, pool.ParseFunc)
|
2024-11-22 16:41:04 +08:00
|
|
|
|
if err != nil {
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger.Error("init concurrent parse task pool failed", zap.Error(err))
|
2024-11-22 16:41:04 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
2024-12-18 16:25:49 +08:00
|
|
|
|
defer parsePool.Release()
|
|
|
|
|
|
|
|
|
|
|
|
// init data polling ants pool
|
2024-12-26 15:03:20 +08:00
|
|
|
|
pollingPool, err := ants.NewPoolWithFunc(modelRTConfig.PollingConcurrentQuantity, pool.AnchorFunc)
|
2024-12-18 16:25:49 +08:00
|
|
|
|
if err != nil {
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger.Error("init concurrent data polling task pool failed", zap.Error(err))
|
2024-12-18 16:25:49 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
defer pollingPool.Release()
|
|
|
|
|
|
|
|
|
|
|
|
// init data polling
|
|
|
|
|
|
cancelCtx, cancel := context.WithCancel(ctx)
|
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
go realtimedata.DataPolling(cancelCtx, pollingPool)
|
2024-11-22 16:41:04 +08:00
|
|
|
|
|
|
|
|
|
|
// load circuit diagram from postgres
|
2024-12-25 16:34:57 +08:00
|
|
|
|
err = database.QueryCircuitDiagramComponentFromDB(ctx, parsePool, zapLogger)
|
2024-11-22 16:41:04 +08:00
|
|
|
|
if err != nil {
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger.Error("load circuit diagrams from postgres failed", zap.Error(err))
|
2024-11-22 16:41:04 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-06 16:13:11 +08:00
|
|
|
|
// TODO 暂时屏蔽完成 swagger 启动测试
|
2024-12-25 16:34:57 +08:00
|
|
|
|
err = database.QueryTopologicFromDB(ctx, zapLogger, modelRTConfig.GridID, modelRTConfig.ZoneID, modelRTConfig.StationID)
|
2024-11-27 09:11:48 +08:00
|
|
|
|
if err != nil {
|
2024-12-25 16:34:57 +08:00
|
|
|
|
zapLogger.Error("load topologic info from postgres failed", zap.Error(err))
|
2024-11-27 09:11:48 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-05 14:57:23 +08:00
|
|
|
|
// TODO 完成订阅数据分析
|
2024-12-06 16:13:11 +08:00
|
|
|
|
// TODO 暂时屏蔽完成 swagger 启动测试
|
2024-12-18 16:25:49 +08:00
|
|
|
|
go realtimedata.RealTimeDataComputer(ctx, nil, []string{}, "")
|
2024-12-05 14:57:23 +08:00
|
|
|
|
|
2024-11-22 16:41:04 +08:00
|
|
|
|
engine := gin.Default()
|
|
|
|
|
|
engine.Use(limiter.Middleware)
|
2024-12-12 16:17:31 +08:00
|
|
|
|
|
|
|
|
|
|
// diagram api
|
2024-11-27 16:48:11 +08:00
|
|
|
|
engine.GET("/model/diagram_load", handler.CircuitDiagramLoadHandler)
|
2024-12-05 14:57:23 +08:00
|
|
|
|
engine.POST("/model/diagram_create", handler.CircuitDiagramCreateHandler)
|
2024-12-02 16:13:16 +08:00
|
|
|
|
engine.POST("/model/diagram_update", handler.CircuitDiagramUpdateHandler)
|
2024-12-04 15:57:11 +08:00
|
|
|
|
engine.POST("/model/diagram_delete", handler.CircuitDiagramDeleteHandler)
|
2024-11-22 16:41:04 +08:00
|
|
|
|
|
2024-12-20 16:06:42 +08:00
|
|
|
|
// anchor api
|
|
|
|
|
|
engine.POST("/model/anchor_replace", handler.ComponentAnchorReplaceHandler)
|
|
|
|
|
|
|
2024-12-12 16:17:31 +08:00
|
|
|
|
// dashborad api
|
|
|
|
|
|
dashboard := engine.Group("/dashboard", limiter.Middleware)
|
|
|
|
|
|
{
|
|
|
|
|
|
dashboard.GET("/load", nil)
|
|
|
|
|
|
dashboard.GET("/query", nil)
|
|
|
|
|
|
dashboard.POST("/create", nil)
|
|
|
|
|
|
dashboard.POST("/update", nil)
|
|
|
|
|
|
dashboard.POST("/delete", nil)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// engine.Group()
|
2024-12-06 16:13:11 +08:00
|
|
|
|
// Swagger UI
|
|
|
|
|
|
engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
|
|
|
|
|
|
|
|
|
|
|
// 注册 Swagger UI 路由
|
|
|
|
|
|
// docs.SwaggerInfo.BasePath = "/model"
|
|
|
|
|
|
// v1 := engine.Group("/api/v1")
|
|
|
|
|
|
// {
|
|
|
|
|
|
// eg := v1.Group("/example")
|
|
|
|
|
|
// {
|
|
|
|
|
|
// eg.GET("/helloworld", Helloworld)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
2024-11-22 16:41:04 +08:00
|
|
|
|
// start route with 8080 port
|
|
|
|
|
|
engine.Run(":8080")
|
|
|
|
|
|
|
|
|
|
|
|
// Redis hashmap 母线模型、异步电动机模型
|
|
|
|
|
|
|
|
|
|
|
|
// kv key name value busx
|
|
|
|
|
|
}
|