应用集成平台服务端
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

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
}