From af0cfce78fa19e781e8c6e8b9e4d8b2f0600e194 Mon Sep 17 00:00:00 2001 From: douxu Date: Wed, 30 Apr 2025 16:44:58 +0800 Subject: [PATCH] refactor(component set): add the return value of component query func 1.add the return value of topologic query func refactor(diagram set): add the return value of topologic query func 1.add the return value of topologic query func 2.modify internalLockLeaseTime params unit 3.modify refreshTime params unit 4.modify lua script feat(bay info): init interval information constructor 1.init interval information constructor test(sql case): add new pg sql case 1. add new pg sql case --- database/query_component.go | 24 +++++++++++-- database/query_topologic.go | 20 ++++++++--- go.mod | 3 ++ go.sum | 8 +++++ main.go | 26 ++++++++++++-- test/orm/topologic_test.go | 69 +++++++++++++++++++++++++++++++++++++ 6 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 test/orm/topologic_test.go diff --git a/database/query_component.go b/database/query_component.go index 18471a9..1d44f20 100644 --- a/database/query_component.go +++ b/database/query_component.go @@ -16,7 +16,7 @@ import ( ) // QueryCircuitDiagramComponentFromDB return the result of query circuit diagram component info order by page id from postgresDB -func QueryCircuitDiagramComponentFromDB(ctx context.Context, tx *gorm.DB, pool *ants.PoolWithFunc, logger *zap.Logger) error { +func QueryCircuitDiagramComponentFromDB(ctx context.Context, tx *gorm.DB, pool *ants.PoolWithFunc, logger *zap.Logger) (map[uuid.UUID]int, error) { var components []orm.Component // ctx超时判断 cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second) @@ -25,16 +25,20 @@ func QueryCircuitDiagramComponentFromDB(ctx context.Context, tx *gorm.DB, pool * result := tx.WithContext(cancelCtx).Clauses(clause.Locking{Strength: "UPDATE"}).Find(&components) if result.Error != nil { logger.Error("query circuit diagram component info failed", zap.Error(result.Error)) - return result.Error + return nil, result.Error } + componentTypeMap := make(map[uuid.UUID]int, len(components)) + for _, component := range components { pool.Invoke(config.ModelParseConfig{ ComponentInfo: component, Context: ctx, }) + + componentTypeMap[component.GlobalUUID] = component.ComponentType } - return nil + return componentTypeMap, nil } // QueryComponentByUUID return the result of query circuit diagram component info by uuid from postgresDB @@ -50,3 +54,17 @@ func QueryComponentByUUID(ctx context.Context, tx *gorm.DB, uuid uuid.UUID) (orm } return component, nil } + +// QueryComponentByPageID return the result of query circuit diagram component info by page id from postgresDB +func QueryComponentByPageID(ctx context.Context, tx *gorm.DB, uuid uuid.UUID) (orm.Component, error) { + var component orm.Component + // ctx超时判断 + cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + result := tx.WithContext(cancelCtx).Where("page_id = ? ", uuid).Clauses(clause.Locking{Strength: "UPDATE"}).Find(&component) + if result.Error != nil { + return orm.Component{}, result.Error + } + return component, nil +} diff --git a/database/query_topologic.go b/database/query_topologic.go index c21ba86..1aeecca 100644 --- a/database/query_topologic.go +++ b/database/query_topologic.go @@ -30,28 +30,30 @@ func QueryTopologicByPageID(ctx context.Context, tx *gorm.DB, logger *zap.Logger return topologics, nil } +// TODO 电流互感器不单独划分间隔 +// TODO 以母线、浇筑母线、变压器为间隔原件 // QueryTopologicFromDB return the result of query topologic info from postgresDB -func QueryTopologicFromDB(ctx context.Context, tx *gorm.DB, logger *zap.Logger, gridID, zoneID, stationID int64) error { +func QueryTopologicFromDB(ctx context.Context, tx *gorm.DB, logger *zap.Logger, gridID, zoneID, stationID int64) ([]orm.Page, 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 + return nil, err } for _, page := range allPages { 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 + return nil, err } err = InitCircuitDiagramTopologic(page.ID, topologicInfos) if err != nil { logger.Error("init topologic failed", zap.Error(err)) - return err + return nil, err } } - return nil + return allPages, nil } // InitCircuitDiagramTopologic return circuit diagram topologic info from postgres @@ -77,3 +79,11 @@ func InitCircuitDiagramTopologic(pageID int64, topologicNodes []orm.Topologic) e diagram.StoreGraphMap(pageID, topologicSet) return nil } + +func IntervalBoundaryDetermine(pageID int64, uuid uuid.UUID) bool { + // TODO 从diagramsOverview中根据 uuid 获取 component 信息 + var componentID int64 + diagram.GetComponentMap(componentID) + // TODO 判断 component 的类型是否为间隔 + return true +} diff --git a/go.mod b/go.mod index f1591bf..bfab534 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module modelRT go 1.22.5 require ( + github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/bitly/go-simplejson v0.5.1 github.com/confluentinc/confluent-kafka-go v1.9.2 github.com/gin-gonic/gin v1.10.0 @@ -19,6 +20,7 @@ require ( github.com/swaggo/swag v1.16.4 go.uber.org/zap v1.27.0 golang.org/x/sys v0.28.0 + gorm.io/driver/mysql v1.5.7 gorm.io/driver/postgres v1.5.9 gorm.io/gorm v1.25.12 ) @@ -43,6 +45,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.23.0 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect diff --git a/go.sum b/go.sum index 2f08fc6..e0dd779 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= @@ -87,6 +89,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -157,6 +161,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= @@ -405,8 +410,11 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index a0086cb..b185b00 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ package main import ( "context" "flag" + "fmt" "time" "modelRT/alert" @@ -101,18 +102,39 @@ func main() { postgresDBClient.Transaction(func(tx *gorm.DB) error { // load circuit diagram from postgres - err := database.QueryCircuitDiagramComponentFromDB(cancelCtx, tx, parsePool, zapLogger) + componentTypeMap, err := database.QueryCircuitDiagramComponentFromDB(cancelCtx, tx, parsePool, zapLogger) if err != nil { zapLogger.Error("load circuit diagrams from postgres failed", zap.Error(err)) panic(err) } // TODO 暂时屏蔽完成 swagger 启动测试 - err = database.QueryTopologicFromDB(ctx, tx, zapLogger, modelRTConfig.GridID, modelRTConfig.ZoneID, modelRTConfig.StationID) + // TODO 将componentTypeMap传入QueryTopologicFromDB中 + pages, err := database.QueryTopologicFromDB(ctx, tx, zapLogger, modelRTConfig.GridID, modelRTConfig.ZoneID, modelRTConfig.StationID) if err != nil { zapLogger.Error("load topologic info from postgres failed", zap.Error(err)) panic(err) } + + for _, page := range pages { + graph, err := diagram.GetGraphMap(page.ID) + if err != nil { + // TODO 增加报错日志错误 + continue + } + + rootNode := graph.RootVertex.String() + links := graph.VerticeLinks[rootNode] + for { + for _, link := range links { + fmt.Println(link) + } + // TODO 重置 links + } + + } + fmt.Println(componentTypeMap) + return nil }) diff --git a/test/orm/topologic_test.go b/test/orm/topologic_test.go new file mode 100644 index 0000000..c107d35 --- /dev/null +++ b/test/orm/topologic_test.go @@ -0,0 +1,69 @@ +package orm_test + +import ( + "context" + "database/sql" + "os" + "regexp" + "testing" + + "modelRT/database" + "modelRT/network" + "modelRT/orm" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/gofrs/uuid" + "github.com/stretchr/testify/assert" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +var ( + mock sqlmock.Sqlmock + err error + baseDB *sql.DB + pgClient *gorm.DB +) + +func TestMain(m *testing.M) { + baseDB, mock, err = sqlmock.New() + if err != nil { + panic(err) + } + // 把项目使用的DB连接换成sqlmock的DB连接 + pgClient, _ = gorm.Open(mysql.New(mysql.Config{ + Conn: baseDB, + SkipInitializeWithVersion: true, + DefaultStringSize: 0, + })) + os.Exit(m.Run()) +} + +func TestUserDao_CreateUser(t *testing.T) { + topologicInfo := &orm.Topologic{ + PageID: 1, + UUIDFrom: uuid.FromStringOrNil("70c190f2-8a60-42a9-b143-ec5f87e0aa6b"), + UUIDTo: uuid.FromStringOrNil("70c190f2-8a75-42a9-b166-ec5f87e0aa6b"), + Comment: "test", + Flag: 1, + } + + // ud := dao2.NewUserDao(context.TODO()) + mock.ExpectBegin() + mock.ExpectExec(regexp.QuoteMeta("INSERT INTO `Topologic`")). + WithArgs(topologicInfo.PageID, topologicInfo.Flag, topologicInfo.UUIDFrom, topologicInfo.UUIDTo, topologicInfo.Comment). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + + err := database.CreateTopologicIntoDB(context.TODO(), pgClient, 1, []network.TopologicUUIDCreateInfo{ + { + UUIDFrom: uuid.FromStringOrNil("70c190f2-8a60-42a9-b143-ec5f87e0aa6b"), + UUIDTo: uuid.FromStringOrNil("70c190f2-8a75-42a9-b166-ec5f87e0aa6b"), + Comment: "test", + Flag: 1, + }, + }) + assert.Nil(t, err) + err = mock.ExpectationsWereMet() + assert.Nil(t, err) +}