fix for custom kpi and export log&cdr table file

This commit is contained in:
2024-08-30 11:41:22 +08:00
parent 0555d4a3d2
commit fb3ce6183b
11 changed files with 408 additions and 64 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -5,8 +5,8 @@ import (
"net/http" "net/http"
"strings" "strings"
"be.ems/lib/dborm"
"be.ems/lib/services" "be.ems/lib/services"
"be.ems/src/framework/datasource"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -30,7 +30,7 @@ func (k *KpiCReport) Get(c *gin.Context) {
return return
} }
tableName := TableName() + "_" + strings.ToLower(querys.NeType) tableName := TableName() + "_" + strings.ToLower(querys.NeType)
dborm := datasource.DefaultDB().Table(tableName) dbg := dborm.DefaultDB().Table(tableName)
if querys.NeID != "" { 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)") 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 := "" whereSql := ""
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
dborm = dborm.Where(whereSql, params...) dbg = dbg.Where(whereSql, params...)
} }
// page number and size // page number and size
if pageSize := querys.PageSize; pageSize > 0 { if pageSize := querys.PageSize; pageSize > 0 {
dborm = dborm.Limit(pageSize) dbg = dbg.Limit(pageSize)
if pageNum := querys.PageNum; pageNum > 0 { if pageNum := querys.PageNum; pageNum > 0 {
dborm = dborm.Offset((pageNum - 1) * pageSize) dbg = dbg.Offset((pageNum - 1) * pageSize)
} }
} }
// order by // order by
if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" {
orderBy := fmt.Sprintf("%s %s", 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.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
err := dborm.Find(&reports).Error err := dbg.Find(&reports).Error
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
c.JSON(http.StatusOK, services.DataResp(reports)) c.JSON(http.StatusOK, services.DataResp(reports))
//c.JSON(http.StatusOK, reports)
} }
func (k *KpiCReport) GetReport2FE(c *gin.Context) { func (k *KpiCReport) GetReport2FE(c *gin.Context) {
@@ -97,7 +96,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
return return
} }
tableName := TableName() + "_" + strings.ToLower(querys.NeType) tableName := TableName() + "_" + strings.ToLower(querys.NeType)
dborm := datasource.DefaultDB().Table(tableName) dbg := dborm.DefaultDB().Table(tableName)
if querys.NeID != "" { 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)") 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 := "" whereSql := ""
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
dborm = dborm.Where(whereSql, params...) dbg = dbg.Where(whereSql, params...)
} }
// page number and size // page number and size
if pageSize := querys.PageSize; pageSize > 0 { if pageSize := querys.PageSize; pageSize > 0 {
dborm = dborm.Limit(pageSize) dbg = dbg.Limit(pageSize)
if pageNum := querys.PageNum; pageNum > 0 { if pageNum := querys.PageNum; pageNum > 0 {
dborm = dborm.Offset((pageNum - 1) * pageSize) dbg = dbg.Offset((pageNum - 1) * pageSize)
} }
} }
// order by // order by
if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" {
orderBy := fmt.Sprintf("%s %s", 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.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
err := dborm.Find(&results).Error err := dbg.Find(&results).Error
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
@@ -153,7 +152,6 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
"timeGroup": r.Date[:10] + " " + *r.StartTime, "timeGroup": r.Date[:10] + " " + *r.StartTime,
"createdAt": r.CreatedAt, "createdAt": r.CreatedAt,
"granularity": r.Granularity, "granularity": r.Granularity,
"tenantID": r.TenantID,
} }
for _, k := range r.KpiValues { for _, k := range r.KpiValues {
@@ -184,7 +182,7 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
return return
} }
tableName := TableName() + "_" + strings.ToLower(querys.NeType) tableName := TableName() + "_" + strings.ToLower(querys.NeType)
dborm := datasource.DefaultDB().Table(tableName) dbg := dborm.DefaultDB().Table(tableName)
if querys.StartTime != "" { if querys.StartTime != "" {
conditions = append(conditions, "created_at >= ?") conditions = append(conditions, "created_at >= ?")
@@ -198,12 +196,12 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
whereSql := "" whereSql := ""
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
dborm = dborm.Where(whereSql, params...) dbg = dbg.Where(whereSql, params...)
} }
// get total number // get total number
var total int64 = 0 var total int64 = 0
err := dborm.Count(&total).Error err := dbg.Count(&total).Error
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
@@ -211,27 +209,26 @@ func (k *KpiCReport) GetTotalList(c *gin.Context) {
// page number and size // page number and size
if pageSize := querys.PageSize; pageSize > 0 { if pageSize := querys.PageSize; pageSize > 0 {
dborm = dborm.Limit(pageSize) dbg = dbg.Limit(pageSize)
if pageNum := querys.PageNum; pageNum > 0 { if pageNum := querys.PageNum; pageNum > 0 {
dborm = dborm.Offset((pageNum - 1) * pageSize) dbg = dbg.Offset((pageNum - 1) * pageSize)
} }
} }
// order by // order by
if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" {
orderBy := fmt.Sprintf("%s %s", 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.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error
err = dborm.Find(&reports).Error err = dbg.Find(&reports).Error
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
c.JSON(http.StatusOK, services.TotalDataResp(reports, total)) c.JSON(http.StatusOK, services.TotalDataResp(reports, total))
//c.JSON(http.StatusOK, reports)
} }
func (k *KpiCReport) Total(c *gin.Context) { func (k *KpiCReport) Total(c *gin.Context) {
@@ -253,7 +250,7 @@ func (k *KpiCReport) Total(c *gin.Context) {
return return
} }
tableName := TableName() + "_" + strings.ToLower(querys.NeType) tableName := TableName() + "_" + strings.ToLower(querys.NeType)
dborm := datasource.DefaultDB().Table(tableName) dbg := dborm.DefaultDB().Table(tableName)
if querys.StartTime != "" { if querys.StartTime != "" {
conditions = append(conditions, "created_at >= ?") conditions = append(conditions, "created_at >= ?")
@@ -267,10 +264,10 @@ func (k *KpiCReport) Total(c *gin.Context) {
whereSql := "" whereSql := ""
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
dborm = dborm.Where(whereSql, params...) dbg = dbg.Where(whereSql, params...)
} }
var total int64 = 0 var total int64 = 0
err := dborm.Count(&total).Error err := dbg.Count(&total).Error
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
@@ -286,7 +283,7 @@ func (k *KpiCReport) Post(c *gin.Context) {
c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) c.JSON(http.StatusBadRequest, services.ErrResp(err.Error()))
return 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
@@ -297,7 +294,7 @@ func (k *KpiCReport) Put(c *gin.Context) {
var report KpiCReport var report KpiCReport
id := c.Param("id") 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")) c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found"))
return return
} }
@@ -306,14 +303,14 @@ func (k *KpiCReport) Put(c *gin.Context) {
c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) c.JSON(http.StatusBadRequest, services.ErrResp(err.Error()))
return return
} }
datasource.DefaultDB().Save(&report) dborm.DefaultDB().Save(&report)
c.JSON(http.StatusOK, services.DataResp(report)) c.JSON(http.StatusOK, services.DataResp(report))
} }
func (k *KpiCReport) Delete(c *gin.Context) { func (k *KpiCReport) Delete(c *gin.Context) {
id := c.Param("id") 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")) c.JSON(http.StatusNotFound, services.ErrResp("KPI report not found"))
return return
} }
@@ -323,7 +320,7 @@ func (k *KpiCReport) Delete(c *gin.Context) {
func InsertKpiCReport(neType string, report KpiCReport) { func InsertKpiCReport(neType string, report KpiCReport) {
tableName := TableName() + "_" + strings.ToLower(neType) 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 return
} }
} }

