refactor: 重构更新多个文件中的相关调用
This commit is contained in:
@@ -1,13 +1,15 @@
|
||||
package kpi_c_report
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"be.ems/lib/dborm"
|
||||
"be.ems/lib/services"
|
||||
"be.ems/src/framework/database/db"
|
||||
"be.ems/src/framework/utils/parse"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
@@ -31,7 +33,7 @@ func (k *KpiCReport) Get(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
tableName := TableName() + "_" + strings.ToLower(querys.NeType)
|
||||
dbg := dborm.DefaultDB().Table(tableName)
|
||||
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
||||
|
||||
if querys.NeID != "" {
|
||||
conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=? and n.status=1)")
|
||||
@@ -69,7 +71,7 @@ func (k *KpiCReport) Get(c *gin.Context) {
|
||||
dbg = dbg.Order(orderBy)
|
||||
}
|
||||
|
||||
//err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
//err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
err := dbg.Find(&reports).Error
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
@@ -98,7 +100,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
tableName := TableName() + "_" + strings.ToLower(querys.NeType)
|
||||
dbg := dborm.DefaultDB().Table(tableName)
|
||||
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
||||
|
||||
if querys.NeID != "" {
|
||||
conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=? and n.status=1)")
|
||||
@@ -108,11 +110,11 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
if querys.StartTime != "" {
|
||||
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||
conditions = append(conditions, "created_at >= ?")
|
||||
params = append(params, querys.StartTime)
|
||||
}
|
||||
if querys.EndTime != "" {
|
||||
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||
conditions = append(conditions, "created_at <= ?")
|
||||
params = append(params, querys.EndTime)
|
||||
}
|
||||
conditions = append(conditions, "kpi_values != 'null'")
|
||||
@@ -136,7 +138,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
||||
dbg = dbg.Order(orderBy)
|
||||
}
|
||||
|
||||
//err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
//err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
err := dbg.Find(&results).Error
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
@@ -156,14 +158,24 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
||||
"createdAt": r.CreatedAt,
|
||||
"granularity": r.Granularity,
|
||||
}
|
||||
// 解析 JSON 字符串为 map
|
||||
var kpiValues []map[string]any
|
||||
err := json.Unmarshal([]byte(r.KpiValues), &kpiValues)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, k := range r.KpiValues {
|
||||
formatted := fmt.Sprintf("%.3f", k.Value)
|
||||
// 遍历 kpiValues 数组
|
||||
for _, k := range kpiValues {
|
||||
kpiId := fmt.Sprint(k["kpiId"])
|
||||
value := parse.Number(k["value"])
|
||||
|
||||
formatted := fmt.Sprintf("%.3d", value)
|
||||
formattedFloat, err := strconv.ParseFloat(formatted, 64)
|
||||
if err != nil {
|
||||
formattedFloat = 0
|
||||
}
|
||||
report[k.KPIID] = formattedFloat
|
||||
report[kpiId] = formattedFloat
|
||||
}
|
||||
reports = append(reports, report)
|
||||
}
|
||||
@@ -190,14 +202,14 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
tableName := TableName() + "_" + strings.ToLower(querys.NeType)
|
||||
dbg := dborm.DefaultDB().Table(tableName)
|
||||
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
||||
|
||||
if querys.StartTime != "" {
|
||||
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||
conditions = append(conditions, "created_at >= ?")
|
||||
params = append(params, querys.StartTime)
|
||||
}
|
||||
if querys.EndTime != "" {
|
||||
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||
conditions = append(conditions, "created_at <= ?")
|
||||
params = append(params, querys.EndTime)
|
||||
}
|
||||
conditions = append(conditions, "kpi_values != 'null'")
|
||||
@@ -230,7 +242,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
|
||||
dbg = dbg.Order(orderBy)
|
||||
}
|
||||
|
||||
//err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
//err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error
|
||||
err = dbg.Find(&reports).Error
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
@@ -259,8 +271,7 @@ func (k *KpiCReport) Total(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
tableName := TableName() + "_" + strings.ToLower(querys.NeType)
|
||||
dbg := dborm.DefaultDB().Table(tableName)
|
||||
|
||||
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
||||
if querys.StartTime != "" {
|
||||
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||
params = append(params, querys.StartTime)
|
||||
@@ -293,7 +304,8 @@ func (k *KpiCReport) Post(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
if err := dborm.DefaultDB().Create(&report).Error; err != nil {
|
||||
dbg := db.DB("").Model(&KpiCReport{})
|
||||
if err := dbg.Create(&report).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
@@ -303,8 +315,8 @@ func (k *KpiCReport) Post(c *gin.Context) {
|
||||
func (k *KpiCReport) Put(c *gin.Context) {
|
||||
var report KpiCReport
|
||||
id := c.Param("id")
|
||||
|
||||
if err := dborm.DefaultDB().First(&report, id).Error; err != nil {
|
||||
dbg := db.DB("").Model(&KpiCReport{})
|
||||
if err := dbg.First(&report, id).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found"))
|
||||
return
|
||||
}
|
||||
@@ -313,14 +325,14 @@ func (k *KpiCReport) Put(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
dborm.DefaultDB().Save(&report)
|
||||
db.DB("").Model(&KpiCReport{}).Save(&report)
|
||||
c.JSON(http.StatusOK, services.DataResp(report))
|
||||
}
|
||||
|
||||
func (k *KpiCReport) Delete(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
|
||||
if err := dborm.DefaultDB().Delete(&KpiCReport{}, id).Error; err != nil {
|
||||
if err := db.DB("").Delete(&KpiCReport{}, id).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found"))
|
||||
return
|
||||
}
|
||||
@@ -330,7 +342,8 @@ func (k *KpiCReport) Delete(c *gin.Context) {
|
||||
|
||||
func InsertKpiCReport(neType string, report KpiCReport) {
|
||||
tableName := TableName() + "_" + strings.ToLower(neType)
|
||||
if err := dborm.DefaultDB().Table(tableName).Create(&report).Error; err != nil {
|
||||
dbg := db.DB("").Model(&KpiCReport{})
|
||||
if err := dbg.Table(tableName).Create(&report).Error; err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +1,17 @@
|
||||
package kpi_c_report
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type KpiCVal struct {
|
||||
KPIID string `json:"kpi_id" gorm:"column:kpi_id"`
|
||||
Value float64 `json:"value" gorm:"column:value"`
|
||||
Err string `json:"err" gorm:"column:err"`
|
||||
}
|
||||
|
||||
type KpiCValues []KpiCVal
|
||||
|
||||
type KpiCReport struct {
|
||||
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
||||
NeType *string `gorm:"column:ne_type;default:NULL" json:"neType,omitempty"`
|
||||
NeName *string `gorm:"column:ne_name;default:" json:"neName,omitempty"`
|
||||
RmUID *string `gorm:"column:rm_uid;default:NULL" json:"rmUid,omitempty"`
|
||||
Date string `gorm:"column:date" json:"date"` // time.Time `gorm:"column:date" json:"date"`
|
||||
StartTime *string `gorm:"column:start_time;default:NULL" json:"startTime,omitempty"`
|
||||
EndTime *string `gorm:"column:end_time;default:NULL" json:"endTime,omitempty"`
|
||||
Index int16 `gorm:"column:index" json:"index"`
|
||||
Granularity *int8 `gorm:"column:granularity;default:60" json:"granularity,omitempty"` //Time granualarity: 5/10/.../60/300 (second)
|
||||
KpiValues KpiCValues `gorm:"column:kpi_values;type:json" json:"kpiValues,omitempty"`
|
||||
CreatedAt *time.Time `gorm:"column:created_at;default:current_timestamp()" json:"createdAt,omitempty"`
|
||||
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
||||
NeType *string `gorm:"column:ne_type;default:NULL" json:"neType,omitempty"`
|
||||
NeName *string `gorm:"column:ne_name;default:" json:"neName,omitempty"`
|
||||
RmUID *string `gorm:"column:rm_uid;" json:"rmUid,omitempty"`
|
||||
Date string `gorm:"column:date" json:"date"` // time.Time `gorm:"column:date" json:"date"`
|
||||
StartTime *string `gorm:"column:start_time" json:"startTime,omitempty"`
|
||||
EndTime *string `gorm:"column:end_time" json:"endTime,omitempty"`
|
||||
Index int64 `gorm:"column:index" json:"index"`
|
||||
Granularity *int64 `gorm:"column:granularity" json:"granularity,omitempty"` //Time granualarity: 5/10/.../60/300 (second)
|
||||
KpiValues string `gorm:"column:kpi_values" json:"kpiValues,omitempty"`
|
||||
CreatedAt *int64 `gorm:"column:created_at" json:"createdAt,omitempty"`
|
||||
}
|
||||
|
||||
type KpiCReportQuery struct {
|
||||
@@ -55,17 +40,3 @@ type KpiCReport2FE struct {
|
||||
func TableName() string {
|
||||
return "kpi_c_report"
|
||||
}
|
||||
|
||||
// 将 KpiCValues 转换为 JSON 字节
|
||||
func (k KpiCValues) Value() (driver.Value, error) {
|
||||
return json.Marshal(k)
|
||||
}
|
||||
|
||||
// 从字节中扫描 KpiCValues
|
||||
func (k *KpiCValues) Scan(value interface{}) error {
|
||||
b, ok := value.([]byte)
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to scan value: %v", value)
|
||||
}
|
||||
return json.Unmarshal(b, k)
|
||||
}
|
||||
|
||||
@@ -4,13 +4,16 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"be.ems/lib/dborm"
|
||||
"be.ems/lib/log"
|
||||
"be.ems/lib/services"
|
||||
"be.ems/src/framework/utils/ctx"
|
||||
"be.ems/src/framework/database/db"
|
||||
"be.ems/src/framework/reqctx"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
@@ -19,7 +22,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
||||
var titles []KpiCTitle
|
||||
var conditions []string
|
||||
var params []any
|
||||
i18n := ctx.AcceptLanguage(c)
|
||||
i18n := reqctx.AcceptLanguage(c)
|
||||
|
||||
var querys KpiCTitleQuery
|
||||
if err := c.ShouldBindQuery(&querys); err != nil {
|
||||
@@ -27,7 +30,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
dbg := dborm.DefaultDB().Table(k.TableName())
|
||||
dbg := db.DB("").Model(&KpiCTitle{})
|
||||
// construct condition to get
|
||||
if neType := querys.NeType; neType != "" {
|
||||
conditions = append(conditions, "ne_type = ?")
|
||||
@@ -37,7 +40,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
||||
conditions = append(conditions, "status = ?")
|
||||
params = append(params, status)
|
||||
} else {
|
||||
conditions = append(conditions, "status != 'Deleted'")
|
||||
conditions = append(conditions, "status != '2'")
|
||||
}
|
||||
|
||||
whereSql := ""
|
||||
@@ -81,7 +84,7 @@ func (k *KpiCTitle) Get(c *gin.Context) {
|
||||
var titles []KpiCTitle
|
||||
var conditions []string
|
||||
var params []any
|
||||
i18n := ctx.AcceptLanguage(c)
|
||||
i18n := reqctx.AcceptLanguage(c)
|
||||
|
||||
// construct condition to get
|
||||
if neType := c.Query("neType"); neType != "" {
|
||||
@@ -92,14 +95,14 @@ func (k *KpiCTitle) Get(c *gin.Context) {
|
||||
conditions = append(conditions, "status = ?")
|
||||
params = append(params, status)
|
||||
} else {
|
||||
conditions = append(conditions, "status != 'Deleted'")
|
||||
conditions = append(conditions, "status != '2'")
|
||||
}
|
||||
|
||||
whereSql := ""
|
||||
if len(conditions) > 0 {
|
||||
whereSql += strings.Join(conditions, " and ")
|
||||
}
|
||||
if err := dborm.DefaultDB().Where(whereSql, params...).Find(&titles).Error; err != nil {
|
||||
if err := db.DB("").Where(whereSql, params...).Find(&titles).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
@@ -126,11 +129,18 @@ func (k *KpiCTitle) expressionAlias(titles []KpiCTitle, i18n string) {
|
||||
} else {
|
||||
sql = fmt.Sprintf("SELECT en_title FROM kpi_title WHERE kpi_id='%s'", match[1])
|
||||
}
|
||||
err := dborm.XCoreDB().QueryRow(sql).Scan(&alias)
|
||||
m, err := db.RawDB("", sql, nil)
|
||||
if err != nil {
|
||||
log.Warn("Failed to QueryRow:", err)
|
||||
continue
|
||||
}
|
||||
if len(m) > 0 {
|
||||
if i18n == "zh" {
|
||||
alias = fmt.Sprintf("%v", m[0]["cn_title"])
|
||||
} else {
|
||||
alias = fmt.Sprintf("%v", m[0]["en_title"])
|
||||
}
|
||||
}
|
||||
title.ExprAlias = regexp.MustCompile(match[1]).ReplaceAllString(title.ExprAlias, alias)
|
||||
}
|
||||
}
|
||||
@@ -149,7 +159,7 @@ func (k *KpiCTitle) Total(c *gin.Context) {
|
||||
conditions = append(conditions, "status = ?")
|
||||
params = append(params, status)
|
||||
} else {
|
||||
conditions = append(conditions, "status != 'Deleted'")
|
||||
conditions = append(conditions, "status != '2'")
|
||||
}
|
||||
|
||||
whereSql := ""
|
||||
@@ -157,7 +167,7 @@ func (k *KpiCTitle) Total(c *gin.Context) {
|
||||
whereSql += strings.Join(conditions, " and ")
|
||||
}
|
||||
var total int64 = 0
|
||||
if err := dborm.DefaultDB().Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil {
|
||||
if err := db.DB("").Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
@@ -166,31 +176,56 @@ func (k *KpiCTitle) Total(c *gin.Context) {
|
||||
}
|
||||
|
||||
func (k *KpiCTitle) Post(c *gin.Context) {
|
||||
var title, res KpiCTitle
|
||||
|
||||
var title KpiCTitle
|
||||
if err := c.ShouldBindJSON(&title); err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
userName := ctx.LoginUserToUserName(c)
|
||||
userName := reqctx.LoginUserToUserName(c)
|
||||
title.CreatedBy = &userName
|
||||
result := dborm.DefaultDB().Where("ne_type=? and (kpi_id=? or title=?) and status!='Deleted'", title.NeType, title.KpiID, title.Title).First(&title)
|
||||
tx := db.DB("").Model(&KpiCTitle{})
|
||||
result := tx.Where("ne_type=? and (kpi_id=? or title=?) and status!='2'", title.NeType, title.KpiID, title.Title).First(&title)
|
||||
if result.RowsAffected > 0 {
|
||||
c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist"))
|
||||
return
|
||||
}
|
||||
|
||||
// Regexp match like AMF.C.01
|
||||
kpiIDRegexp := "^" + *title.NeType + "\\.C\\.[0-9]{2}$"
|
||||
ret := dborm.DefaultDB().Table("kpi_c_title").
|
||||
Where("ne_type=? and kpi_id REGEXP ? ORDER BY kpi_id DESC LIMIT 1", title.NeType, kpiIDRegexp).Scan(&res)
|
||||
if err := ret.Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
// kpiIDRegexp := "^" + *title.NeType + "\\.C\\.[0-9]{2}$"
|
||||
// ret := db.DB("").Table("kpi_c_title").
|
||||
// Where("ne_type=? and kpi_id REGEXP ? ORDER BY kpi_id DESC LIMIT 1", title.NeType, kpiIDRegexp).Scan(&res)
|
||||
// if err := ret.Error; err != nil {
|
||||
// c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
// return
|
||||
// }
|
||||
|
||||
titles := []KpiCTitle{}
|
||||
ret := db.DB("").Model(&KpiCTitle{})
|
||||
ret = ret.Select("kpi_id").Where("ne_type=?", title.NeType).Find(&titles)
|
||||
|
||||
newKpiID := *title.NeType + ".C" + ".01"
|
||||
if ret.RowsAffected != 0 {
|
||||
maxKpiID := *res.KpiID
|
||||
suffixInt := 1
|
||||
prefixStr := fmt.Sprintf("%s.C.", *title.NeType)
|
||||
sort.SliceStable(titles, func(i, j int) bool {
|
||||
vi := *titles[i].KpiID
|
||||
vj := *titles[j].KpiID
|
||||
if strings.HasPrefix(vi, prefixStr) && strings.HasPrefix(vj, prefixStr) {
|
||||
vvi := strings.Replace(vi, prefixStr, "", 1)
|
||||
vvii, err := strconv.Atoi(vvi)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
vvj := strings.Replace(vj, prefixStr, "", 1)
|
||||
vvjj, err := strconv.Atoi(vvj)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return vvii > vvjj // desc
|
||||
}
|
||||
return false
|
||||
})
|
||||
maxKpiID := *titles[0].KpiID
|
||||
prefix := maxKpiID[:len(maxKpiID)-2]
|
||||
suffix := maxKpiID[len(maxKpiID)-2:]
|
||||
suffixInt, err := strconv.Atoi(suffix)
|
||||
@@ -209,25 +244,26 @@ func (k *KpiCTitle) Post(c *gin.Context) {
|
||||
newKpiID = prefix + newSuffix
|
||||
}
|
||||
title.KpiID = &newKpiID
|
||||
if err := dborm.DefaultDB().Create(&title).Error; err != nil {
|
||||
txx := db.DB("").Model(&KpiCTitle{})
|
||||
if err := txx.Create(&title).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
kpiCReportTable := "kpi_c_report_" + strings.ToLower(*title.NeType)
|
||||
if !dborm.DefaultDB().Migrator().HasTable(kpiCReportTable) {
|
||||
if !db.DB("").Migrator().HasTable(kpiCReportTable) {
|
||||
// clone table "kpi_c_report" to "kpi_c_report_{neType}"
|
||||
sql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s AS SELECT * FROM %s WHERE 1=0", kpiCReportTable, "kpi_c_report")
|
||||
if _, err := dborm.ExecSQL(sql, nil); err != nil {
|
||||
if _, err := db.ExecDB("", sql, nil); err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
sql = fmt.Sprintf("ALTER TABLE %s MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (`id`)", kpiCReportTable)
|
||||
if _, err := dborm.ExecSQL(sql, nil); err != nil {
|
||||
if _, err := db.ExecDB("", sql, nil); err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
sql = fmt.Sprintf("ALTER TABLE %s ADD INDEX IF NOT EXISTS `idx_timestamp`(`created_at`) USING BTREE, ADD INDEX IF NOT EXISTS `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE", kpiCReportTable)
|
||||
if _, err := dborm.ExecSQL(sql, nil); err != nil {
|
||||
if _, err := db.ExecDB("", sql, nil); err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
@@ -239,7 +275,7 @@ func (k *KpiCTitle) Put(c *gin.Context) {
|
||||
var title KpiCTitle
|
||||
id := c.Param("id")
|
||||
|
||||
if err := dborm.DefaultDB().First(&title, id).Error; err != nil {
|
||||
if err := db.DB("").First(&title, id).Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp("custom indicator not found"))
|
||||
return
|
||||
}
|
||||
@@ -248,7 +284,8 @@ func (k *KpiCTitle) Put(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
dborm.DefaultDB().Save(&title)
|
||||
title.UpdatedAt = time.Now().UnixMilli()
|
||||
db.DB("").Save(&title)
|
||||
|
||||
c.JSON(http.StatusOK, services.DataResp(title))
|
||||
}
|
||||
@@ -256,7 +293,7 @@ func (k *KpiCTitle) Put(c *gin.Context) {
|
||||
func (k *KpiCTitle) Delete(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
|
||||
if err := dborm.DefaultDB().Table(k.TableName()).Where("id=?", id).Update("status", "Deleted").Error; err != nil {
|
||||
if err := db.DB("").Table(k.TableName()).Where("id=?", id).Update("status", "2").Error; err != nil {
|
||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
@@ -267,7 +304,7 @@ func (k *KpiCTitle) Delete(c *gin.Context) {
|
||||
func GetActiveKPICList(neType string) []KpiCTitle {
|
||||
k := new([]KpiCTitle)
|
||||
|
||||
err := dborm.DefaultDB().Where("`ne_type` = ? and `status` = 'Active'", neType).Find(&k).Error
|
||||
err := db.DB("").Where("`ne_type` = ? and `status` = '1'", neType).Find(&k).Error
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1,23 +1,21 @@
|
||||
package kpi_c_title
|
||||
|
||||
import "time"
|
||||
|
||||
const (
|
||||
MAX_KPI_C_ID = 99
|
||||
)
|
||||
|
||||
type KpiCTitle struct {
|
||||
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
||||
NeType *string `gorm:"column:ne_type;default:NULL," json:"neType,omitempty"`
|
||||
KpiID *string `gorm:"column:kpi_id;default:NULL," json:"kpiId,omitempty"`
|
||||
Title *string `gorm:"column:title;default:NULL," json:"title,omitempty"`
|
||||
Expression *string `gorm:"column:expression;default:NULL," json:"expression,omitempty"`
|
||||
ExprAlias string `gorm:"-" json:"exprAlias"`
|
||||
Status string `gorm:"column:status;default:'Active'" json:"status"`
|
||||
Unit *string `gorm:"column:unit" json:"unit,omitempty"`
|
||||
Description *string `gorm:"column:description;default:NULL," json:"description,omitempty"`
|
||||
CreatedBy *string `gorm:"column:created_by;default:NULL," json:"createdBy,omitempty"`
|
||||
UpdatedAt *time.Time `gorm:"column:updated_at;default:current_timestamp()," json:"updatedAt,omitempty"`
|
||||
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
||||
NeType *string `gorm:"column:ne_type" json:"neType,omitempty"`
|
||||
KpiID *string `gorm:"column:kpi_id" json:"kpiId,omitempty"`
|
||||
Title *string `gorm:"column:title" json:"title,omitempty"`
|
||||
Expression *string `gorm:"column:expression" json:"expression,omitempty"`
|
||||
ExprAlias string `gorm:"-" json:"exprAlias"`
|
||||
Status string `gorm:"column:status" json:"status"` // 0-Inactive/1-Active/2-Deleted
|
||||
Unit *string `gorm:"column:unit" json:"unit,omitempty"`
|
||||
Description *string `gorm:"column:description" json:"description,omitempty"`
|
||||
CreatedBy *string `gorm:"column:created_by" json:"createdBy,omitempty"`
|
||||
UpdatedAt int64 `gorm:"column:updated_at" json:"updatedAt,omitempty"`
|
||||
}
|
||||
|
||||
type KpiCTitleQuery struct {
|
||||
|
||||
@@ -13,18 +13,22 @@ import (
|
||||
"be.ems/features/pm/kpi_c_report"
|
||||
"be.ems/features/pm/kpi_c_title"
|
||||
"be.ems/lib/config"
|
||||
"be.ems/lib/core/ctx"
|
||||
"be.ems/lib/dborm"
|
||||
evaluate "be.ems/lib/eval"
|
||||
"be.ems/lib/global"
|
||||
"be.ems/lib/log"
|
||||
"be.ems/lib/services"
|
||||
|
||||
"be.ems/src/framework/database/db"
|
||||
"be.ems/src/framework/utils/date"
|
||||
"be.ems/src/framework/utils/parse"
|
||||
neDataModel "be.ems/src/modules/network_data/model"
|
||||
neDataService "be.ems/src/modules/network_data/service"
|
||||
neService "be.ems/src/modules/network_element/service"
|
||||
wsService "be.ems/src/modules/ws/service"
|
||||
|
||||
"github.com/go-resty/resty/v2"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/gorilla/mux"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
type Response struct {
|
||||
@@ -76,7 +80,7 @@ type KpiData struct {
|
||||
StartTime string `json:"startTime" xorm:"start_time"`
|
||||
EndTime string `json:"endTime" xorm:"end_time"`
|
||||
Index int `json:"index" xorm:"index"`
|
||||
Granularity int8 `json:"granularity" xorm:"granularity"`
|
||||
Granularity int64 `json:"granularity" xorm:"granularity"`
|
||||
KPIValues []KPIVal `json:"kpiValues" xorm:"json 'kpi_values'"`
|
||||
//CreatedAt int64 `json:"createdAt" xorm:"created 'created_at'"`
|
||||
CreatedAt int64 `json:"createdAt" xorm:"'created_at'"`
|
||||
@@ -105,84 +109,6 @@ var (
|
||||
CustomUriMeasureTask = config.UriPrefix + "/performanceManagement/{apiVersion}/measureTask/{netype}"
|
||||
)
|
||||
|
||||
var xEngine *xorm.Engine
|
||||
|
||||
type DatabaseClient struct {
|
||||
dbType string
|
||||
dbUrl string
|
||||
dbConnMaxLifetime time.Duration
|
||||
dbMaxIdleConns int
|
||||
dbMaxOpenConns int
|
||||
IsShowSQL bool
|
||||
|
||||
XEngine *xorm.Engine
|
||||
}
|
||||
|
||||
var DbClient DatabaseClient
|
||||
|
||||
func InitDbClient(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam string) error {
|
||||
DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s",
|
||||
dbUser, dbPassword, dbHost, dbPort, dbName, dbParam)
|
||||
DbClient.dbType = dbType
|
||||
DbClient.dbConnMaxLifetime = 0
|
||||
DbClient.dbMaxIdleConns = 0
|
||||
DbClient.dbMaxOpenConns = 0
|
||||
if log.GetLevel() == log.LOG_TRACE {
|
||||
DbClient.IsShowSQL = true
|
||||
}
|
||||
log.Debugf("dbType:%s dbUrl:%s:", dbType, DbClient.dbUrl)
|
||||
|
||||
var err error
|
||||
DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl)
|
||||
if err != nil {
|
||||
log.Error("Failed to connet database:", err)
|
||||
return err
|
||||
}
|
||||
DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime)
|
||||
DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns)
|
||||
DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns)
|
||||
DbClient.XEngine.DatabaseTZ = time.Local // 必须
|
||||
DbClient.XEngine.TZLocation = time.Local // 必须
|
||||
if DbClient.IsShowSQL {
|
||||
DbClient.XEngine.ShowSQL(true)
|
||||
}
|
||||
xEngine = DbClient.XEngine
|
||||
|
||||
// exist, err := xEngine.IsTableExist("kpi_report")
|
||||
// if err != nil {
|
||||
// log.Error("Failed to IsTableExist:", err)
|
||||
// return err
|
||||
// }
|
||||
// if exist {
|
||||
// // 复制表结构到新表
|
||||
// sql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s` AS SELECT * FROM kpi_report WHERE 1=0", "kpi_report_amf")
|
||||
// _, err := xEngine.Exec(sql)
|
||||
// if err != nil {
|
||||
// log.Error("Failed to Exec:", err)
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) (*xorm.Engine, error) {
|
||||
sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local",
|
||||
dbUser, dbPassword, dbHost, dbPort, dbName)
|
||||
log.Debugf("dbType:%s Connect to:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local",
|
||||
dbType, dbUser, dbHost, dbPort, dbName)
|
||||
var err error
|
||||
xEngine, err = xorm.NewEngine(dbType, sqlStr) //1、Create xorm engine
|
||||
if err != nil {
|
||||
log.Error("Failed to connect database:", err)
|
||||
return nil, err
|
||||
}
|
||||
if log.GetLevel() == log.LOG_TRACE {
|
||||
xEngine.ShowSQL(true)
|
||||
}
|
||||
return xEngine, nil
|
||||
}
|
||||
|
||||
func GetDateFromTimeString(fmtString string, timeString string) string {
|
||||
t, _ := time.ParseInLocation(fmtString, timeString, time.Local)
|
||||
return t.Format("2006-01-02")
|
||||
@@ -197,6 +123,167 @@ func GetDateTimeFromTimeString(fmtString string, timeString string) string {
|
||||
func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("PostKPIReportFromNF processing... ")
|
||||
|
||||
apiVer := ctx.GetParam(r, "apiVersion")
|
||||
if apiVer != global.ApiVersionV1 {
|
||||
log.Error("Uri api version is invalid. apiVersion:", apiVer)
|
||||
services.ResponseNotFound404UriNotExist(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
var kpiReport KpiReport
|
||||
if err := ctx.ShouldBindJSON(r, &kpiReport); err != nil {
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
kpiIndexStr := ctx.GetParam(r, "index")
|
||||
|
||||
// insert kpi_report table, no session
|
||||
saveKPIData(kpiReport, parse.Number(kpiIndexStr))
|
||||
saveKPIDataC(kpiReport, parse.Number(kpiIndexStr))
|
||||
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
}
|
||||
|
||||
// saveKPIData 存储KPI数据并推送到ws订阅组
|
||||
func saveKPIData(kpiReport KpiReport, index int64) int64 {
|
||||
timestamp := kpiReport.Timestamp
|
||||
taskPeriod := kpiReport.Task.Period
|
||||
taskNe := kpiReport.Task.NE
|
||||
taskNeKPIs := kpiReport.Task.NE.KPIs
|
||||
// 时间数据处理
|
||||
receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
granularity := parse.Number(endTime.Sub(startTime).Seconds())
|
||||
// kpi data数据json
|
||||
KpiValues := make([]map[string]any, 0)
|
||||
for _, v := range taskNeKPIs {
|
||||
KpiValues = append(KpiValues, map[string]any{
|
||||
"kpiId": v.KPIID,
|
||||
"value": v.Value,
|
||||
"err": v.Err,
|
||||
})
|
||||
}
|
||||
KpiValuesByte, _ := json.Marshal(KpiValues)
|
||||
kpiData := neDataModel.KpiReport{
|
||||
NeType: taskNe.NeType,
|
||||
NeName: taskNe.NEName,
|
||||
RmUid: taskNe.RmUID,
|
||||
Date: date.ParseDateToStr(receiverTime, "2006-01-02"),
|
||||
StartTime: date.ParseDateToStr(startTime, "15:04:05"),
|
||||
EndTime: date.ParseDateToStr(endTime, "15:04:05"),
|
||||
Index: index,
|
||||
Granularity: granularity,
|
||||
KpiValues: string(KpiValuesByte),
|
||||
CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒
|
||||
}
|
||||
insertId := neDataService.NewKpiReport.Insert(kpiData)
|
||||
if insertId > 0 {
|
||||
// 指标事件对象
|
||||
kpiEvent := map[string]any{
|
||||
"neType": kpiData.NeType,
|
||||
"neName": kpiData.NeName,
|
||||
"rmUID": kpiData.RmUid,
|
||||
"startIndex": kpiData.Index,
|
||||
"timeGroup": kpiData.CreatedAt,
|
||||
// kip_id ...
|
||||
}
|
||||
for _, v := range taskNeKPIs {
|
||||
kpiEvent[v.KPIID] = v.Value
|
||||
}
|
||||
|
||||
// 发送到匹配的网元
|
||||
neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid)
|
||||
if neInfo.RmUID == kpiData.RmUid {
|
||||
// 推送到ws订阅组
|
||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||
if neInfo.NeType == "UPF" {
|
||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
return insertId
|
||||
}
|
||||
|
||||
// saveKPIDataC 存储自定义KPI数据并推送到ws订阅组
|
||||
func saveKPIDataC(kpiReport KpiReport, index int64) int64 {
|
||||
timestamp := kpiReport.Timestamp
|
||||
taskPeriod := kpiReport.Task.Period
|
||||
taskNe := kpiReport.Task.NE
|
||||
taskNeKPIs := kpiReport.Task.NE.KPIs
|
||||
// 时间数据处理
|
||||
receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||
granularity := parse.Number(endTime.Sub(startTime).Seconds())
|
||||
// kpi data数据
|
||||
KpiValues := make([]map[string]any, 0)
|
||||
kpiValMap := map[string]any{}
|
||||
for _, v := range taskNeKPIs {
|
||||
kpiValMap[v.KPIID] = v.Value
|
||||
}
|
||||
// 自定义kpiId数据
|
||||
cTitles := kpi_c_title.GetActiveKPICList(taskNe.NeType)
|
||||
for _, v := range cTitles {
|
||||
item := map[string]any{
|
||||
"kpiId": *v.KpiID,
|
||||
"value": 0,
|
||||
"err": "",
|
||||
}
|
||||
// 计算结果
|
||||
result, err := evaluate.CalcExpr(*v.Expression, kpiValMap)
|
||||
if err != nil {
|
||||
item["value"] = 0
|
||||
item["err"] = err.Error()
|
||||
} else {
|
||||
item["value"] = result
|
||||
}
|
||||
KpiValues = append(KpiValues, item)
|
||||
}
|
||||
|
||||
KpiValuesByte, _ := json.Marshal(KpiValues)
|
||||
kpiData := neDataModel.KpiCReport{
|
||||
NeType: taskNe.NeType,
|
||||
NeName: taskNe.NEName,
|
||||
RmUid: taskNe.RmUID,
|
||||
Date: date.ParseDateToStr(receiverTime, "2006-01-02"),
|
||||
StartTime: date.ParseDateToStr(startTime, "15:04:05"),
|
||||
EndTime: date.ParseDateToStr(endTime, "15:04:05"),
|
||||
Index: index,
|
||||
Granularity: granularity,
|
||||
KpiValues: string(KpiValuesByte),
|
||||
CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒
|
||||
}
|
||||
insertId := neDataService.NewKpiCReport.Insert(kpiData)
|
||||
if insertId > 0 {
|
||||
// 指标事件对象
|
||||
kpiEvent := map[string]any{
|
||||
"neType": kpiData.NeType,
|
||||
"neName": kpiData.NeName,
|
||||
"rmUID": kpiData.RmUid,
|
||||
"startIndex": kpiData.Index,
|
||||
"timeGroup": kpiData.CreatedAt,
|
||||
// kip_id ...
|
||||
}
|
||||
for _, v := range KpiValues {
|
||||
kpiEvent[fmt.Sprint(v["kpiId"])] = v["value"]
|
||||
}
|
||||
|
||||
// 发送到匹配的网元
|
||||
neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid)
|
||||
if neInfo.RmUID == kpiData.RmUid {
|
||||
// 推送自定义KPI到ws订阅组
|
||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||
}
|
||||
}
|
||||
return insertId
|
||||
}
|
||||
|
||||
// process KPI report post message from NFs 旧版
|
||||
func PostKPIReportFromNFOld(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("PostKPIReportFromNF processing... ")
|
||||
|
||||
vars := mux.Vars(r)
|
||||
apiVer := vars["apiVersion"]
|
||||
if apiVer != global.ApiVersionV1 {
|
||||
@@ -224,9 +311,9 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
endTime := global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime)
|
||||
// get time granularity from startTime and endTime
|
||||
seconds, _ := global.GetSecondDuration(startTime, endTime)
|
||||
var granularity int8 = 60
|
||||
var granularity int64 = 60
|
||||
if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 {
|
||||
granularity = int8(seconds)
|
||||
granularity = int64(seconds)
|
||||
}
|
||||
|
||||
// insert into new kpi_report_xxx table
|
||||
@@ -269,8 +356,9 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// insert kpi_report table, no session
|
||||
tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType)
|
||||
affected, err := xEngine.Table(tableName).Insert(kpiData)
|
||||
if err != nil && affected <= 0 {
|
||||
// affected, err := xEngine.Table(tableName).Insert(kpiData)
|
||||
tx := db.DB("").Table(tableName).Create(kpiData)
|
||||
if tx.Error != nil && tx.RowsAffected <= 0 {
|
||||
log.Errorf("Failed to insert %s:%v", tableName, err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
@@ -283,12 +371,12 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
Date: kpiData.Date,
|
||||
StartTime: &kpiData.StartTime,
|
||||
EndTime: &kpiData.EndTime,
|
||||
Index: int16(kpiData.Index),
|
||||
Index: int64(kpiData.Index),
|
||||
Granularity: &kpiData.Granularity,
|
||||
}
|
||||
|
||||
// 发送到匹配的网元
|
||||
neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid)
|
||||
neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid)
|
||||
// custom kpi report to FE
|
||||
kpiCEvent := map[string]any{
|
||||
// kip_id ...
|
||||
@@ -301,23 +389,23 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
"createdAt": kpiData.CreatedAt,
|
||||
"granularity": kpiData.Granularity,
|
||||
}
|
||||
kpiCList := kpi_c_title.GetActiveKPICList(kpiData.NEType)
|
||||
for _, k := range kpiCList {
|
||||
result, err := evaluate.CalcExpr(*k.Expression, kpiValMap)
|
||||
kpiCVal := new(kpi_c_report.KpiCVal)
|
||||
kpiCVal.KPIID = *k.KpiID
|
||||
if err != nil {
|
||||
kpiCVal.Value = 0.0
|
||||
kpiCVal.Err = err.Error()
|
||||
} else {
|
||||
kpiCVal.Value = result
|
||||
}
|
||||
// kpiCList := kpi_c_title.GetActiveKPICList(kpiData.NEType)
|
||||
// for _, k := range kpiCList {
|
||||
// result, err := evaluate.CalcExpr(*k.Expression, kpiValMap)
|
||||
// kpiCVal := new(kpi_c_report.KpiCVal)
|
||||
// kpiCVal.KPIID = *k.KpiID
|
||||
// if err != nil {
|
||||
// kpiCVal.Value = 0.0
|
||||
// kpiCVal.Err = err.Error()
|
||||
// } else {
|
||||
// kpiCVal.Value = result
|
||||
// }
|
||||
|
||||
report.KpiValues = append(report.KpiValues, *kpiCVal)
|
||||
// report.KpiValues = append(report.KpiValues, *kpiCVal)
|
||||
|
||||
// set KPIC event kpiid and value
|
||||
kpiCEvent[kpiCVal.KPIID] = kpiCVal.Value
|
||||
}
|
||||
// // set KPIC event kpiid and value
|
||||
// kpiCEvent[kpiCVal.KPIID] = kpiCVal.Value
|
||||
// }
|
||||
|
||||
// KPI自定义指标入库
|
||||
kpi_c_report.InsertKpiCReport(kpiData.NEType, report)
|
||||
@@ -335,11 +423,19 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
}
|
||||
|
||||
type MeasureTask struct {
|
||||
Tasks []Task `json:"Tasks"`
|
||||
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||
// type MeasureTask struct {
|
||||
// Tasks []Task `json:"Tasks"`
|
||||
// NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||
// }
|
||||
type ScheduleJ struct {
|
||||
Type string `json:"Type"`
|
||||
Days []int `json:"Days"`
|
||||
}
|
||||
|
||||
type Period struct {
|
||||
Start string `json:"Start"`
|
||||
End string `json:"End"`
|
||||
}
|
||||
type Task struct {
|
||||
Id int `json:"Id"`
|
||||
|
||||
@@ -347,9 +443,9 @@ type Task struct {
|
||||
EndTime string `json:"EndTime"`
|
||||
|
||||
Schedule struct {
|
||||
Type string `json:"Type"` // 计划类型:Weekly/Monthly, 如果type为"", 则任务以StartTime和EndTime为条件进行统计, 否则以Shedule方式进行
|
||||
Days []int `json:"Days"` // Weekly: [0,1,...,5,6] 星期日为0, Monthly: [1,2,3,...,30,31]
|
||||
Periods []dborm.Period `json:"Periods"`
|
||||
Type string `json:"Type"` // 计划类型:Weekly/Monthly, 如果type为"", 则任务以StartTime和EndTime为条件进行统计, 否则以Shedule方式进行
|
||||
Days []int `json:"Days"` // Weekly: [0,1,...,5,6] 星期日为0, Monthly: [1,2,3,...,30,31]
|
||||
Periods []Period `json:"Periods"`
|
||||
/*
|
||||
Periods []struct {
|
||||
Start string `json:"Start"` // 零点或者零点加测量粒度的整数倍
|
||||
@@ -358,8 +454,8 @@ type Task struct {
|
||||
*/
|
||||
} `json:"Schedule"`
|
||||
|
||||
GranulOption string `json:"GranulOption"` // 测量粒度选项:15M/30M/60M/24H
|
||||
KPISet []dborm.KpiSetJ `json:"KPISet"`
|
||||
GranulOption string `json:"GranulOption"` // 测量粒度选项:15M/30M/60M/24H
|
||||
KPISet []KpiSetJ `json:"KPISet"`
|
||||
/*
|
||||
KPISet []struct {
|
||||
Code string `json:"Code"` // 统计编码 如:SMFHA01
|
||||
@@ -367,7 +463,31 @@ type Task struct {
|
||||
} `json:"KPISet"`
|
||||
*/
|
||||
}
|
||||
type KpiSetJ struct {
|
||||
Code string `json:"Code"` // 统计编码 如:SMFHA01
|
||||
KPIs []string `json:"KPIs` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"]
|
||||
}
|
||||
|
||||
type MeasureTask struct {
|
||||
Id int `json:"id" xorm:"pk 'id' autoincr"`
|
||||
NeType string `json:"neType" xorm:"ne_type"`
|
||||
NeIds []string `json:"neIds" xorm:"ne_ids"`
|
||||
KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"`
|
||||
StartTime string `json:"startTime" xorm:"start_time"`
|
||||
EndTime string `json:"endTime" xorm:"end_time"`
|
||||
Periods []Period `json:"Periods" xorm:"periods`
|
||||
Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"`
|
||||
GranulOption string `json:"granulOption" xorm:"granul_option"`
|
||||
Status string `json:"status" xorm:"status"`
|
||||
AccountID string `json:"accountId" xorm:"account_id"`
|
||||
Comment string `json:"comment" xorm:"comment"`
|
||||
CreateTime string `json:"createTime" xorm:"create_time"`
|
||||
UpdateTime string `json:"updateTime" xorm:"update_time"`
|
||||
DeleteTime string `json:"deleteTime xorm:"delete_time"`
|
||||
|
||||
Tasks []Task `json:"Tasks"`
|
||||
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||
}
|
||||
type MeasureReport struct {
|
||||
Id int `json:"Id"`
|
||||
TimeStamp string `json:"TimeStamp"`
|
||||
@@ -394,6 +514,33 @@ type MeasureReport struct {
|
||||
} `json:"Report"`
|
||||
}
|
||||
|
||||
func GetMeasureTask(taskId int) (*MeasureTask, error) {
|
||||
log.Debug("GetMeasureTask processing... ")
|
||||
|
||||
measureTask := new(MeasureTask)
|
||||
tx := db.DB("").Table("measure_task").Where("id=?", taskId).Find(measureTask)
|
||||
if tx.Error != nil {
|
||||
log.Error("Failed to get table measure_task from database:", tx.Error)
|
||||
|
||||
return nil, tx.Error
|
||||
}
|
||||
|
||||
log.Debug("Measure Task:", measureTask)
|
||||
return measureTask, nil
|
||||
}
|
||||
|
||||
func XormGetActiveMeasureTask(measureTasks *[]MeasureTask) (*[]MeasureTask, error) {
|
||||
log.Debug("XormGetActiveMeasureTask processing... ")
|
||||
tx := db.DB("").Table("measure_task").Where("status='Active'").Find(measureTasks)
|
||||
if tx.Error != nil {
|
||||
log.Error("Failed to get table measure_task:", tx.Error)
|
||||
return nil, tx.Error
|
||||
}
|
||||
|
||||
log.Debug("measureTasks:", measureTasks)
|
||||
return measureTasks, nil
|
||||
}
|
||||
|
||||
type MeasureData struct {
|
||||
// Id int `json:"id" xorm:"pk 'id' autoincr"`
|
||||
Id int `json:"id" xorm:"-"`
|
||||
@@ -438,8 +585,6 @@ func PostMeasureReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
_ = json.Unmarshal(body, &measureReport)
|
||||
log.Debug("measureReport:", measureReport)
|
||||
|
||||
session := xEngine.NewSession()
|
||||
defer session.Close()
|
||||
measureData := new(MeasureData)
|
||||
layout := global.DateTime
|
||||
measureData.Date = GetDateFromTimeString(layout, measureReport.Report.Period.StartTime)
|
||||
@@ -469,8 +614,8 @@ func PostMeasureReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
measureData.Value = v.Value
|
||||
log.Debug("measureData:", measureData)
|
||||
|
||||
affected, err := session.Insert(measureData)
|
||||
if err != nil && affected <= 0 {
|
||||
err := db.DB("").Create(measureData).Error
|
||||
if err != nil {
|
||||
log.Error("Failed to insert measure_data:", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
return
|
||||
@@ -480,8 +625,8 @@ func PostMeasureReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
measureData.Value = 0
|
||||
log.Debug("measureData:", measureData)
|
||||
|
||||
affected, err := session.Insert(measureData)
|
||||
if err != nil && affected <= 0 {
|
||||
err := db.DB("").Create(measureData).Error
|
||||
if err != nil {
|
||||
log.Error("Failed to insert measure_data:", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
return
|
||||
@@ -514,7 +659,7 @@ func PostMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
measureTask.Tasks = make([]Task, 1)
|
||||
for _, taskId := range taskIds {
|
||||
id, _ := strconv.Atoi(taskId)
|
||||
task, err := dborm.GetMeasureTask(id)
|
||||
task, err := GetMeasureTask(id)
|
||||
if err != nil {
|
||||
log.Error("Failed to connect database: ", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
@@ -634,7 +779,7 @@ func PostMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("StatusCode: ", response.StatusCode())
|
||||
switch response.StatusCode() {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusActive
|
||||
taskInfo.CreateTime = time.Now().Format(time.DateTime)
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
@@ -688,7 +833,7 @@ func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
respMsg := make(map[string]interface{})
|
||||
for _, taskId := range taskIds {
|
||||
id, _ := strconv.Atoi(taskId)
|
||||
task, err := dborm.GetMeasureTask(id)
|
||||
task, err := GetMeasureTask(id)
|
||||
if err != nil {
|
||||
log.Error("Failed to connect database: ", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
@@ -711,7 +856,7 @@ func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("neIds:", task.NeIds)
|
||||
if len(task.NeIds) == 0 {
|
||||
log.Warn("Not found target NE in the measure task")
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusDeleted
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -745,7 +890,7 @@ func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
if err != nil {
|
||||
// to avoid can't delete the task for abnormal NF
|
||||
log.Error("Failed to resty delete:", err)
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusDeleted
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -762,7 +907,7 @@ func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Info("StatusCode: ", response.StatusCode())
|
||||
switch response.StatusCode() {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusDeleted
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -781,7 +926,7 @@ func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
respMsg["error"] = body
|
||||
}
|
||||
} else {
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusDeleted
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -819,7 +964,7 @@ func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
respMsg := make(map[string]interface{})
|
||||
for _, taskId := range taskIds {
|
||||
id, _ := strconv.Atoi(taskId)
|
||||
task, err := dborm.GetMeasureTask(id)
|
||||
task, err := GetMeasureTask(id)
|
||||
if err != nil {
|
||||
log.Error("Failed to connect database: ", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
@@ -842,7 +987,7 @@ func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if len(task.NeIds) == 0 {
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusInactive
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -865,7 +1010,7 @@ func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if neInfo == nil {
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusInactive
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -897,7 +1042,7 @@ func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("StatusCode: ", response.StatusCode())
|
||||
switch response.StatusCode() {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||
taskInfo := new(dborm.MeasureTask)
|
||||
taskInfo := new(MeasureTask)
|
||||
taskInfo.Status = dborm.MeasureTaskStatusInactive
|
||||
affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo)
|
||||
if err != nil {
|
||||
@@ -975,15 +1120,12 @@ func PostMeasurementFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
_ = json.Unmarshal(body, &measurement)
|
||||
log.Debug("measurement:", measurement)
|
||||
|
||||
session := dborm.DbClient.XEngine.NewSession()
|
||||
defer session.Close()
|
||||
|
||||
// layout := global.DateTime
|
||||
layout := time.RFC3339
|
||||
measurement.Date = GetDateFromTimeString(layout, measurement.StartTime)
|
||||
measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime)
|
||||
affected, err := session.Table("nbi_pm").Insert(measurement)
|
||||
if err != nil && affected <= 0 {
|
||||
tx := db.DB("").Table("nbi_pm").Create(measurement)
|
||||
if tx.Error != nil && tx.RowsAffected <= 0 {
|
||||
log.Error("Failed to insert nbi_pm:", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
return
|
||||
@@ -1059,14 +1201,11 @@ func GetMeasurementFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
_ = json.Unmarshal(response.Body(), &measurement)
|
||||
log.Debug("measurement:", measurement)
|
||||
|
||||
session := dborm.DbClient.XEngine.NewSession()
|
||||
defer session.Close()
|
||||
|
||||
layout := time.RFC3339
|
||||
measurement.Date = GetDateFromTimeString(layout, measurement.StartTime)
|
||||
measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime)
|
||||
affected, err := session.Table("nbi_pm").Insert(measurement)
|
||||
if err != nil && affected <= 0 {
|
||||
tx := db.DB("").Table("nbi_pm").Create(measurement)
|
||||
if tx.Error != nil && tx.RowsAffected <= 0 {
|
||||
log.Error("Failed to insert nbi_pm:", err)
|
||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user