79 lines
2.6 KiB
Go
79 lines
2.6 KiB
Go
// Package database define database operation functions
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"modelRT/logger"
|
|
"modelRT/orm"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
// QueryArrtibuteRecordByUUID return the attribute table record info of the component attribute by uuid
|
|
func QueryArrtibuteRecordByUUID(ctx context.Context, tx *gorm.DB, gridID, zoneID, stationID int64) ([]orm.Page, error) {
|
|
var pages []orm.Page
|
|
// ctx timeout judgment
|
|
cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
defer cancel()
|
|
|
|
result := tx.Model(&orm.Page{}).WithContext(cancelCtx).Clauses(clause.Locking{Strength: "UPDATE"}).Select(`"page".id, "page".Name, "page".status,"page".context`).Joins(`inner join "station" on "station".id = "page".station_id`).Joins(`inner join "zone" on "zone".id = "station".zone_id`).Joins(`inner join "grid" on "grid".id = "zone".grid_id`).Where(`"grid".id = ? and "zone".id = ? and "station".id = ?`, gridID, zoneID, stationID).Scan(&pages)
|
|
|
|
if result.Error != nil {
|
|
logger.Error(ctx, "query circuit diagram pages by gridID and zoneID and stationID failed", "grid_id", gridID, "zone_id", zoneID, "station_id", stationID, "error", result.Error)
|
|
return nil, result.Error
|
|
}
|
|
return pages, nil
|
|
}
|
|
|
|
// GetProjectNameByTagAndGroupName 根据 tag 和 meta_model 获取项目名称
|
|
func GetProjectNameByTagAndGroupName(db *gorm.DB, tag string, groupName string) (string, error) {
|
|
var project orm.ProjectManager
|
|
|
|
// 使用 Select 只提取 name 字段,提高查询效率
|
|
// 使用 Where 进行多列条件过滤
|
|
err := db.Select("name").
|
|
Where("tag = ? AND meta_model = ?", tag, groupName).
|
|
First(&project).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return "", fmt.Errorf("project not found with tag: %s and model: %s", tag, groupName)
|
|
}
|
|
return "", err
|
|
}
|
|
|
|
return project.Name, nil
|
|
}
|
|
|
|
// BatchGetProjectNames define func to batch retrieve name based on multiple tags and metaModel
|
|
func BatchGetProjectNames(db *gorm.DB, identifiers []orm.ProjectIdentifier) (map[orm.ProjectIdentifier]string, error) {
|
|
if len(identifiers) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
var projects []orm.ProjectManager
|
|
queryArgs := make([][]any, len(identifiers))
|
|
for i, id := range identifiers {
|
|
queryArgs[i] = []any{id.Tag, id.GroupName}
|
|
}
|
|
|
|
err := db.Select("tag", "group_name", "name").
|
|
Where("(tag, group_name) IN ?", queryArgs).
|
|
Find(&projects).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resultMap := make(map[orm.ProjectIdentifier]string)
|
|
for _, p := range projects {
|
|
key := orm.ProjectIdentifier{Tag: p.Tag, GroupName: p.GroupName}
|
|
resultMap[key] = p.Name
|
|
}
|
|
|
|
return resultMap, nil
|
|
}
|