View File

@@ -27,7 +27,6 @@ type KpiCReport struct {
Granularity *int8 `gorm:"column:granularity;default:60" json:"granularity,omitempty"` //Time granualarity: 5/10/.../60/300 (second) 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"` KpiValues KpiCValues `gorm:"column:kpi_values;type:json" json:"kpiValues,omitempty"`
CreatedAt *time.Time `gorm:"column:created_at;default:current_timestamp()" json:"createdAt,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 { type KpiCReportQuery struct {

View File

@@ -5,8 +5,8 @@ import (
"net/http" "net/http"
"strings" "strings"
"be.ems/lib/dborm"
"be.ems/lib/services" "be.ems/lib/services"
"be.ems/src/framework/datasource"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -21,7 +21,7 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
return return
} }
dborm := datasource.DefaultDB().Table(k.TableName()) dbg := dborm.DefaultDB().Table(k.TableName())
// construct condition to get // construct condition to get
if neType := querys.NeType; neType != "" { if neType := querys.NeType; neType != "" {
conditions = append(conditions, "ne_type = ?") conditions = append(conditions, "ne_type = ?")
@@ -34,30 +34,30 @@ func (k *KpiCTitle) GetToalList(c *gin.Context) {
whereSql := "" whereSql := ""
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
dborm = dborm.Where(whereSql, params...) dbg = dbg.Where(whereSql, params...)
} }
// Get total number // Get total number
var total int64 = 0 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
// page number and size // page number and size
if pageSize := querys.PageSize; pageSize > 0 { if pageSize := querys.PageSize; pageSize > 0 {
dborm = dborm.Limit(pageSize) dbg = dbg.Limit(pageSize)
if pageNum := querys.PageNum; pageNum > 0 { if pageNum := querys.PageNum; pageNum > 0 {
dborm = dborm.Offset((pageNum - 1) * pageSize) dbg = dbg.Offset((pageNum - 1) * pageSize)
} }
} }
// order by // order by
if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" {
orderBy := fmt.Sprintf("%s %s", 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
@@ -84,7 +84,7 @@ func (k *KpiCTitle) Get(c *gin.Context) {
if len(conditions) > 0 { if len(conditions) > 0 {
whereSql += strings.Join(conditions, " and ") 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
@@ -111,7 +111,7 @@ func (k *KpiCTitle) Total(c *gin.Context) {
whereSql += strings.Join(conditions, " and ") whereSql += strings.Join(conditions, " and ")
} }
var total int64 = 0 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return return
} }
@@ -126,11 +126,34 @@ func (k *KpiCTitle) Post(c *gin.Context) {
c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) c.JSON(http.StatusBadRequest, services.ErrResp(err.Error()))
return 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())) c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
return 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)) c.JSON(http.StatusCreated, services.DataResp(title))
} }
@@ -138,7 +161,7 @@ func (k *KpiCTitle) Put(c *gin.Context) {
var title KpiCTitle var title KpiCTitle
id := c.Param("id") 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")) c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found"))
return return
} }
@@ -147,7 +170,7 @@ func (k *KpiCTitle) Put(c *gin.Context) {
c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) c.JSON(http.StatusBadRequest, services.ErrResp(err.Error()))
return return
} }
datasource.DefaultDB().Save(&title) dborm.DefaultDB().Save(&title)
c.JSON(http.StatusOK, services.DataResp(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) { func (k *KpiCTitle) Delete(c *gin.Context) {
id := c.Param("id") 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")) c.JSON(http.StatusNotFound, services.ErrResp("KPIC Title not found"))
return return
} }
@@ -166,7 +189,7 @@ func (k *KpiCTitle) Delete(c *gin.Context) {
func GetActiveKPICList(neType string) []KpiCTitle { func GetActiveKPICList(neType string) []KpiCTitle {
k := new([]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 { if err != nil {
return nil return nil
} }

View File

@@ -8,7 +8,7 @@ type KpiCTitle struct {
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"`
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"` 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"`
CreatedBy *string `gorm:"column:created_by;default:NULL," json:"createdBy,omitempty"` CreatedBy *string `gorm:"column:created_by;default:NULL," json:"createdBy,omitempty"`

161
lib/dborm/dbgorm.go Normal file
View File

@@ -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
}

View File

@@ -20,10 +20,10 @@ pprof:
rest: rest:
- ipv4: 0.0.0.0 - ipv4: 0.0.0.0
ipv6: ipv6:
port: 33040 port: 33030
webServer: webServer:
enabled: false enabled: true
rootDir: d:/local.git/fe.ems.vue3/dist rootDir: d:/local.git/fe.ems.vue3/dist
listen: listen:
- addr: :80 - addr: :80
@@ -39,7 +39,7 @@ database:
type: mysql type: mysql
user: root user: root
password: "1000omc@kp!" password: "1000omc@kp!"
host: "192.168.8.58" host: "127.0.0.1"
port: 33066 port: 33066
name: "omc_db" name: "omc_db"
connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True
@@ -181,12 +181,12 @@ testConfig:
file: ./etc/testconfig.yaml file: ./etc/testconfig.yaml
# 静态文件配置, 相对项目根路径或填绝对路径 # 静态文件配置, 相对项目根路径或填绝对路径
# staticFile: staticFile:
# # 默认资源dir目录需要预先创建 # 默认资源dir目录需要预先创建
# default: default:
# prefix: "/static" prefix: "/static"
# dir: "./static" dir: "./static"
# # 文件上传资源目录映射,与项目目录同级 # 文件上传资源目录映射,与项目目录同级
# upload: upload:
# prefix: "/upload" prefix: "/upload"
# dir: "./upload" dir: "./upload"

View File

@@ -213,6 +213,12 @@ func main() {
fmt.Println("dborm.initDbClient err:", err) fmt.Println("dborm.initDbClient err:", err)
os.Exit(4) 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, err = fm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password,
conf.Database.Host, conf.Database.Port, conf.Database.Name, conf.Database.ConnParam) conf.Database.Host, conf.Database.Port, conf.Database.Name, conf.Database.ConnParam)
if err != nil { if err != nil {