package customChartesing 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 fmt.Printf("\n\n组件量化--->%v--->%v\n\n", v.Item.Label, v.Type) 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 err := c.ShouldBindJSON(&requestData) fmt.Printf("\n\n========>%v\n\n", err) 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 } fmt.Printf("\n\n========>%v\n\n", requestData.ChartList) 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, "`tablekey`": 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 if searchMap, isOk := requestData.SetConfig.Search.(map[string]interface{}); isOk { if valDate, isOk := searchMap["factor"]; isOk { if factor, isOk := valDate.([]interface{}); isOk { if len(factor) > 0 { // charJson, _ := json.Marshal(requestData.SetConfig) // err = json.Unmarshal(charJson, &chartList) chartList = append(chartList, requestData.SetConfig) } else { err = json.Unmarshal([]byte(custForm.ChartView), &chartList) } } } } fmt.Printf("") 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 sendChartDat = v.AnalyzeBarChart(custForm.TableKey, formJsonCont) switch v.Type { case "pie": //饼 sendChartDat = v.pieChart(sendChartDat, formJsonCont.List, "pie") case "line": //折线 sendChartDat = v.zhuChart(sendChartDat, formJsonCont.List, "line") case "target": //指标 sendChartDat = v.TargetChart(sendChartDat, formJsonCont.List, "target") case "barRace": //排行榜 sendChartDat = v.barRaceChart(sendChartDat, formJsonCont.List, "pie") case "radar": //雷达 sendChartDat = v.radarChart(sendChartDat, formJsonCont.List, "radar") default: //默认返回柱状图 sendChartDat = v.zhuChart(sendChartDat, formJsonCont.List, "bar") } } } if isRun { // for _, v := range requestData.SetConfig { if requestData.SetConfig.Uuid == requestData.ChartId { // isRun = false sendChartDat = requestData.SetConfig.AnalyzeBarChart(custForm.TableKey, formJsonCont) switch requestData.SetConfig.Type { case "pie": //饼 sendChartDat = requestData.SetConfig.pieChart(sendChartDat, formJsonCont.List, "pie") case "line": //折线 sendChartDat = requestData.SetConfig.zhuChart(sendChartDat, formJsonCont.List, "line") case "target": //指标 sendChartDat = requestData.SetConfig.TargetChart(sendChartDat, formJsonCont.List, "target") case "barRace": //排行榜 sendChartDat = requestData.SetConfig.barRaceChart(sendChartDat, formJsonCont.List, "pie") case "radar": //雷达 sendChartDat = requestData.SetConfig.radarChart(sendChartDat, formJsonCont.List, "radar") default: //默认返回柱状图 sendChartDat = requestData.SetConfig.zhuChart(sendChartDat, formJsonCont.List, "bar") } } // } // if requestData.ChartId == requestData.SetConfig. // publicmethod.Result(200, sendChartDat, c, "没有此表的数据! ") // return } jdfk := publicmethod.GetDaysInMonth(2025, 7) fmt.Printf("\n\njdfk:%T----2----->%v\n\n", jdfk, jdfk) 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).Where("`states` = 1") } else { gormDb = overall.CONSTANT_DB_CustomerForm.Table(tableName).Where("`states` = 1") } //判断是否有过滤条件 if len(c.Filter) > 0 { for _, v := range c.Filter { gormDb = v.MakeGormSql(gormDb) } } //判断是否有搜索 gormDb = MakeSearchSql(c.Search, 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 } // fmt.Printf("\n\n%v\n\n", formList) return formList } /* * @ 作者: 秦东 @ 时间: 2025-07-11 09:46:48 @ 功能: 根据搜索条件组装查询条件 */ func MakeSearchSql(searck interface{}, gormDb *gorm.DB) *gorm.DB { if searchMap, isOk := searck.(map[string]interface{}); isOk { if factor, isOk := searchMap["factor"]; isOk { if factorMap, isOk := factor.([]interface{}); isOk { for _, v := range factorMap { if val, isOk := v.(map[string]interface{}); isOk { if fieldVal, isOk := val["field"]; isOk { if isTime, isOk := val["isTime"]; isOk { fmt.Printf("\n\nV:%T----2----->%v\n\n", isTime, isTime) if isTrue, isOk := isTime.(bool); isOk { if isTrue { var startTime int64 var endTime int64 if valData, isOk := val["value"]; isOk { if valMap, isok := valData.([]interface{}); isok { if len(valMap) > 0 { startTime, _ = publicmethod.StringToInt64(valMap[0]) endTime, _ = publicmethod.StringToInt64(valMap[len(valMap)-1]) sqlStr := fmt.Sprintf("%v BETWEEN %v AND %v", fieldVal, startTime, endTime) gormDb = gormDb.Where(sqlStr) } } } if startTimeVal, isOk := val["startTime"]; isOk { startTime, _ = publicmethod.StringToInt64(startTimeVal) } if endTimeVal, isOk := val["endTime"]; isOk { endTime, _ = publicmethod.StringToInt64(endTimeVal) } if startTime > 0 && endTime > 0 { sqlStr := fmt.Sprintf("%v BETWEEN %v AND %v", fieldVal, startTime, endTime) gormDb = gormDb.Where(sqlStr) } else if startTime > 0 && endTime <= 0 { sqlStr := fmt.Sprintf("%v = %v", fieldVal, startTime) gormDb = gormDb.Where(sqlStr) } else if startTime <= 0 && endTime > 0 { sqlStr := fmt.Sprintf("%v = %v", fieldVal, endTime) gormDb = gormDb.Where(sqlStr) } } else { if valInfo, isOk := val["value"]; isOk { valStr := publicmethod.TypeToInterface(valInfo) if valStr != "" { if options, isOk := val["options"]; isOk { fmt.Printf("\n\nV:%T----1----->%v\n\n", options, options) if _, isOk := options.([]interface{}); isOk { sqlStr := fmt.Sprintf("%v = %v", fieldVal, valInfo) gormDb = gormDb.Where(sqlStr) } else { sqlStr := fmt.Sprintf("%v LIKE %v%v%v", fieldVal, "'%", valInfo, "%'") gormDb = gormDb.Where(sqlStr) } } else { sqlStr := fmt.Sprintf("%v LIKE %v%v%v", fieldVal, "'%", valInfo, "%'") gormDb = gormDb.Where(sqlStr) } } } } } } } } } } } } return gormDb } /* * @ 作者: 秦东 @ 时间: 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 }