Merge remote-tracking branch 'origin/main' into lichang
This commit is contained in:
@@ -40,11 +40,11 @@ func (k *KpiCReport) Get(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if querys.StartTime != "" {
|
if querys.StartTime != "" {
|
||||||
conditions = append(conditions, "created_at >= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||||
params = append(params, querys.StartTime)
|
params = append(params, querys.StartTime)
|
||||||
}
|
}
|
||||||
if querys.EndTime != "" {
|
if querys.EndTime != "" {
|
||||||
conditions = append(conditions, "created_at <= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||||
params = append(params, querys.EndTime)
|
params = append(params, querys.EndTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,11 +106,11 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if querys.StartTime != "" {
|
if querys.StartTime != "" {
|
||||||
conditions = append(conditions, "created_at >= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||||
params = append(params, querys.StartTime)
|
params = append(params, querys.StartTime)
|
||||||
}
|
}
|
||||||
if querys.EndTime != "" {
|
if querys.EndTime != "" {
|
||||||
conditions = append(conditions, "created_at <= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||||
params = append(params, querys.EndTime)
|
params = append(params, querys.EndTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,11 +185,11 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
|
|||||||
dbg := dborm.DefaultDB().Table(tableName)
|
dbg := dborm.DefaultDB().Table(tableName)
|
||||||
|
|
||||||
if querys.StartTime != "" {
|
if querys.StartTime != "" {
|
||||||
conditions = append(conditions, "created_at >= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||||
params = append(params, querys.StartTime)
|
params = append(params, querys.StartTime)
|
||||||
}
|
}
|
||||||
if querys.EndTime != "" {
|
if querys.EndTime != "" {
|
||||||
conditions = append(conditions, "created_at <= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||||
params = append(params, querys.EndTime)
|
params = append(params, querys.EndTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,11 +253,11 @@ func (k *KpiCReport) Total(c *gin.Context) {
|
|||||||
dbg := dborm.DefaultDB().Table(tableName)
|
dbg := dborm.DefaultDB().Table(tableName)
|
||||||
|
|
||||||
if querys.StartTime != "" {
|
if querys.StartTime != "" {
|
||||||
conditions = append(conditions, "created_at >= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?")
|
||||||
params = append(params, querys.StartTime)
|
params = append(params, querys.StartTime)
|
||||||
}
|
}
|
||||||
if querys.EndTime != "" {
|
if querys.EndTime != "" {
|
||||||
conditions = append(conditions, "created_at <= ?")
|
conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?")
|
||||||
params = append(params, querys.EndTime)
|
params = append(params, querys.EndTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,17 +3,23 @@ package kpi_c_title
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
"be.ems/lib/services"
|
"be.ems/lib/services"
|
||||||
|
"be.ems/src/framework/utils/ctx"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// get customize kpi total and list
|
||||||
func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
||||||
var titles []KpiCTitle
|
var titles []KpiCTitle
|
||||||
var conditions []string
|
var conditions []string
|
||||||
var params []any
|
var params []any
|
||||||
|
i18n := ctx.AcceptLanguage(c)
|
||||||
|
|
||||||
var querys KpiCTitleQuery
|
var querys KpiCTitleQuery
|
||||||
if err := c.ShouldBindQuery(&querys); err != nil {
|
if err := c.ShouldBindQuery(&querys); err != nil {
|
||||||
@@ -62,6 +68,8 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
k.expressionAlias(titles, i18n)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, services.TotalDataResp(titles, total))
|
c.JSON(http.StatusOK, services.TotalDataResp(titles, total))
|
||||||
//c.JSON(http.StatusOK, titles)
|
//c.JSON(http.StatusOK, titles)
|
||||||
}
|
}
|
||||||
@@ -70,6 +78,7 @@ func (k *KpiCTitle) Get(c *gin.Context) {
|
|||||||
var titles []KpiCTitle
|
var titles []KpiCTitle
|
||||||
var conditions []string
|
var conditions []string
|
||||||
var params []any
|
var params []any
|
||||||
|
i18n := ctx.AcceptLanguage(c)
|
||||||
|
|
||||||
// construct condition to get
|
// construct condition to get
|
||||||
if neType := c.Query("neType"); neType != "" {
|
if neType := c.Query("neType"); neType != "" {
|
||||||
@@ -89,10 +98,38 @@ func (k *KpiCTitle) Get(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
k.expressionAlias(titles, i18n)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, services.DataResp(titles))
|
c.JSON(http.StatusOK, services.DataResp(titles))
|
||||||
//c.JSON(http.StatusOK, titles)
|
//c.JSON(http.StatusOK, titles)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// alias customized kpi expression with cn/en title
|
||||||
|
func (k *KpiCTitle) expressionAlias(titles []KpiCTitle, i18n string) {
|
||||||
|
var title *KpiCTitle
|
||||||
|
for i := 0; i < len(titles); i++ {
|
||||||
|
title = &titles[i]
|
||||||
|
title.ExprAlias = *title.Expression
|
||||||
|
re := regexp.MustCompile(`'([^']+)'`)
|
||||||
|
matches := re.FindAllStringSubmatch(title.ExprAlias, -1)
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
var alias, sql string
|
||||||
|
if i18n == "zh" {
|
||||||
|
sql = fmt.Sprintf("SELECT cn_title FROM kpi_title WHERE kpi_id='%s'", match[1])
|
||||||
|
} else {
|
||||||
|
sql = fmt.Sprintf("SELECT en_title FROM kpi_title WHERE kpi_id='%s'", match[1])
|
||||||
|
}
|
||||||
|
err := dborm.XCoreDB().QueryRow(sql).Scan(&alias)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("Failed to QueryRow:", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
title.ExprAlias = regexp.MustCompile(match[1]).ReplaceAllString(title.ExprAlias, alias)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (k *KpiCTitle) Total(c *gin.Context) {
|
func (k *KpiCTitle) Total(c *gin.Context) {
|
||||||
var conditions []string
|
var conditions []string
|
||||||
var params []any
|
var params []any
|
||||||
@@ -120,17 +157,45 @@ func (k *KpiCTitle) Total(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (k *KpiCTitle) Post(c *gin.Context) {
|
func (k *KpiCTitle) Post(c *gin.Context) {
|
||||||
var title KpiCTitle
|
var title, res KpiCTitle
|
||||||
|
|
||||||
if err := c.ShouldBindJSON(&title); err != nil {
|
if err := c.ShouldBindJSON(&title); err != nil {
|
||||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||||
return
|
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)
|
result := dborm.DefaultDB().Where("ne_type=? and (kpi_id=? or title=?)", title.NeType, title.KpiID, title.Title).First(&title)
|
||||||
if result.RowsAffected > 0 {
|
if result.RowsAffected > 0 {
|
||||||
c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist"))
|
c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist"))
|
||||||
return
|
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 {
|
if err := dborm.DefaultDB().Create(&title).Error; err != nil {
|
||||||
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
c.JSON(http.StatusOK, services.ErrResp(err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -2,12 +2,17 @@ package kpi_c_title
|
|||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
|
const (
|
||||||
|
MAX_KPI_C_ID = 99
|
||||||
|
)
|
||||||
|
|
||||||
type KpiCTitle struct {
|
type KpiCTitle struct {
|
||||||
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
ID int `gorm:"column:id;primary_key;auto_increment" json:"id"`
|
||||||
NeType *string `gorm:"column:ne_type;default:NULL," json:"neType,omitempty"`
|
NeType *string `gorm:"column:ne_type;default:NULL," json:"neType,omitempty"`
|
||||||
KpiID *string `gorm:"column:kpi_id;default:NULL," json:"kpiId,omitempty"`
|
KpiID *string `gorm:"column:kpi_id;default:NULL," json:"kpiId,omitempty"`
|
||||||
Title *string `gorm:"column:title;default:NULL," json:"title,omitempty"`
|
Title *string `gorm:"column:title;default:NULL," json:"title,omitempty"`
|
||||||
Expression *string `gorm:"column:expression;default:NULL," json:"expression,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"`
|
Status string `gorm:"column:status;default:'Active'" json:"status"`
|
||||||
Unit *string `gorm:"column:unit" json:"unit,omitempty"`
|
Unit *string `gorm:"column:unit" json:"unit,omitempty"`
|
||||||
Description *string `gorm:"column:description;default:NULL," json:"description,omitempty"`
|
Description *string `gorm:"column:description;default:NULL," json:"description,omitempty"`
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"go/ast"
|
"go/ast"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
|
"math"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -29,6 +30,9 @@ func CalcExpr(expr string, paramValues map[string]any) (float64, error) {
|
|||||||
|
|
||||||
// expression to evaluate
|
// expression to evaluate
|
||||||
result, err := evalExpr(expr)
|
result, err := evalExpr(expr)
|
||||||
|
if math.IsNaN(result) {
|
||||||
|
return 0.0, err
|
||||||
|
}
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +91,10 @@ func evalNode(node ast.Node) (float64, error) {
|
|||||||
case token.MUL:
|
case token.MUL:
|
||||||
result = left * right
|
result = left * right
|
||||||
case token.QUO:
|
case token.QUO:
|
||||||
|
if right == 0 {
|
||||||
|
return math.NaN(), fmt.Errorf("divisor cannot be zero")
|
||||||
|
}
|
||||||
|
|
||||||
result = left / right
|
result = left / right
|
||||||
}
|
}
|
||||||
case *ast.BasicLit:
|
case *ast.BasicLit:
|
||||||
|
|||||||
@@ -119,17 +119,31 @@ esac
|
|||||||
# create kpi_report table with ne_type, exp: kpi_report_amf
|
# create kpi_report table with ne_type, exp: kpi_report_amf
|
||||||
ne_types=$(mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -se "SELECT DISTINCT LOWER(ne_type) FROM kpi_title")
|
ne_types=$(mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -se "SELECT DISTINCT LOWER(ne_type) FROM kpi_title")
|
||||||
for ne_type in ${ne_types}; do
|
for ne_type in ${ne_types}; do
|
||||||
TABLE_NAME="kpi_report_${ne_type}"
|
TABLE_NAME="kpi_report_${ne_type}"
|
||||||
SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} AS SELECT * FROM kpi_report WHERE 1=0;ALTER TABLE ${TABLE_NAME} MODIFY COLUMN \`id\` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (\`id\`);"
|
SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} LIKE \`kpi_report\`;"
|
||||||
echo -n "Create table: ${TABLE_NAME} ..."
|
echo -n "Create table: ${TABLE_NAME} ..."
|
||||||
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
if [ $? = 0 ]; then
|
if [ $? = 0 ]; then
|
||||||
echo "done"
|
echo "done"
|
||||||
fi
|
fi
|
||||||
SQL="ALTER TABLE ${TABLE_NAME} 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;"
|
SQL="ALTER TABLE ${TABLE_NAME} 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;"
|
||||||
echo -n "Create index of ${TABLE_NAME} ..."
|
echo -n "Create index of ${TABLE_NAME} ..."
|
||||||
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
if [ $? = 0 ]; then
|
if [ $? = 0 ]; then
|
||||||
echo "done"
|
echo "done"
|
||||||
fi
|
fi
|
||||||
|
SQL="ALTER TABLE ${TABLE_NAME} 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;"
|
||||||
|
echo -n "Create index of ${TABLE_NAME} ..."
|
||||||
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
|
if [ $? = 0 ]; then
|
||||||
|
echo "done"
|
||||||
|
fi
|
||||||
|
|
||||||
|
TABLE_NAME="kpi_c_report_${ne_type}"
|
||||||
|
SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} LIKE \`kpi_c_report\`;"
|
||||||
|
echo -n "Create table: ${TABLE_NAME} ..."
|
||||||
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
|
if [ $? = 0 ]; then
|
||||||
|
echo "done"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
Reference in New Issue
Block a user