package customChartesing import ( "appPlatform/api/version1/customerform" datacenter "appPlatform/api/version1/dataCenter" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" "appPlatform/overall" "appPlatform/overall/publicmethod" "encoding/json" "fmt" "sort" "strconv" "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) } } var SunMeaListAry []SunDimMea var SunDimListAry []SunDimMea //子表数据维度与量化字段统计 SunMeaList := make(map[string][]ChartFieldInfo) SunDimList := make(map[string][]ChartFieldInfo) for _, v := range formUnitCont.SunFormInfo { var sunMeatInfo ChartFieldInfo var sunDimlInfo ChartFieldInfo var sunMeatInfoEs SunDimMea var sunDimlInfoEs SunDimMea for ni, nv := range v.UbitInfo { sunMeatInfoEs.TableKey = v.TableName sunMeatInfoEs.TableName = v.TableTitle sunMeatInfo.Field = ni sunMeatInfo.Title = nv.Item.Label sunMeatInfo.TableKey = v.TableName sunMeatInfo.Options = nv.Options fmt.Printf("子表数据维度与量化字段统计\n\n%v------------>%v\n\n", ni, nv) if publicmethod.IsInTrue[string](nv.Type, publicmethod.Dimension) { if publicmethod.IsInTrue[string](nv.Type, publicmethod.TimeUint) { sunMeatInfo.Type = 3 } else { sunMeatInfo.Type = 1 } SunMeaList[v.TableName] = append(SunMeaList[v.TableName], sunMeatInfo) sunMeatInfoEs.TableUnit = append(sunMeatInfoEs.TableUnit, sunMeatInfo) } sunDimlInfoEs.TableKey = v.TableName sunDimlInfoEs.TableName = v.TableTitle sunDimlInfo.Field = ni sunDimlInfo.Title = nv.Item.Label sunDimlInfo.TableKey = v.TableName sunDimlInfo.Options = nv.Options if publicmethod.IsInTrue[string](nv.Type, publicmethod.Quantization) { if publicmethod.IsInTrue[string](nv.Type, publicmethod.TimeUint) { sunDimlInfo.Type = 3 } else { sunDimlInfo.Type = 2 } SunDimList[v.TableName] = append(SunDimList[v.TableName], sunDimlInfo) sunDimlInfoEs.TableUnit = append(sunDimlInfoEs.TableUnit, sunDimlInfo) } } if len(sunMeatInfoEs.TableUnit) < 1 { sunMeatInfoEs.TableUnit = sunDimlInfoEs.TableUnit } SunMeaListAry = append(SunMeaListAry, sunMeatInfoEs) SunDimListAry = append(SunDimListAry, sunDimlInfoEs) } 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 sendMap["sunMeaList"] = SunMeaList sendMap["sunDimList"] = SunDimList sendMap["SunMeaListAry"] = SunMeaListAry sendMap["SunDimListAry"] = SunDimListAry 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{} { fmt.Printf("数据表--->%v\n\n\n", tableName) 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 } /* * @ 作者: 秦东 @ 时间: 2025-09-26 10:46:30 @ 功能: 初始化个人图表配置及数据 */ func (a *ApiMethod) GetMyChartSetupAndData(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(200, err, c, "未知表单,不可操作!") return } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) //当前操作人 if userCont.Key == 0 { publicmethod.Result(300, err, c, "未知操作人!登陆是否超时!") return } var chartInfo modelAppPlatform.Mychart chartInfo.GetCont(map[string]interface{}{"`tableKey`": requestData.Id, "`userKey`": userCont.Key}) sendData := publicmethod.MapOut[string]() if chartInfo.Uuid != 0 { sendData["myChartId"] = strconv.FormatInt(chartInfo.Uuid, 10) } else { sendData["myChartId"] = "" } if chartInfo.ChartView == "" { sendData["chartList"] = []interface{}{} publicmethod.Result(0, sendData, c) return } var chartList interface{} json.Unmarshal([]byte(chartInfo.ChartView), &chartList) sendData["chartList"] = chartList publicmethod.Result(0, sendData, c) } /* * @ 作者: 秦东 @ 时间: 2025-09-29 14:01:49 @ 功能: 保存跟人图表设置 */ func (a *ApiMethod) SaveMyBiCharts(c *gin.Context) { var requestData SaveChartSetup err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(1, err, c) return } 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 } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) //当前操作人 if userCont.Key == 0 { publicmethod.Result(300, err, c, "未知操作人!登陆是否超时!") return } var chartInfo modelAppPlatform.Mychart chartInfo.GetCont(map[string]interface{}{"`tableKey`": requestData.TableKey, "`userKey`": userCont.Key}) if chartInfo.Uuid != 0 { var chartInfoSave modelAppPlatform.Mychart saveData := publicmethod.MapOut[string]() saveData["`chartView`"] = string(chartJson) saveData["`editTime`"] = time.Now().Unix() err = chartInfoSave.EiteCont(map[string]interface{}{"`uuid`": chartInfo.Uuid}, saveData) if err != nil { publicmethod.Result(1, err, c) return } } else { chartInfo.Uuid = publicmethod.GetUUid(1) chartInfo.TableKey = requestData.TableKey chartInfo.UserKey = userCont.Key chartInfo.ChartView = string(chartJson) chartInfo.EditTime = time.Now().Unix() err = overall.CONSTANT_DB_AppPlatform.Create(&chartInfo).Error if err != nil { publicmethod.Result(1, err, c) return } } publicmethod.Result(0, err, c) }