You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
439 lines
12 KiB
439 lines
12 KiB
package customchart
|
|
|
|
import (
|
|
"appPlatform/api/version1/customerform"
|
|
datacenter "appPlatform/api/version1/dataCenter"
|
|
"appPlatform/models/modelAppPlatform"
|
|
"appPlatform/overall"
|
|
"appPlatform/overall/publicmethod"
|
|
"encoding/json"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-06-27 08:56:40
|
|
@ 功能: 获取维度及度量字段
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) DimMeaFormTable(c *gin.Context) {
|
|
var requestData publicmethod.PublicId
|
|
err := c.ShouldBindJSON(&requestData)
|
|
if err != nil {
|
|
publicmethod.Result(200, err, c, "数据参数错误!")
|
|
return
|
|
}
|
|
var custTable modelAppPlatform.CustomerFormView
|
|
err = overall.CONSTANT_DB_AppPlatform.Model(&custTable).Select("`mastesformjson`,`table_structure`,`cfid`,`name`,`groupid`,`listjson`,`signCode`").Where("`status` = 1 AND `classify` <> 3 AND `tablekey` = ?", requestData.Id).First(&custTable).Error
|
|
if err != nil {
|
|
publicmethod.Result(200, err, c, "未找到表单!")
|
|
return
|
|
}
|
|
var formJsonCont customerform.CustomerFormMaster
|
|
json.Unmarshal([]byte(custTable.MastesFormJson), &formJsonCont)
|
|
var DimList []ChartFieldInfo
|
|
var MeaList []ChartFieldInfo
|
|
isCreaterTimg := true
|
|
var formUnitCont customerform.FormUnitInfo
|
|
formUnitCont.GainMasterAndSunFormUnit(requestData.Id, formJsonCont.List, true)
|
|
for _, v := range formUnitCont.MasterInfo {
|
|
if v.Name == "creater_time" {
|
|
isCreaterTimg = false
|
|
}
|
|
if publicmethod.IsInTrue[string](v.Type, publicmethod.Dimension) {
|
|
var dimInfo ChartFieldInfo
|
|
dimInfo.Title = v.Item.Label
|
|
if publicmethod.IsInTrue[string](v.Type, publicmethod.TimeUint) {
|
|
dimInfo.Type = 3
|
|
} else {
|
|
dimInfo.Type = 1
|
|
}
|
|
dimInfo.Field = v.Name
|
|
dimInfo.Options = v.Options
|
|
DimList = append(DimList, dimInfo)
|
|
}
|
|
if publicmethod.IsInTrue[string](v.Type, publicmethod.Quantization) {
|
|
var meaInfo ChartFieldInfo
|
|
meaInfo.Title = v.Item.Label
|
|
if publicmethod.IsInTrue[string](v.Type, publicmethod.TimeUint) {
|
|
meaInfo.Type = 3
|
|
} else {
|
|
meaInfo.Type = 2
|
|
}
|
|
meaInfo.Field = v.Name
|
|
meaInfo.Options = v.Options
|
|
MeaList = append(MeaList, meaInfo)
|
|
}
|
|
}
|
|
// for _, v := range formJsonCont.List {
|
|
// if v.Name == "creater_time" {
|
|
// isCreaterTimg = false
|
|
// }
|
|
// if publicmethod.IsInTrue[string](v.Type, publicmethod.Dimension) {
|
|
// var dimInfo ChartFieldInfo
|
|
// dimInfo.Title = v.Item.Label
|
|
// if publicmethod.IsInTrue[string](v.Type, publicmethod.TimeUint) {
|
|
// dimInfo.Type = 2
|
|
// } else {
|
|
// dimInfo.Type = 1
|
|
// }
|
|
// dimInfo.Field = v.Name
|
|
// DimList = append(DimList, dimInfo)
|
|
// }
|
|
// if publicmethod.IsInTrue[string](v.Type, publicmethod.Quantization) {
|
|
// var meaInfo ChartFieldInfo
|
|
// meaInfo.Title = v.Item.Label
|
|
// if publicmethod.IsInTrue[string](v.Type, publicmethod.TimeUint) {
|
|
// meaInfo.Type = 2
|
|
// } else {
|
|
// meaInfo.Type = 1
|
|
// }
|
|
// meaInfo.Field = v.Name
|
|
// MeaList = append(MeaList, meaInfo)
|
|
// }
|
|
// }
|
|
if isCreaterTimg {
|
|
var dimInfoOther ChartFieldInfo
|
|
dimInfoOther.Title = "创建时间"
|
|
dimInfoOther.Type = 3
|
|
dimInfoOther.Field = "creater_time"
|
|
DimList = append(DimList, dimInfoOther)
|
|
}
|
|
sort.Slice(DimList, func(i, j int) bool {
|
|
return DimList[i].Type < DimList[j].Type
|
|
})
|
|
sort.Slice(MeaList, func(i, j int) bool {
|
|
return MeaList[i].Type < MeaList[j].Type
|
|
})
|
|
sendMap := publicmethod.MapOut[string]()
|
|
sendMap["dimList"] = DimList
|
|
sendMap["meaList"] = MeaList
|
|
sendMap["formUnitCont"] = formUnitCont
|
|
publicmethod.Result(0, sendMap, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 08:31:10
|
|
@ 功能: 将图表信息写入数据库
|
|
*/
|
|
func (a *ApiMethod) CountChartValue(c *gin.Context) {
|
|
var requestData SaveChartSetup
|
|
c.ShouldBindJSON(&requestData)
|
|
if requestData.TableKey == "" {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!")
|
|
return
|
|
}
|
|
var custForm modelAppPlatform.CustomerForm
|
|
err := custForm.GetCont(map[string]interface{}{"`tablename`": requestData.TableKey}, "chartView", "`signCode`")
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!不可添加!")
|
|
return
|
|
}
|
|
chartJson, err := json.Marshal(requestData.ChartList)
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "图表数据不正确!不可写入!")
|
|
return
|
|
}
|
|
saveData := publicmethod.MapOut[string]()
|
|
saveData["`chartView`"] = string(chartJson)
|
|
saveData["`edit_time`"] = time.Now().Unix()
|
|
var saveMode modelAppPlatform.CustomerForm
|
|
err = saveMode.EiteCont(map[string]interface{}{"`signCode`": custForm.SignCode}, saveData)
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "图表数据不正确!不可写入!")
|
|
return
|
|
}
|
|
publicmethod.Result(0, err, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 10:57:22
|
|
@ 功能: 获取图表设定信息
|
|
*/
|
|
func (a *ApiMethod) GetChartCont(c *gin.Context) {
|
|
var requestData publicmethod.CommonId[string]
|
|
err := c.ShouldBindJSON(&requestData)
|
|
if err != nil {
|
|
publicmethod.Result(200, err, c, "数据参数错误!")
|
|
return
|
|
}
|
|
if requestData.Id == "" {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!2")
|
|
return
|
|
}
|
|
var custForm modelAppPlatform.CustomerForm
|
|
err = custForm.GetCont(map[string]interface{}{"`tablename`": requestData.Id}, "chartView")
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!")
|
|
return
|
|
}
|
|
var chartList []ChartInfo
|
|
err = json.Unmarshal([]byte(custForm.ChartView), &chartList)
|
|
if err != nil {
|
|
publicmethod.Result(200, chartList, c, "当前没有视图表 ")
|
|
return
|
|
}
|
|
publicmethod.Result(0, chartList, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 11:33:26
|
|
@ 功能: 根据条件解析图标结果
|
|
*/
|
|
func (a *ApiMethod) AnalyzeChartData(c *gin.Context) {
|
|
var requestData OneChartViews
|
|
err := c.ShouldBindJSON(&requestData)
|
|
if err != nil {
|
|
publicmethod.Result(200, err, c, "数据参数错误!")
|
|
return
|
|
}
|
|
if requestData.TableKey == "" {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!")
|
|
return
|
|
}
|
|
if requestData.ChartId == "" {
|
|
publicmethod.Result(1, requestData, c, "未知数据表!")
|
|
return
|
|
}
|
|
var custForm modelAppPlatform.CustomerFormView
|
|
err = custForm.GetCont(map[string]interface{}{"`status`": 1, "`signCode`": requestData.TableKey}, "`tablekey`", "`mastesformjson`", "`chartView`")
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "未知数据源表!2")
|
|
return
|
|
}
|
|
var formJsonCont customerform.CustomerFormMaster
|
|
json.Unmarshal([]byte(custForm.MastesFormJson), &formJsonCont)
|
|
|
|
var chartList []ChartInfo
|
|
err = json.Unmarshal([]byte(custForm.ChartView), &chartList)
|
|
if err != nil {
|
|
publicmethod.Result(200, chartList, c, "当前没有视图表 ")
|
|
return
|
|
}
|
|
isRun := true
|
|
var sendChartDat interface{}
|
|
for _, v := range chartList {
|
|
if v.Uuid == requestData.ChartId {
|
|
isRun = false
|
|
switch v.Type {
|
|
case "pie": //饼
|
|
case "line": //折线
|
|
case "target": //指标
|
|
case "barRace": //排行榜
|
|
case "radar": //雷达
|
|
default: //默认返回柱状图
|
|
sendChartDat = v.AnalyzeBarChart(custForm.TableKey, formJsonCont)
|
|
}
|
|
}
|
|
}
|
|
if isRun {
|
|
publicmethod.Result(200, sendChartDat, c, "没有此表的数据! ")
|
|
return
|
|
}
|
|
publicmethod.Result(0, sendChartDat, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 14:24:28
|
|
@ 功能: 解析柱状图
|
|
*/
|
|
func (c *ChartInfo) AnalyzeBarChart(tableName string, formJsonCont customerform.CustomerFormMaster) interface{} {
|
|
var formList []map[string]interface{}
|
|
var gormDb *gorm.DB
|
|
if formJsonCont.Form.DataSource == "yes" { //外链表单
|
|
var sqlDb datacenter.DataBastType
|
|
sqlDb.Type = formJsonCont.Form.DataSourceConfig.DSN.SqlType
|
|
sqlDb.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip
|
|
sqlDb.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName
|
|
sqlDb.Port = formJsonCont.Form.DataSourceConfig.DSN.Port
|
|
sqlDb.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName
|
|
sqlDb.Pwd = formJsonCont.Form.DataSourceConfig.DSN.Password
|
|
sqlDborm, err := sqlDb.StartDataBast()
|
|
if err != nil {
|
|
sqlDborm, err = datacenter.GainDataStorce(formJsonCont.Form.DataSourceConfig.Id)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
gormDb = sqlDborm.Table(tableName)
|
|
} else {
|
|
gormDb = overall.CONSTANT_DB_CustomerForm.Table(tableName)
|
|
}
|
|
//判断是否有过滤条件
|
|
if len(c.Filter) > 0 {
|
|
for _, v := range c.Filter {
|
|
gormDb = v.MakeGormSql(gormDb)
|
|
}
|
|
}
|
|
currTime := time.Now().Unix()
|
|
//时间约束
|
|
switch c.TimeLength {
|
|
case 2: //近一周
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-604800, currTime)
|
|
case 3: //近一月
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-2628000, currTime)
|
|
case 4: //近三月
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-7884000, currTime)
|
|
case 5: //近半年
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-15768000, currTime)
|
|
case 6: //近一年
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-31536000, currTime)
|
|
default: //近一天
|
|
gormDb = gormDb.Where("`creater_time` BETWEEN ? AND ?", currTime-86400, currTime)
|
|
}
|
|
err := gormDb.Find(&formList).Error
|
|
if err != nil && len(formList) < 1 {
|
|
return nil
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 15:37:29
|
|
@ 功能: 根据过滤,组装查询条件
|
|
*/
|
|
func (f *FilterInfo) MakeGormSql(gormDb *gorm.DB) *gorm.DB {
|
|
switch f.Type {
|
|
case 2:
|
|
// switch f.Method {
|
|
// case 2:
|
|
// sqlSelectStr := fmt.Sprintf("AVG(`%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// case 3:
|
|
// sqlSelectStr := fmt.Sprintf("COUNT(`%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// case 4:
|
|
// sqlSelectStr := fmt.Sprintf("COUNT(DISTINCT `%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// case 5:
|
|
// sqlSelectStr := fmt.Sprintf("MAX(`%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// case 6:
|
|
// sqlSelectStr := fmt.Sprintf("MIN(`%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// default:
|
|
// sqlSelectStr := fmt.Sprintf("SUM(`%v`)", f.Field)
|
|
// gormDb = gormDb.Select(sqlSelectStr)
|
|
// }
|
|
gormDb = f.CalculationConditions(gormDb)
|
|
case 3:
|
|
star, _ := publicmethod.StringToInt64(f.StartTime)
|
|
endTime, _ := publicmethod.StringToInt64(f.EndTime)
|
|
if star != 0 && endTime != 0 {
|
|
sqlStr := fmt.Sprintf("%v BETWEEN %v AND %v", f.Field, star, endTime)
|
|
gormDb = gormDb.Where(sqlStr)
|
|
} else if star != 0 && endTime == 0 {
|
|
sqlStr := fmt.Sprintf("%v > %v ", f.Field, star)
|
|
gormDb = gormDb.Where(sqlStr)
|
|
} else if star == 0 && endTime != 0 {
|
|
sqlStr := fmt.Sprintf("%v < %v ", f.Field, endTime)
|
|
gormDb = gormDb.Where(sqlStr)
|
|
}
|
|
default:
|
|
if f.Conditions != "" {
|
|
sqlStr := fmt.Sprintf("%v LIKE %v%v%v", f.Field, "'%", f.Conditions, "%'")
|
|
gormDb = gormDb.Where(sqlStr)
|
|
}
|
|
}
|
|
return gormDb
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 16:01:30
|
|
@ 功能: 数值计算条件
|
|
|
|
#gormDb 数据库实例
|
|
#Modality 条件形式。 1:单条件;2:或条件;3:且条件
|
|
#ModalityList 条件列表
|
|
*/
|
|
func (f *FilterInfo) CalculationConditions(gormDb *gorm.DB) *gorm.DB {
|
|
if len(f.ModalityList) > 0 {
|
|
switch f.Modality {
|
|
case 2:
|
|
var sqlList []string
|
|
for _, v := range f.ModalityList {
|
|
sqlList = append(sqlList, Dengshi(v.Equation, f.Field, v.Value))
|
|
}
|
|
if len(sqlList) > 0 {
|
|
sqlStr := strings.Join(sqlList, " OR ")
|
|
gormDb = gormDb.Where(sqlStr)
|
|
}
|
|
|
|
case 3:
|
|
var sqlList []string
|
|
for _, v := range f.ModalityList {
|
|
sqlList = append(sqlList, Dengshi(v.Equation, f.Field, v.Value))
|
|
}
|
|
if len(sqlList) > 0 {
|
|
sqlStr := strings.Join(sqlList, " AND ")
|
|
gormDb = gormDb.Where(sqlStr)
|
|
}
|
|
default:
|
|
sqlStr := Dengshi(f.ModalityList[0].Equation, f.Field, f.ModalityList[0].Value)
|
|
if sqlStr != "" {
|
|
gormDb = gormDb.Where(sqlStr)
|
|
}
|
|
|
|
}
|
|
}
|
|
return gormDb
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-07-08 16:09:27
|
|
@ 功能: 等式演化
|
|
*/
|
|
func Dengshi(t int, field, val string) (sqlStr string) {
|
|
|
|
switch t {
|
|
case 2:
|
|
sqlStr = fmt.Sprintf("%v <> %v", field, val)
|
|
case 3:
|
|
sqlStr = fmt.Sprintf("%v > %v", field, val)
|
|
case 4:
|
|
sqlStr = fmt.Sprintf("%v < %v", field, val)
|
|
case 5:
|
|
sqlStr = fmt.Sprintf("%v >= %v", field, val)
|
|
case 6:
|
|
sqlStr = fmt.Sprintf("%v <= %v", field, val)
|
|
case 7:
|
|
sqlStr = fmt.Sprintf("%v IS NULL", field)
|
|
case 8:
|
|
sqlStr = fmt.Sprintf("%v IS NOT NULL", field)
|
|
default:
|
|
sqlStr = fmt.Sprintf("%v = %v", field, val)
|
|
|
|
}
|
|
return
|
|
}
|
|
|