diff --git a/database/install/kpi_c_report.sql b/database/install/kpi_c_report.sql new file mode 100644 index 00000000..7c538aec --- /dev/null +++ b/database/install/kpi_c_report.sql @@ -0,0 +1,41 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_mariadb + Source Server Type : MariaDB + Source Server Version : 100338 (10.3.38-MariaDB) + Source Host : localhost:33066 + Source Schema : tenants_db + + Target Server Type : MariaDB + Target Server Version : 100338 (10.3.38-MariaDB) + File Encoding : 65001 + + Date: 29/08/2024 14:53:38 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for kpi_c_report_upf +-- ---------------------------- +DROP TABLE IF EXISTS `kpi_c_report`; +CREATE TABLE `kpi_c_report` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `rm_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `date` date NOT NULL, + `start_time` time NULL DEFAULT NULL, + `end_time` time NULL DEFAULT NULL, + `index` smallint(6) NOT NULL, + `granularity` tinyint(4) NULL DEFAULT 60 COMMENT 'Time granualarity: 5/10/.../60/300 (second)', + `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_timestamp`(`created_at`) USING BTREE, + INDEX `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 654904 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/kpi_c_title.sql b/database/install/kpi_c_title.sql new file mode 100644 index 00000000..9430160b --- /dev/null +++ b/database/install/kpi_c_title.sql @@ -0,0 +1,39 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_mariadb + Source Server Type : MariaDB + Source Server Version : 100338 (10.3.38-MariaDB) + Source Host : localhost:33066 + Source Schema : omc_db + + Target Server Type : MariaDB + Target Server Version : 100338 (10.3.38-MariaDB) + File Encoding : 65001 + + Date: 29/08/2024 17:21:06 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for kpi_c_title +-- ---------------------------- +DROP TABLE IF EXISTS `kpi_c_title`; +CREATE TABLE `kpi_c_title` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `kpi_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `expression` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `unit` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `status` enum('Active','Inactive','Deleted') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT 'enum:Active/Inactive/Deleted', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `created_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `idx_ne_kpi_id`(`ne_type`, `kpi_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_kpi_c_report.sql b/database/upgrade/upg_kpi_c_report.sql new file mode 100644 index 00000000..d4166f33 --- /dev/null +++ b/database/upgrade/upg_kpi_c_report.sql @@ -0,0 +1,40 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_mariadb + Source Server Type : MariaDB + Source Server Version : 100338 (10.3.38-MariaDB) + Source Host : localhost:33066 + Source Schema : tenants_db + + Target Server Type : MariaDB + Target Server Version : 100338 (10.3.38-MariaDB) + File Encoding : 65001 + + Date: 29/08/2024 14:53:38 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for kpi_c_report_upf +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `kpi_c_report` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', + `rm_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `date` date NOT NULL, + `start_time` time NULL DEFAULT NULL, + `end_time` time NULL DEFAULT NULL, + `index` smallint(6) NOT NULL, + `granularity` tinyint(4) NULL DEFAULT 60 COMMENT 'Time granualarity: 5/10/.../60/300 (second)', + `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_timestamp`(`created_at`) USING BTREE, + INDEX `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 654904 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_kpi_c_title.sql b/database/upgrade/upg_kpi_c_title.sql new file mode 100644 index 00000000..a3f3158a --- /dev/null +++ b/database/upgrade/upg_kpi_c_title.sql @@ -0,0 +1,38 @@ +/* + Navicat Premium Data Transfer + + Source Server : local_mariadb + Source Server Type : MariaDB + Source Server Version : 100338 (10.3.38-MariaDB) + Source Host : localhost:33066 + Source Schema : omc_db + + Target Server Type : MariaDB + Target Server Version : 100338 (10.3.38-MariaDB) + File Encoding : 65001 + + Date: 29/08/2024 17:21:06 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for kpi_c_title +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `kpi_c_title` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `kpi_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `expression` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `unit` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `status` enum('Active','Inactive','Deleted') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT 'enum:Active/Inactive/Deleted', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `created_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `updated_at` datetime NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `idx_ne_kpi_id`(`ne_type`, `kpi_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go index 85818b48..8f56fda4 100644 --- a/features/pm/kpi_c_report/controller.go +++ b/features/pm/kpi_c_report/controller.go @@ -5,8 +5,8 @@ import ( "net/http" "strings" + "be.ems/lib/dborm" "be.ems/lib/services" - "be.ems/src/framework/datasource" "github.com/gin-gonic/gin" ) @@ -30,7 +30,7 @@ func (k *KpiCReport) Get(c *gin.Context) { return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dborm := datasource.DefaultDB().Table(tableName) + dbg := dborm.DefaultDB().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)") @@ -51,30 +51,29 @@ func (k *KpiCReport) Get(c *gin.Context) { whereSql := "" if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") - dborm = dborm.Where(whereSql, params...) + dbg = dbg.Where(whereSql, params...) } // page number and size if pageSize := querys.PageSize; pageSize > 0 { - dborm = dborm.Limit(pageSize) + dbg = dbg.Limit(pageSize) if pageNum := querys.PageNum; pageNum > 0 { - dborm = dborm.Offset((pageNum - 1) * pageSize) + dbg = dbg.Offset((pageNum - 1) * pageSize) } } // order by if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dborm = dborm.Order(orderBy) + dbg = dbg.Order(orderBy) } - //err := datasource.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dborm.Find(&reports).Error + //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error + err := dbg.Find(&reports).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } c.JSON(http.StatusOK, services.DataResp(reports)) - //c.JSON(http.StatusOK, reports) } func (k *KpiCReport) GetReport2FE(c *gin.Context) { @@ -97,7 +96,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dborm := datasource.DefaultDB().Table(tableName) + dbg := dborm.DefaultDB().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)") @@ -118,24 +117,24 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { whereSql := "" if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") - dborm = dborm.Where(whereSql, params...) + dbg = dbg.Where(whereSql, params...) } // page number and size if pageSize := querys.PageSize; pageSize > 0 { - dborm = dborm.Limit(pageSize) + dbg = dbg.Limit(pageSize) if pageNum := querys.PageNum; pageNum > 0 { - dborm = dborm.Offset((pageNum - 1) * pageSize) + dbg = dbg.Offset((pageNum - 1) * pageSize) } } // order by if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dborm = dborm.Order(orderBy) + dbg = dbg.Order(orderBy) } - //err := datasource.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dborm.Find(&results).Error + //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error + err := dbg.Find(&results).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return @@ -153,7 +152,6 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { "timeGroup": r.Date[:10] + " " + *r.StartTime, "createdAt": r.CreatedAt, "granularity": r.Granularity, - "tenantID": r.TenantID, } for _, k := range r.KpiValues { @@ -184,7 +182,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dborm := datasource.DefaultDB().Table(tableName) + dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { conditions = append(conditions, "created_at >= ?") @@ -198,12 +196,12 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { whereSql := "" if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") - dborm = dborm.Where(whereSql, params...) + dbg = dbg.Where(whereSql, params...) } // get total number var total int64 = 0 - err := dborm.Count(&total).Error + err := dbg.Count(&total).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return @@ -211,27 +209,26 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) { // page number and size if pageSize := querys.PageSize; pageSize > 0 { - dborm = dborm.Limit(pageSize) + dbg = dbg.Limit(pageSize) if pageNum := querys.PageNum; pageNum > 0 { - dborm = dborm.Offset((pageNum - 1) * pageSize) + dbg = dbg.Offset((pageNum - 1) * pageSize) } } // order by if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dborm = dborm.Order(orderBy) + dbg = dbg.Order(orderBy) } - //err := datasource.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error - err = dborm.Find(&reports).Error + //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error + err = dbg.Find(&reports).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } c.JSON(http.StatusOK, services.TotalDataResp(reports, total)) - //c.JSON(http.StatusOK, reports) } func (k *KpiCReport) Total(c *gin.Context) { @@ -253,7 +250,7 @@ func (k *KpiCReport) Total(c *gin.Context) { return } tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dborm := datasource.DefaultDB().Table(tableName) + dbg := dborm.DefaultDB().Table(tableName) if querys.StartTime != "" { conditions = append(conditions, "created_at >= ?") @@ -267,10 +264,10 @@ func (k *KpiCReport) Total(c *gin.Context) { whereSql := "" if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") - dborm = dborm.Where(whereSql, params...) + dbg = dbg.Where(whereSql, params...) } var total int64 = 0 - err := dborm.Count(&total).Error + err := dbg.Count(&total).Error if err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return @@ -286,7 +283,7 @@ func (k *KpiCReport) Post(c *gin.Context) { c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) return } - if err := datasource.DefaultDB().Create(&report).Error; err != nil { + if err := dborm.DefaultDB().Create(&report).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } @@ -297,7 +294,7 @@ func (k *KpiCReport) Put(c *gin.Context) { var report KpiCReport id := c.Param("id") - if err := datasource.DefaultDB().First(&report, id).Error; err != nil { + if err := dborm.DefaultDB().First(&report, id).Error; err != nil { c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found")) return } @@ -306,14 +303,14 @@ func (k *KpiCReport) Put(c *gin.Context) { c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) return } - datasource.DefaultDB().Save(&report) + dborm.DefaultDB().Save(&report) c.JSON(http.StatusOK, services.DataResp(report)) } func (k *KpiCReport) Delete(c *gin.Context) { id := c.Param("id") - if err := datasource.DefaultDB().Delete(&KpiCReport{}, id).Error; err != nil { + if err := dborm.DefaultDB().Delete(&KpiCReport{}, id).Error; err != nil { c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found")) return } @@ -323,7 +320,7 @@ func (k *KpiCReport) Delete(c *gin.Context) { func InsertKpiCReport(neType string, report KpiCReport) { tableName := TableName() + "_" + strings.ToLower(neType) - if err := datasource.DefaultDB().Table(tableName).Create(&report).Error; err != nil { + if err := dborm.DefaultDB().Table(tableName).Create(&report).Error; err != nil { return } } diff --git a/features/pm/kpi_c_report/model.go b/features/pm/kpi_c_report/model.go index 512fb342..627040ad 100644 --- a/features/pm/kpi_c_report/model.go +++ b/features/pm/kpi_c_report/model.go @@ -27,7 +27,6 @@ type KpiCReport struct { 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"` - TenantID *string `gorm:"column:tenant_id;default:NULL" json:"tenantID,omitempty"` } type KpiCReportQuery struct { diff --git a/features/pm/kpi_c_title/controller.go b/features/pm/kpi_c_title/controller.go index 1c509470..56bba7af 100644 --- a/features/pm/kpi_c_title/controller.go +++ b/features/pm/kpi_c_title/controller.go @@ -5,8 +5,8 @@ import ( "net/http" "strings" + "be.ems/lib/dborm" "be.ems/lib/services" - "be.ems/src/framework/datasource" "github.com/gin-gonic/gin" ) @@ -21,7 +21,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) { return } - dborm := datasource.DefaultDB().Table(k.TableName()) + dbg := dborm.DefaultDB().Table(k.TableName()) // construct condition to get if neType := querys.NeType; neType != "" { conditions = append(conditions, "ne_type = ?") @@ -34,30 +34,30 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) { whereSql := "" if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") - dborm = dborm.Where(whereSql, params...) + dbg = dbg.Where(whereSql, params...) } // Get total number var total int64 = 0 - if err := dborm.Count(&total).Error; err != nil { + if err := dbg.Count(&total).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } // page number and size if pageSize := querys.PageSize; pageSize > 0 { - dborm = dborm.Limit(pageSize) + dbg = dbg.Limit(pageSize) if pageNum := querys.PageNum; pageNum > 0 { - dborm = dborm.Offset((pageNum - 1) * pageSize) + dbg = dbg.Offset((pageNum - 1) * pageSize) } } // order by if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dborm = dborm.Order(orderBy) + dbg = dbg.Order(orderBy) } - if err := dborm.Find(&titles).Error; err != nil { + if err := dbg.Find(&titles).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } @@ -84,7 +84,7 @@ func (k *KpiCTitle) Get(c *gin.Context) { if len(conditions) > 0 { whereSql += strings.Join(conditions, " and ") } - if err := datasource.DefaultDB().Where(whereSql, params...).Find(&titles).Error; err != nil { + if err := dborm.DefaultDB().Where(whereSql, params...).Find(&titles).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } @@ -111,7 +111,7 @@ func (k *KpiCTitle) Total(c *gin.Context) { whereSql += strings.Join(conditions, " and ") } var total int64 = 0 - if err := datasource.DefaultDB().Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil { + if err := dborm.DefaultDB().Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } @@ -126,11 +126,34 @@ func (k *KpiCTitle) Post(c *gin.Context) { c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) return } - if err := datasource.DefaultDB().Create(&title).Error; err != nil { + result := dborm.DefaultDB().Where("ne_type=? and kpi_id=?", title.NeType, title.KpiID).First(&title) + if result.RowsAffected > 0 { + c.JSON(http.StatusInternalServerError, services.ErrResp("target kpiC title already exist")) + return + } + if err := dborm.DefaultDB().Create(&title).Error; err != nil { c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) return } - + kpiCReportTable := "kpi_c_report_" + strings.ToLower(*title.NeType) + if !dborm.DefaultDB().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 { + c.JSON(http.StatusInternalServerError, 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 { + c.JSON(http.StatusInternalServerError, 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 { + c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) + return + } + } c.JSON(http.StatusCreated, services.DataResp(title)) } @@ -138,7 +161,7 @@ func (k *KpiCTitle) Put(c *gin.Context) { var title KpiCTitle id := c.Param("id") - if err := datasource.DefaultDB().First(&title, id).Error; err != nil { + if err := dborm.DefaultDB().First(&title, id).Error; err != nil { c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found")) return } @@ -147,7 +170,7 @@ func (k *KpiCTitle) Put(c *gin.Context) { c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) return } - datasource.DefaultDB().Save(&title) + dborm.DefaultDB().Save(&title) c.JSON(http.StatusOK, services.DataResp(title)) } @@ -155,7 +178,7 @@ func (k *KpiCTitle) Put(c *gin.Context) { func (k *KpiCTitle) Delete(c *gin.Context) { id := c.Param("id") - if err := datasource.DefaultDB().Delete(&KpiCTitle{}, id).Error; err != nil { + if err := dborm.DefaultDB().Delete(&KpiCTitle{}, id).Error; err != nil { c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found")) return } @@ -166,7 +189,7 @@ func (k *KpiCTitle) Delete(c *gin.Context) { func GetActiveKPICList(neType string) []KpiCTitle { k := new([]KpiCTitle) - err := datasource.DefaultDB().Where("`ne_type` = ? and `status` = 'Active'", neType).Find(&k).Error + err := dborm.DefaultDB().Where("`ne_type` = ? and `status` = 'Active'", neType).Find(&k).Error if err != nil { return nil } diff --git a/features/pm/kpi_c_title/model.go b/features/pm/kpi_c_title/model.go index 1bfbfcbc..77bb9423 100644 --- a/features/pm/kpi_c_title/model.go +++ b/features/pm/kpi_c_title/model.go @@ -8,7 +8,7 @@ type KpiCTitle struct { 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"` - Status *string `gorm:"column:status" json:"status,omitempty"` + 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"` diff --git a/lib/dborm/dbgorm.go b/lib/dborm/dbgorm.go new file mode 100644 index 00000000..95f794b8 --- /dev/null +++ b/lib/dborm/dbgorm.go @@ -0,0 +1,161 @@ +package dborm + +import ( + "fmt" + "log" + "os" + "regexp" + "time" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +// 数据库连接实例 +var dbgEngine *gorm.DB + +// 载入连接日志配置 +func loadLogger() logger.Interface { + newLogger := logger.New( + log.New(os.Stdout, "[GORM] ", log.LstdFlags), // 将日志输出到控制台 + logger.Config{ + SlowThreshold: time.Second, // Slow SQL 阈值 + LogLevel: logger.Info, // 日志级别 Silent不输出任何日志 + ParameterizedQueries: false, // 参数化查询SQL 用实际值带入?的执行语句 + Colorful: false, // 彩色日志输出 + }, + ) + return newLogger +} + +// 连接数据库实例 +func InitGormConnect(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam, dbLogging any) error { + var dialector gorm.Dialector + switch dbType { + case "mysql": + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", + dbUser, + dbPassword, + dbHost, + dbPort, + dbName, + dbParam, + ) + dialector = mysql.Open(dsn) + default: + err := fmt.Errorf("invalid type: %s", dbType) + return err + } + opts := &gorm.Config{} + // 是否需要日志输出 + if dbLogging.(bool) { + opts.Logger = loadLogger() + } + // 创建连接 + db, err := gorm.Open(dialector, opts) + if err != nil { + log.Fatalf("failed to open: %s", err) + return err + } + // 获取底层 SQL 数据库连接 + sqlDB, err := db.DB() + if err != nil { + log.Fatalf("failed to connect DB pool: %v", err) + return err + } + // 测试数据库连接 + err = sqlDB.Ping() + if err != nil { + log.Fatalf("failed to ping database: %v", err) + return err + } + dbgEngine = db + return nil +} + +// 关闭数据库实例 +func Close() { + sqlDB, err := dbgEngine.DB() + if err != nil { + log.Fatalf("failed to connect pool: %s", err) + } + if err := sqlDB.Close(); err != nil { + log.Fatalf("failed to close: %s", err) + } +} + +// 获取默认数据源 +func DefaultDB() *gorm.DB { + return dbgEngine +} + +// RawSQL 原生查询语句 +func RawSQL(sql string, parameters []any) ([]map[string]any, error) { + // 数据源 + db := DefaultDB() + + // 使用正则表达式替换连续的空白字符为单个空格 + fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ") + + // logger.Infof("sql=> %v", fmtSql) + // logger.Infof("parameters=> %v", parameters) + + // 查询结果 + var rows []map[string]any + res := db.Raw(fmtSql, parameters...).Scan(&rows) + if res.Error != nil { + return nil, res.Error + } + return rows, nil +} + +// ExecSQL 原生执行语句 +func ExecSQL(sql string, parameters []any) (int64, error) { + // 数据源 + db := DefaultDB() + + // 使用正则表达式替换连续的空白字符为单个空格 + fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ") + // 执行结果 + res := db.Exec(fmtSql, parameters...) + if res.Error != nil { + return 0, res.Error + } + return res.RowsAffected, nil +} + +func CloneTable(srcTable, dstTable string) error { + // 获取表 A 的结构信息 + var columns []gorm.ColumnType + dbMigrator := dbgEngine.Migrator() + columns, err := dbMigrator.ColumnTypes(srcTable) + if err != nil { + return fmt.Errorf("failed to ColumnTypes, %v", err) + } + + // 创建表 destination table + err = dbMigrator.CreateTable(dstTable) + if err != nil { + return fmt.Errorf("failed to CreateTable, %v", err) + } + // 复制表 src 的字段到表 dst + for _, column := range columns { + err = dbMigrator.AddColumn(dstTable, column.Name()) + if err != nil { + return fmt.Errorf("failed to AddColumn, %v", err) + } + } + + // 复制表 src 的主键和索引到表 dst + err = dbMigrator.CreateConstraint(dstTable, "PRIMARY") + if err != nil { + return fmt.Errorf("failed to AddColumn, %v", err) + } + + err = dbMigrator.CreateConstraint(dstTable, "INDEX") + if err != nil { + return fmt.Errorf("failed to AddColumn, %v", err) + } + return nil +} diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 420e5695..3bd13595 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -20,10 +20,10 @@ pprof: rest: - ipv4: 0.0.0.0 ipv6: - port: 33040 + port: 33030 webServer: - enabled: false + enabled: true rootDir: d:/local.git/fe.ems.vue3/dist listen: - addr: :80 @@ -39,7 +39,7 @@ database: type: mysql user: root password: "1000omc@kp!" - host: "192.168.8.58" + host: "127.0.0.1" port: 33066 name: "omc_db" connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True @@ -181,12 +181,12 @@ testConfig: file: ./etc/testconfig.yaml # 静态文件配置, 相对项目根路径或填绝对路径 -# staticFile: -# # 默认资源,dir目录需要预先创建 -# default: -# prefix: "/static" -# dir: "./static" -# # 文件上传资源目录映射,与项目目录同级 -# upload: -# prefix: "/upload" -# dir: "./upload" +staticFile: + # 默认资源,dir目录需要预先创建 + default: + prefix: "/static" + dir: "./static" + # 文件上传资源目录映射,与项目目录同级 + upload: + prefix: "/upload" + dir: "./upload" diff --git a/restagent/restagent.go b/restagent/restagent.go index 723b37f4..9dd6abcc 100644 --- a/restagent/restagent.go +++ b/restagent/restagent.go @@ -213,6 +213,12 @@ func main() { fmt.Println("dborm.initDbClient err:", err) os.Exit(4) } + err = dborm.InitGormConnect(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name, conf.Database.ConnParam, true) + if err != nil { + fmt.Println("dborm.InitGormConnect err:", err) + os.Exit(4) + } err = fm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, conf.Database.Host, conf.Database.Port, conf.Database.Name, conf.Database.ConnParam) if err != nil {