package data_manage import ( "encoding/json" "fmt" "github.com/rdlucklib/rdluck_tools/paging" "hongze/hongze_ETA_mobile_api/controllers" "hongze/hongze_ETA_mobile_api/models" "hongze/hongze_ETA_mobile_api/models/data_manage" "hongze/hongze_ETA_mobile_api/models/system" "hongze/hongze_ETA_mobile_api/services/data" "hongze/hongze_ETA_mobile_api/utils" "strconv" "strings" "time" ) // 图表管理 type ChartInfoController struct { controllers.BaseAuthController } func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) { resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp) adminId := sysUser.AdminId //判断是否存在缓存,如果存在缓存,那么直接从缓存中获取 key := data.GetChartInfoDataKey(chartInfo.ChartInfoId) if utils.Re == nil && isCache { if utils.Re == nil && utils.Rc.IsExist(key) { if data, err1 := utils.Rc.RedisBytes(key); err1 == nil { err := json.Unmarshal(data, &resp) if err == nil && resp != nil { // 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的 var myCond string var myPars []interface{} myCond += ` AND a.admin_id=? ` myPars = append(myPars, adminId) myCond += ` AND a.chart_info_id=? ` myPars = append(myPars, chartInfo.ChartInfoId) myList, err := data_manage.GetMyChartByCondition(myCond, myPars) if err != nil && err.Error() != utils.ErrNoRow() { msg = "获取失败" errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error() return } resp.ChartInfo.IsAdd = false resp.ChartInfo.MyChartId = 0 resp.ChartInfo.MyChartClassifyId = "" if myList != nil && len(myList) > 0 { resp.ChartInfo.IsAdd = true resp.ChartInfo.MyChartId = myList[0].MyChartId resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId } isOk = true fmt.Println("source redis") return } } } } chartInfoId := chartInfo.ChartInfoId dateType := chartInfo.DateType if dateType <= 0 { dateType = 3 } startDate := chartInfo.StartDate endDate := chartInfo.EndDate seasonStartDate := chartInfo.SeasonStartDate seasonEndDate := chartInfo.SeasonEndDate calendar := chartInfo.Calendar chartType := chartInfo.ChartType if calendar == "" { calendar = "公历" } fmt.Println("a dateType:", dateType) switch dateType { case 1: startDate = "2000-01-01" endDate = "" case 2: startDate = "2010-01-01" endDate = "" case 3: startDate = "2015-01-01" endDate = "" case 4: //startDate = strconv.Itoa(time.Now().Year()) + "-01-01" startDate = "2021-01-01" endDate = "" case 5: startDate = startDate + "-01" endDate = endDate + "-01" case 6: //startDate = startDate + "-01" endDate = "" case 7: startDate = "2018-01-01" endDate = "" case 8: startDate = "2019-01-01" endDate = "" case 9: startDate = "2020-01-01" endDate = "" endDate = "" case 11: startDate = "2022-01-01" endDate = "" } // 兼容日期错误 { if strings.Count(startDate, "-") == 1 { startDate = startDate + "-01" } if strings.Count(endDate, "-") == 1 { endDate = endDate + "-01" } } if chartType == 2 { if seasonStartDate != "" { startDate = seasonStartDate + "-01" } else { fivePre := time.Now().AddDate(-4, 0, 0).Year() startDate = strconv.Itoa(fivePre) + "-01-01" } if seasonEndDate != "" { seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local) if tmpErr != nil { msg = "获取失败" errMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error() return } endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate) } else { //endDate = time.Now().Format(utils.FormatDate) } } mappingList, err := data_manage.GetChartEdbMappingList(chartInfoId) if err != nil { msg = "获取失败" errMsg = "获取图表,指标信息失败,Err:" + err.Error() return } extraConfigStr := chartInfo.ExtraConfig //图表额外数据参数 var barConfig data_manage.BarChartInfoReq // 柱方图的一些配置 if chartInfo != nil && chartInfo.ChartType == 7 { if chartInfo.BarConfig == `` { msg = "柱方图未配置" errMsg = "柱方图未配置" return } err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig) if err != nil { msg = "柱方图配置异常" errMsg = "柱方图配置异常" return } extraConfigStr = chartInfo.BarConfig } // 获取图表中的指标数据 edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr) if err != nil { msg = "获取失败" if errMsg != `` { msg = errMsg } errMsg = "获取图表,指标信息失败,Err:" + err.Error() return } warnEdbList := make([]string, 0) for _, v := range edbList { if v.IsNullData { warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")") } } if len(warnEdbList) > 0 { chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",") } /* ChartClassify []*ChartClassifyView */ chartClassify, _ := data_manage.GetChartClassifyViewById(chartInfo.ChartClassifyId) if chartClassify != nil { chartClassifyParent, _ := data_manage.GetChartClassifyViewById(chartClassify.ParentId) chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassifyParent) } chartInfo.ChartClassify = append(chartInfo.ChartClassify, chartClassify) resp.EdbInfoList = edbList //判断是否需要展示英文标识 chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType) //判断是否加入我的图库 { var myChartCondition string var myChartPars []interface{} myChartCondition += ` AND a.admin_id=? ` myChartPars = append(myChartPars, adminId) myChartCondition += ` AND a.chart_info_id=? ` myChartPars = append(myChartPars, chartInfo.ChartInfoId) myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars) if err != nil && err.Error() != utils.ErrNoRow() { msg = "获取失败" errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error() return } if myChartList != nil && len(myChartList) > 0 { chartInfo.IsAdd = true chartInfo.MyChartId = myChartList[0].MyChartId chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId } } //图表操作权限 chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId) resp.ChartInfo = chartInfo resp.XEdbIdValue = xEdbIdValue resp.YDataList = yDataList resp.Status = true resp.BarChartInfo = barConfig resp.DataResp = dataResp // 将数据加入缓存 if utils.Re == nil { data, _ := json.Marshal(resp) utils.Rc.Put(key, data, 2*time.Hour) } isOk = true return } // @Title 编辑图表英文信息接口 // @Description 编辑图表英文信息接口 // @Param request body data_manage.EditChartEnInfoReq true "type json string" // @Success Ret=200 编辑成功 // @router /chart_info/en/edit [post] func (this *ChartInfoController) ChartEnInfoEdit() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } var req data_manage.EditChartEnInfoReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } req.ChartNameEn = strings.Trim(req.ChartNameEn, " ") if req.ChartInfoId <= 0 { br.Msg = "请选择图表" return } //判断指标名称是否存在 chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "图表已被删除,请刷新页面" br.ErrMsg = "图表已被删除,请刷新页面" return } br.Msg = "获取图表信息失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } // 判断是否有传入对应的指标配置 noEdbInfoType := []int{10} if len(req.ChartEdbInfoList) <= 0 && !utils.InArrayByInt(noEdbInfoType, chartItem.ChartType) { br.Msg = "请选择指标!" return } var edbCondition string var edbPars []interface{} for _, v := range req.ChartEdbInfoList { edbInfoId := v.EdbInfoId edbInfo, err := data_manage.GetEdbInfoById(edbInfoId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "图表不存在!" br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId) return } else { br.Msg = "获取图表信息失败!" br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error() return } } if edbInfo == nil { br.Msg = "指标不存在!" br.ErrMsg = "指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId) return } //判断指标名称是否重复 if v.EdbNameEn != "" { edbCondition = "" edbPars = make([]interface{}, 0) edbCondition += " AND edb_info_id<>? " edbPars = append(edbPars, edbInfo.EdbInfoId) /*edbCondition += " AND source=? " edbPars = append(edbPars, edbInfo.Source)*/ edbCondition += " AND edb_name_en=? " edbPars = append(edbPars, v.EdbNameEn) edbExist, err := data_manage.GetEdbInfoByCondition(edbCondition, edbPars) if err != nil { if err.Error() != utils.ErrNoRow() { br.Msg = "判断英文指标名称是否存在失败" br.ErrMsg = "判断英文指标名称是否存在失败,Err:" + err.Error() return } } if err == nil && edbExist.EdbInfoId > 0 { br.Msg = edbExist.EdbName + ":" + v.EdbNameEn + "指标名称已存在" br.ErrMsg = "英文指标名称已存在,请重新填写" br.IsSendEmail = false return } } } if req.ChartNameEn != "" || req.ExtraConfig != `` { var condition string var pars []interface{} condition += " AND chart_info_id<>? " pars = append(pars, req.ChartInfoId) /*condition += " AND chart_classify_id=? " pars = append(pars, chartItem.ChartClassifyId)*/ condition += " AND chart_name_en=? " pars = append(pars, req.ChartNameEn) existItem, err := data_manage.GetChartInfoByCondition(condition, pars) if err != nil { if err.Error() != utils.ErrNoRow() { br.Msg = "判断英文图表名称是否存在失败" br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error() return } } if err == nil && existItem.ChartInfoId > 0 { br.Msg = existItem.ChartName + ":" + req.ChartNameEn + "图表名称已存在" return } } err = data_manage.EditChartEnInfoAndEdbEnInfo(&req) if err != nil { br.Msg = "保存失败" br.ErrMsg = "保存失败,Err:" + err.Error() return } //添加es数据 go data.EsAddOrEditChartInfo(chartItem.ChartInfoId) //修改my eta es数据 go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId) //edbinfo 修改es信息 for _, v := range req.ChartEdbInfoList { edbInfoId := v.EdbInfoId edbInfo, err := data_manage.GetEdbInfoById(edbInfoId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "图表不存在!" br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId) return } else { br.Msg = "获取图表信息失败!" br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error() return } } if edbInfo != nil { go data.AddOrEditEdbInfoToEs(edbInfoId) } } //新增操作日志 { chartLog := new(data_manage.ChartInfoLog) chartLog.ChartName = chartItem.ChartName chartLog.ChartInfoId = req.ChartInfoId chartLog.ChartClassifyId = chartItem.ChartClassifyId chartLog.SysUserId = sysUser.AdminId chartLog.SysUserRealName = sysUser.RealName chartLog.UniqueCode = chartItem.UniqueCode chartLog.CreateTime = time.Now() chartLog.Content = string(this.Ctx.Input.RequestBody) chartLog.Status = "编辑图表英文信息" chartLog.Method = this.Ctx.Input.URL() go data_manage.AddChartInfoLog(chartLog) } //清除缓存 if utils.Re == nil && utils.Rc != nil { utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存 utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId)) } br.Ret = 200 br.Success = true br.Msg = "编辑成功" br.IsAddLog = true } // ChartInfoMove // @Title 移动图表接口 // @Description 移动图表接口 // @Success 200 {object} data_manage.MoveChartInfoReq // @router /chart_info/move [post] func (this *ChartInfoController) ChartInfoMove() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } var req data_manage.MoveChartInfoReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ChartInfoId <= 0 { br.Msg = "参数错误" br.ErrMsg = "图表id小于等于0" return } if req.ChartClassifyId <= 0 { br.Msg = "请选择分类" return } //判断分类是否存在 count, _ := data_manage.GetChartClassifyCountById(req.ChartClassifyId) if count <= 0 { br.Msg = "分类已被删除,不可移动,请刷新页面" return } chartInfo, err := data_manage.GetChartInfoById(req.ChartInfoId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } if chartInfo.Source != utils.CHART_SOURCE_DEFAULT { br.Msg = "图表异常" br.ErrMsg = "分类异常,不是ETA图库的图表" return } //如果改变了分类,那么移动该图表数据 if chartInfo.ChartClassifyId != req.ChartClassifyId { //查询需要修改的分类下是否存在同一个图表名称 tmpChartInfo, tmpErr := data_manage.GetChartInfoByClassifyIdAndName(req.ChartClassifyId, chartInfo.ChartName) if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() { br.Msg = "移动失败" br.ErrMsg = "移动失败,Err:" + tmpErr.Error() return } if tmpChartInfo != nil { br.Msg = "移动失败,同一个分类下图表名称不允许重复" br.ErrMsg = "移动失败,同一个分类下图表名称不允许重复" return } err = data_manage.MoveChartInfo(req.ChartInfoId, req.ChartClassifyId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "移动失败,Err:" + err.Error() return } } //移动排序 updateCol := make([]string, 0) //如果有传入 上一个兄弟节点分类id if req.PrevChartInfoId > 0 { prevChartInfo, err := data_manage.GetChartInfoById(req.PrevChartInfoId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error() return } //如果是移动在两个兄弟节点之间 if req.NextChartInfoId > 0 { //下一个兄弟节点 nextChartInfo, err := data_manage.GetChartInfoById(req.NextChartInfoId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error() return } //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1 if prevChartInfo.Sort == nextChartInfo.Sort || prevChartInfo.Sort == chartInfo.Sort { //变更兄弟节点的排序 updateSortStr := `sort + 2` _ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, []int{chartInfo.Source}, updateSortStr) } else { //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了 if nextChartInfo.Sort-prevChartInfo.Sort == 1 { //变更兄弟节点的排序 updateSortStr := `sort + 1` _ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, []int{chartInfo.Source}, updateSortStr) } } } chartInfo.Sort = prevChartInfo.Sort + 1 chartInfo.ModifyTime = time.Now() updateCol = append(updateCol, "Sort", "ModifyTime") } else { firstClassify, err := data_manage.GetFirstChartInfoByClassifyId(req.ChartClassifyId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "移动失败" br.ErrMsg = "获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + err.Error() return } //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序 if firstClassify != nil && firstClassify.Sort == 0 { updateSortStr := ` sort + 1 ` _ = data_manage.UpdateChartInfoSortByClassifyId(firstClassify.ChartClassifyId, 0, firstClassify.ChartInfoId-1, []int{chartInfo.Source}, updateSortStr) } chartInfo.Sort = 0 //那就是排在第一位 chartInfo.ModifyTime = time.Now() updateCol = append(updateCol, "Sort", "ModifyTime") } //更新 if len(updateCol) > 0 { err = chartInfo.Update(updateCol) if err != nil { br.Msg = "移动失败" br.ErrMsg = "修改失败,Err:" + err.Error() return } } if err != nil { br.Msg = "移动失败" br.ErrMsg = "修改失败,Err:" + err.Error() return } //添加es数据 go data.EsAddOrEditChartInfo(req.ChartInfoId) //修改my eta es数据 go data.EsAddOrEditMyChartInfoByChartInfoId(req.ChartInfoId) //新增操作日志 { chartLog := new(data_manage.ChartInfoLog) chartLog.ChartName = chartInfo.ChartName chartLog.ChartInfoId = req.ChartInfoId chartLog.ChartClassifyId = chartInfo.ChartClassifyId chartLog.SysUserId = sysUser.AdminId chartLog.SysUserRealName = sysUser.RealName chartLog.UniqueCode = chartInfo.UniqueCode chartLog.CreateTime = time.Now() chartLog.Content = string(this.Ctx.Input.RequestBody) chartLog.Status = "移动图表" chartLog.Method = this.Ctx.Input.URL() go data_manage.AddChartInfoLog(chartLog) } br.Ret = 200 br.Success = true br.Msg = "移动成功" } // ChartInfoDetail // @Title 获取图表详情 // @Description 获取图表详情接口 // @Param ChartInfoId query int true "图表id" // @Param DateType query int true "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间" // @Param StartDate query string true "自定义开始日期" // @Param EndDate query string true "自定义结束日期" // @Param Calendar query string true "公历/农历" // @Param SeasonStartDate query string true "季节性图开始日期" // @Param SeasonEndDate query string true "季节性图结束日期" // @Param EdbInfoId query string true "指标ID,多个用英文逗号隔开" // @Param ChartType query int true "生成样式:1:曲线图,2:季节性图" // @Success 200 {object} data_manage.ChartInfoDetailResp // @router /chart_info/detail [get] func (this *ChartInfoController) ChartInfoDetail() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } chartInfoId, _ := this.GetInt("ChartInfoId") dateType, _ := this.GetInt("DateType") fmt.Println("dateType:", dateType) if dateType <= 0 { dateType = 3 } startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") seasonStartDate := this.GetString("SeasonStartDate") seasonEndDate := this.GetString("SeasonEndDate") edbInfoId := this.GetString("EdbInfoId") chartType, _ := this.GetInt("ChartType") fmt.Println("seasonStartDate:", seasonStartDate) fmt.Println("seasonEndDate:", seasonEndDate) calendar := this.GetString("Calendar") if calendar == "" { calendar = "公历" } switch dateType { case 1: startDate = "2000-01-01" case 2: startDate = "2010-01-01" case 3: startDate = "2015-01-01" case 4: //startDate = strconv.Itoa(time.Now().Year()) + "-01-01" startDate = "2021-01-01" case 5: startDate = startDate + "-01" endDate = endDate + "-01" case 6: startDate = startDate + "-01" case 7: startDate = "2018-01-01" case 8: startDate = "2019-01-01" case 9: startDate = "2020-01-01" case 11: startDate = "2022-01-01" } var err error chartInfo := new(data_manage.ChartInfoView) if chartInfoId > 0 { chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "图被删除,请刷新页面" br.ErrMsg = "图被删除,请刷新页面,Err:" + err.Error() return } br.Msg = "获取失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } chartType = chartInfo.ChartType } if chartType == 2 { if seasonStartDate != "" { startDate = seasonStartDate + "-01" } else { fivePre := time.Now().AddDate(-4, 0, 0).Year() startDate = strconv.Itoa(fivePre) + "-01-01" } if seasonEndDate != "" { seasonEndDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, seasonEndDate+"-01", time.Local) if tmpErr != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表,指标信息失败,Err:" + tmpErr.Error() return } endDate = seasonEndDateTime.AddDate(0, 1, -1).Format(utils.FormatDate) } else { endDate = "" //time.Now().AddDate(2, 0, 0).Format(utils.FormatDate) } } mappingList := make([]*data_manage.ChartEdbInfoMapping, 0) if chartInfoId > 0 { mappingList, err = data_manage.GetChartEdbMappingList(chartInfoId) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error() return } } else { if edbInfoId != "" { mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoId(edbInfoId) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error() return } } } // 图表额外数据参数 extraConfigStr := chartInfo.ExtraConfig // 柱方图的一些配置 var barConfig data_manage.BarChartInfoReq if chartInfo != nil && chartInfo.ChartType == 7 { if chartInfo.BarConfig == `` { br.Msg = "柱方图未配置" br.ErrMsg = "柱方图未配置" return } err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig) if err != nil { br.Msg = "柱方图配置异常" br.ErrMsg = "柱方图配置异常" return } extraConfigStr = chartInfo.BarConfig } // 获取图表中的指标数据 edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr) if err != nil { br.Msg = "获取失败" if errMsg != `` { br.Msg = errMsg } br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error() return } warnEdbList := make([]string, 0) for _, v := range edbList { if v.IsNullData { warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")") } } if len(warnEdbList) > 0 { chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",") } if chartInfoId > 0 && chartInfo != nil { //判断是否加入我的图库 { var myChartCondition string var myChartPars []interface{} myChartCondition += ` AND a.admin_id=? ` myChartPars = append(myChartPars, sysUser.AdminId) myChartCondition += ` AND a.chart_info_id=? ` myChartPars = append(myChartPars, chartInfo.ChartInfoId) myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error() return } if myChartList != nil && len(myChartList) > 0 { chartInfo.IsAdd = true chartInfo.MyChartId = myChartList[0].MyChartId chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId } } } //图表操作权限 chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId) //判断是否需要展示英文标识 chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType) resp := new(data_manage.ChartInfoDetailResp) resp.ChartInfo = chartInfo resp.EdbInfoList = edbList resp.XEdbIdValue = xEdbIdValue resp.YDataList = yDataList resp.BarChartInfo = barConfig resp.DataResp = dataResp br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // ChartInfoEdbInfoDetail // @Title 图表-获取指标详情 // @Description 图表-获取指标详情接口 // @Param EdbInfoId query int true "指标ID" // @Param DateType query int true "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:自定义起始时间至今,7:18年至今,8:19年至今,9:20年至今" // @Param StartDate query string true "自定义开始日期" // @Param EndDate query string true "自定义结束日期" // @Param EdbInfoType query int true "1:标准指标,0:领先指标,默认为标准指标" // @Param LeadValue query int true "领先值" // @Param LeadUnit query string true "领先单位:天,月,季,周" // @Success 200 {object} data_manage.ChartEdbInfoDetailResp // @router /chart_info/edb_info/detail [get] func (this *ChartInfoController) ChartInfoEdbInfoDetail() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } edbInfoId, _ := this.GetInt("EdbInfoId") if edbInfoId <= 0 { br.Msg = "参数错误" return } dateType, _ := this.GetInt("DateType") if dateType <= 0 { dateType = 3 } edbInfoType, _ := this.GetInt("EdbInfoType") if edbInfoType < 0 { edbInfoType = 1 } leadValue, _ := this.GetInt("LeadValue") if leadValue < 0 { leadValue = 0 } leadUnit := this.GetString("LeadUnit") startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") isTimeBetween := false //是否是时间区间 switch dateType { case 1: startDate = "2000-01-01" endDate = "" case 2: startDate = "2010-01-01" endDate = "" case 3: startDate = "2015-01-01" endDate = "" case 4: //startDate = strconv.Itoa(time.Now().Year()) + "-01-01" startDate = "2021-01-01" endDate = "" case 5: startDate = startDate + "-01" endDate = endDate + "-01" isTimeBetween = true case 6: //startDate = startDate + "-01" endDate = "" case 7: startDate = "2018-01-01" endDate = "" case 8: startDate = "2019-01-01" endDate = "" case 9: startDate = "2020-01-01" endDate = "" case 11: startDate = "2022-01-01" endDate = "" default: startDate = startDate + "-01" endDate = endDate + "-01" } // 兼容日期错误 { if strings.Count(startDate, "-") == 1 { startDate = startDate + "-01" } if strings.Count(endDate, "-") == 1 { endDate = endDate + "-01" } } if startDate == "" { br.Msg = "参数错误" br.Msg = "参数错误,无效的查询日期" return } var startDateReal string var diffSeconds int64 if leadValue > 0 && leadUnit != "" { var startTimeRealTemp time.Time startDateParse, err := time.Parse(utils.FormatDate, startDate) if err != nil { br.Msg = "获取数据失败" br.ErrMsg = "获取数据失败,日期格式错误:startDate:" + startDate return } switch leadUnit { case "天": startTimeRealTemp = startDateParse.AddDate(0, 0, -leadValue) case "月": startTimeRealTemp = startDateParse.AddDate(0, -leadValue, 0) case "季": startTimeRealTemp = startDateParse.AddDate(0, -3*leadValue, 0) case "周": startTimeRealTemp = startDateParse.AddDate(0, 0, -7*leadValue) case "年": startTimeRealTemp = startDateParse.AddDate(-leadValue, 0, 0) } if startTimeRealTemp.Before(startDateParse) { startDateReal = startTimeRealTemp.Format(utils.FormatDate) diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6 } else { startDateReal = startDate diffSeconds = 0 } } else { startDateReal = startDate } edbInfo, err := data_manage.GetEdbInfoById(edbInfoId) if err != nil { br.Msg = "获取失败" br.Msg = "获取失败,Err:" + err.Error() return } var dataList []*data_manage.EdbDataList var minData, maxData float64 switch edbInfo.EdbInfoType { case 0: //普通源指标 dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDateReal, endDate) if err != nil { br.Msg = "获取失败" br.Msg = "获取失败,Err:" + err.Error() return } //查询区间内最大最小值 minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfoId, startDateReal, endDate) if err != nil { br.Msg = "获取失败" br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error() return } case 1: //预测指标 tmpDataList, sourceEdbInfoItem, _, err, _ := data.GetPredictDataListByPredictEdbInfo(edbInfo, startDateReal, endDate, isTimeBetween) if err != nil { br.Msg = "获取失败" br.Msg = "获取失败,Err:" + err.Error() return } dataList = tmpDataList // 有预测数据,且为普通的预测指标 if len(dataList) > 0 && edbInfo.EdbInfoType == 0 { //查询区间内最大最小值 minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate) if err != nil { br.Msg = "获取失败" br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error() return } tmpValue := dataList[len(dataList)-1] // 如果最大值 小于 预测值,那么将预测值作为最大值数据返回 if edbInfo.MaxValue < tmpValue.Value { maxData = tmpValue.Value } // 如果最小值 大于 预测值,那么将预测值作为最小值数据返回 if edbInfo.MinValue > tmpValue.Value { minData = tmpValue.Value } } } if diffSeconds != 0 { dataListLen := len(dataList) for i := 0; i < dataListLen; i++ { dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds } day, err := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal) if err != nil { br.Msg = "获取失败" br.Msg = "获取领先滞后的的日期间隔失败,Err:" + err.Error() return } latestDateTime, err := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local) if err != nil { br.Msg = "获取失败" br.Msg = "指标日期转换失败,Err:" + err.Error() return } edbInfo.LatestDate = latestDateTime.AddDate(0, 0, day).Format(utils.FormatDate) } mapping := new(data_manage.ChartEdbInfoMapping) mapping.EdbInfoId = edbInfo.EdbInfoId mapping.EdbInfoCategoryType = edbInfo.EdbInfoType mapping.SourceName = edbInfo.SourceName mapping.Source = edbInfo.Source mapping.EdbCode = edbInfo.EdbCode mapping.EdbName = edbInfo.EdbName mapping.EdbType = edbInfo.EdbType mapping.Frequency = edbInfo.Frequency mapping.Unit = edbInfo.Unit mapping.StartDate = edbInfo.StartDate mapping.EndDate = edbInfo.EndDate mapping.ChartEdbMappingId = 0 mapping.ChartInfoId = 0 mapping.MaxData = maxData mapping.MinData = minData mapping.IsOrder = false mapping.IsAxis = 1 mapping.EdbInfoType = 1 mapping.LeadValue = 0 mapping.LeadUnit = "" mapping.LeadUnitEn = "" mapping.ChartStyle = "" mapping.ChartColor = "" mapping.PredictChartColor = "" mapping.ChartWidth = 0 mapping.LatestDate = edbInfo.LatestDate mapping.DataList = dataList resp := new(data_manage.ChartEdbInfoDetailResp) resp.EdbInfo = mapping br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // CopyChartInfo // @Title 复制并新增图表接口 // @Description 新增图表接口 // @Param request body data_manage.CopyAddChartInfoReq true "type json string" // @Success 200 {object} data_manage.AddChartInfoResp // @router /chart_info/copy [post] func (this *ChartInfoController) CopyChartInfo() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } deleteCache := true cacheKey := "CACHE_CHART_INFO_ADD_" + strconv.Itoa(sysUser.AdminId) defer func() { if deleteCache { utils.Rc.Delete(cacheKey) } }() if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) { deleteCache = false br.Msg = "系统处理中,请稍后重试!" br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody) return } var req data_manage.CopyAddChartInfoReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } // 获取原图表信息 oldChartInfo, err := data_manage.GetChartInfoById(req.ChartInfoId) if err != nil { br.Msg = "获取原图表信息失败" br.ErrMsg = "获取原图表信息失败,Err:" + err.Error() return } //校验图表名称是否重复 req.ChartName = strings.Trim(req.ChartName, " ") if req.ChartName == "" { br.Msg = "请填写图表名称!" return } if req.ChartClassifyId <= 0 { br.Msg = "分类参数错误!" return } chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "分类不存在" br.ErrMsg = "分类不存在" return } br.Msg = "获取分类信息失败" br.ErrMsg = "获取分类信息失败,Err:" + err.Error() return } if chartClassify == nil { br.Msg = "分类不存在" br.ErrMsg = "分类不存在" return } //count, err := data_manage.ChartInfoExist("", edbInfoIdStr) //if err != nil && err.Error() != utils.ErrNoRow() { // br.Msg = "保存失败" // br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error() // return //} //if count > 0 { // br.Msg = "所选指标已存在相同指标" // return //} //判断图表是否存在 var condition string var pars []interface{} condition += " AND chart_classify_id=? " pars = append(pars, req.ChartClassifyId) condition += " AND chart_name=? AND source = ? " pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT) count, err := data_manage.GetChartInfoCountByCondition(condition, pars) if err != nil { br.Msg = "判断图表名称是否存在失败" br.ErrMsg = "判断图表名称是否存在失败,Err:" + err.Error() return } if count > 0 { br.Msg = "图表已存在,请重新填写" br.IsSendEmail = false return } //获取原图表关联的指标信息列表 edbMappingList, err := data_manage.GetChartEdbMappingList(req.ChartInfoId) if err != nil { br.Msg = "获取图表关联的指标信息失败!" return } //添加图表 timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) chartInfo := &data_manage.ChartInfo{ ChartInfoId: 0, ChartName: req.ChartName, ChartClassifyId: req.ChartClassifyId, SysUserId: sysUser.AdminId, SysUserRealName: sysUser.RealName, UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp), CreateTime: time.Now(), ModifyTime: time.Now(), DateType: oldChartInfo.DateType, StartDate: oldChartInfo.StartDate, EndDate: oldChartInfo.EndDate, IsSetName: oldChartInfo.IsSetName, EdbInfoIds: oldChartInfo.EdbInfoIds, ChartType: oldChartInfo.ChartType, Calendar: oldChartInfo.Calendar, SeasonStartDate: oldChartInfo.SeasonStartDate, SeasonEndDate: oldChartInfo.SeasonEndDate, ChartImage: oldChartInfo.ChartImage, BarConfig: oldChartInfo.BarConfig, //Sort: sort, LeftMin: oldChartInfo.LeftMin, LeftMax: oldChartInfo.LeftMax, RightMin: oldChartInfo.RightMin, RightMax: oldChartInfo.RightMax, Disabled: oldChartInfo.Disabled, Source: oldChartInfo.Source, ExtraConfig: oldChartInfo.ExtraConfig, } newId, err := data_manage.AddChartInfo(chartInfo) if err != nil { br.Msg = "保存失败" br.ErrMsg = "保存失败,Err:" + err.Error() return } chartInfo.ChartInfoId = int(newId) // 添加图表与指标的关联关系 { mapList := make([]*data_manage.ChartEdbMapping, 0) for _, v := range edbMappingList { timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) mapItem := &data_manage.ChartEdbMapping{ //ChartEdbMappingId: 0, ChartInfoId: chartInfo.ChartInfoId, EdbInfoId: v.EdbInfoId, CreateTime: time.Now(), ModifyTime: time.Now(), UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp), MaxData: v.MaxData, MinData: v.MinData, IsOrder: v.IsOrder, IsAxis: v.IsAxis, EdbInfoType: v.EdbInfoType, LeadValue: v.LeadValue, LeadUnit: v.LeadUnit, ChartStyle: v.ChartStyle, ChartColor: v.ChartColor, ChartWidth: v.ChartWidth, Source: v.Source, } mapList = append(mapList, mapItem) } err = data_manage.AddChartEdbMapping(mapList) if err != nil { br.Msg = "保存失败" br.ErrMsg = "保存失败,Err:" + err.Error() return } } //添加es数据 go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId) //修改my eta es数据 go data.EsAddOrEditMyChartInfoByChartInfoId(chartInfo.ChartInfoId) //新增操作日志 { chartLog := new(data_manage.ChartInfoLog) chartLog.ChartInfoId = chartInfo.ChartInfoId chartLog.ChartName = req.ChartName chartLog.ChartClassifyId = req.ChartClassifyId chartLog.SysUserId = sysUser.AdminId chartLog.SysUserRealName = sysUser.RealName chartLog.UniqueCode = chartInfo.UniqueCode chartLog.CreateTime = time.Now() chartLog.Content = string(this.Ctx.Input.RequestBody) chartLog.Status = "新增图表" chartLog.Method = this.Ctx.Input.URI() go data_manage.AddChartInfoLog(chartLog) } br.Ret = 200 br.Success = true br.Msg = "保存成功" br.Data = data_manage.AddChartInfoResp{ ChartInfoId: chartInfo.ChartInfoId, UniqueCode: chartInfo.UniqueCode, ChartType: chartInfo.ChartType, } br.IsAddLog = true } // ChartInfoSearchByEs // @Title 图表模糊搜索(从es获取) // @Description 图表模糊搜索(从es获取) // @Param Keyword query string true "图表名称" // @Param IsShowMe query bool true "是否只看我的,true、false" // @Success 200 {object} data_manage.ChartInfo // @router /chart_info/search_by_es [get] func (this *ChartInfoController) ChartInfoSearchByEs() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } pageSize, _ := this.GetInt("PageSize") currentIndex, _ := this.GetInt("CurrentIndex") var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = paging.StartIndex(currentIndex, pageSize) keyword := this.GetString("Keyword") //只看我的 isShowMe, _ := this.GetBool("IsShowMe") showSysId := 0 if isShowMe { showSysId = sysUser.AdminId } var searchList []*data_manage.ChartInfo var total int64 var err error // 获取当前账号的不可见指标 noPermissionChartIdList := make([]int, 0) { obj := data_manage.EdbInfoNoPermissionAdmin{} confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error() return } for _, v := range confList { noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId) } } if keyword != "" { searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList, startSize, pageSize) } else { total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, []int{utils.CHART_SOURCE_DEFAULT}, noPermissionChartIdList) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } } finalList := make([]*data_manage.ChartInfoMore, 0) if len(searchList) > 0 { chartInfoIds := "" chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping) for _, v := range searchList { chartInfoIds += strconv.Itoa(v.ChartInfoId) + "," } if chartInfoIds != "" { chartInfoIds = strings.Trim(chartInfoIds, ",") //判断是否需要展示英文标识 edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error() return } for _, v := range edbList { chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v) } } for _, v := range searchList { tmp := new(data_manage.ChartInfoMore) tmp.ChartInfo = *v //判断是否需要展示英文标识 if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok { tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType) } finalList = append(finalList, tmp) } } //新增搜索词记录 { searchKeyword := new(data_manage.SearchKeyword) searchKeyword.KeyWord = keyword searchKeyword.CreateTime = time.Now() go data_manage.AddSearchKeyword(searchKeyword) } page := paging.GetPaging(currentIndex, pageSize, int(total)) resp := data_manage.ChartInfoListByEsResp{ Paging: page, List: finalList, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 图表刷新接口 // @Description 图表刷新接口 // @Param ChartInfoId query int true "图表id" // @Param UniqueCode query string true "唯一code" // @Success Ret=200 刷新成功 // @router /chart_info/refresh [get] func (this *ChartInfoController) ChartInfoRefresh() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } chartInfoId, _ := this.GetInt("ChartInfoId") uniqueCode := this.GetString("UniqueCode") if chartInfoId <= 0 && uniqueCode == `` { br.Msg = "参数错误" br.ErrMsg = "参数错误:chartInfoId:" + strconv.Itoa(chartInfoId) + ",UniqueCode:" + uniqueCode return } var chartInfo *data_manage.ChartInfo var err error if chartInfoId > 0 { chartInfo, err = data_manage.GetChartInfoById(chartInfoId) } else { chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode) } if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "图表已被删除,无需刷新" br.ErrMsg = "获取指标信息失败,Err:" + err.Error() return } br.Msg = "刷新失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId) if err != nil { br.Msg = "刷新失败" br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error() return } /* //err = data.ChartInfoRefresh(chartInfo.ChartInfoId) //if err != nil { // br.Msg = "刷新失败" // br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error() // return //} */ //清除图表缓存 { key := utils.HZ_CHART_LIB_DETAIL + chartInfo.UniqueCode _ = utils.Rc.Delete(key) } br.Ret = 200 br.Success = true br.Msg = "刷新成功" } // BatchChartInfoRefresh // @Title 批量刷新图表接口 // @Description 批量刷新图表接口 // @Param request body data_manage.BatchChartRefreshReq true "type json string" // @Success Ret=200 刷新成功 // @router /chart_info/batch_refresh [post] func (this *ChartInfoController) BatchChartInfoRefresh() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } var req data_manage.BatchChartRefreshReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } //获取所有的图表列表 _, chartInfoList, err := data_manage.GetChartInfoListByUniqueCodeSlice(req.ChartInfoCode) if len(chartInfoList) <= 0 { br.Ret = 200 br.Success = true br.Msg = "刷新成功" return } err = data.BatchChartInfoRefreshV2(chartInfoList) if err != nil { br.Msg = "刷新失败" br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error() return } //清除图表缓存 for _, v := range chartInfoList { key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode _ = utils.Rc.Delete(key) } br.Ret = 200 br.Success = true br.Msg = "刷新成功" }