From 802210cb7d1b08c54d39f804b3c6dc014b3318b0 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 6 Nov 2024 17:19:17 +0800 Subject: [PATCH] fix: customized kpi features issues --- features/pm/kpi_c_report/controller.go | 12 +++++----- features/pm/kpi_c_title/controller.go | 32 +++++++++++++++++++++++++- features/pm/kpi_c_title/model.go | 4 ++++ lib/eval/evaluate.go | 8 +++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go index b161fba2..a19646b3 100644 --- a/features/pm/kpi_c_report/controller.go +++ b/features/pm/kpi_c_report/controller.go @@ -106,11 +106,11 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { return } if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } @@ -185,11 +185,11 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } @@ -253,11 +253,11 @@ func (k *KpiCReport) Total(c *gin.Context) { dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") params = append(params, querys.StartTime) } if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") + conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") params = append(params, querys.EndTime) } diff --git a/features/pm/kpi_c_title/controller.go b/features/pm/kpi_c_title/controller.go index aa2912ce..9e6cf571 100644 --- a/features/pm/kpi_c_title/controller.go +++ b/features/pm/kpi_c_title/controller.go @@ -3,10 +3,12 @@ package kpi_c_title import ( "fmt" "net/http" + "strconv" "strings" "be.ems/lib/dborm" "be.ems/lib/services" + "be.ems/src/framework/utils/ctx" "github.com/gin-gonic/gin" ) @@ -120,17 +122,45 @@ func (k *KpiCTitle) Total(c *gin.Context) { } func (k *KpiCTitle) Post(c *gin.Context) { - var title KpiCTitle + var title, res KpiCTitle if err := c.ShouldBindJSON(&title); err != nil { c.JSON(http.StatusOK, services.ErrResp(err.Error())) return } + userName := ctx.LoginUserToUserName(c) + title.CreatedBy = &userName result := dborm.DefaultDB().Where("ne_type=? and (kpi_id=? or title=?)", title.NeType, title.KpiID, title.Title).First(&title) if result.RowsAffected > 0 { c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist")) return } + ret := dborm.DefaultDB().Table("kpi_c_title").Where("ne_type=? ORDER BY kpi_id DESC LIMIT 1", title.NeType).Scan(&res) + if err := ret.Error; err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + newKpiID := *title.NeType + ".C" + ".01" + if ret.RowsAffected != 0 { + maxKpiID := *res.KpiID + prefix := maxKpiID[:len(maxKpiID)-2] + suffix := maxKpiID[len(maxKpiID)-2:] + suffixInt, err := strconv.Atoi(suffix) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + if suffixInt >= MAX_KPI_C_ID { + err := fmt.Errorf("exceed the max customized KPI ID") + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + suffixInt++ + newSuffix := fmt.Sprintf("%02d", suffixInt) + newKpiID = prefix + newSuffix + } + title.KpiID = &newKpiID if err := dborm.DefaultDB().Create(&title).Error; err != nil { c.JSON(http.StatusOK, services.ErrResp(err.Error())) return diff --git a/features/pm/kpi_c_title/model.go b/features/pm/kpi_c_title/model.go index 77bb9423..fb6ff46c 100644 --- a/features/pm/kpi_c_title/model.go +++ b/features/pm/kpi_c_title/model.go @@ -2,6 +2,10 @@ 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"` diff --git a/lib/eval/evaluate.go b/lib/eval/evaluate.go index d0ff37e0..664d7176 100644 --- a/lib/eval/evaluate.go +++ b/lib/eval/evaluate.go @@ -5,6 +5,7 @@ import ( "go/ast" "go/parser" "go/token" + "math" "regexp" "strconv" "strings" @@ -29,6 +30,9 @@ func CalcExpr(expr string, paramValues map[string]any) (float64, error) { // expression to evaluate result, err := evalExpr(expr) + if math.IsNaN(result) { + return 0.0, err + } return result, err } @@ -87,6 +91,10 @@ func evalNode(node ast.Node) (float64, error) { case token.MUL: result = left * right case token.QUO: + if right == 0 { + return math.NaN(), fmt.Errorf("divisor cannot be zero") + } + result = left / right } case *ast.BasicLit: