package controllers import ( "encoding/json" "eta/eta_forum_hub/models" "eta/eta_forum_hub/services" "eta/eta_forum_hub/utils" "fmt" "github.com/rdlucklib/rdluck_tools/paging" "strings" "time" ) type ChartInfoController struct { BaseAuthController } // Update // @Title 图表-更新 // @Description 图表-更新 // @Param request body data_manage.AddChartReq true "type json string" // @Success 200 {object} data_manage.AddChartInfoResp // @router /update [post] func (this *ChartInfoController) Update() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() /*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 models.AddChartReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ChartInfo == nil { br.Msg = "请选择图表" return } if req.ChartInfo.ChartInfoId <= 0 { br.Msg = "请选择图表" return } //校验图表名称是否重复 req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ") if req.ChartInfo.ChartName == "" { br.Msg = "请填写图表名称!" return } if len(req.EdbInfoList) <= 0 { br.Msg = "指标信息不能为空" return } for _, edbInfo := range req.EdbInfoList { if edbInfo.EdbName == "" { br.Msg = "指标名称不能为空" return } } if len(req.ChartEdbMapping) <= 0 { br.Msg = "图表指标映射不能为空" return } chartInfo, err, errMsg, _ := services.UpdateChartInfoAndEdbInfo(&req, 0, "") if err != nil { br.Msg = errMsg br.ErrMsg = err.Error() return } br.Ret = 200 br.Success = true br.Msg = "保存成功" br.Data = models.AddChartInfoResp{ ChartInfoId: chartInfo.ChartInfoId, UniqueCode: chartInfo.UniqueCode, ChartType: chartInfo.ChartType, } return } // Save // @Title 图表-保存 // @Description 图表-保存 // @Param request body data_manage.AddChartReq true "type json string" // @Success 200 {object} data_manage.AddChartInfoResp // @router /save [post] func (this *ChartInfoController) Save() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.AddChartReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ChartInfo == nil { br.Msg = "请选择图表" return } //校验图表名称是否重复 req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ") if req.ChartInfo.ChartName == "" { br.Msg = "请填写图表名称!" return } if len(req.EdbInfoList) <= 0 { br.Msg = "指标信息不能为空" return } for _, edbInfo := range req.EdbInfoList { if edbInfo.EdbName == "" { br.Msg = "指标名称不能为空" return } } if len(req.ChartEdbMapping) <= 0 { br.Msg = "图表指标映射不能为空" return } deleteCache := true cacheKey := "eta_forum_hub:CACHE_CHART_INFO_ADD:" + req.ChartInfo.ChartName defer func() { if deleteCache { utils.Rc.Delete(cacheKey) } }() if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) { deleteCache = false br.Msg = "系统处理中,请稍后重试!" br.ErrMsg = "系统处理中,请稍后重试!;data:" + string(this.Ctx.Input.RequestBody) return } chartInfo, err, errMsg, _ := services.AddChartInfo(&req, 0, "") if err != nil { br.Msg = errMsg br.ErrMsg = err.Error() return } br.Ret = 200 br.Success = true br.Msg = "保存成功" br.Data = models.AddChartInfoResp{ ChartInfoId: chartInfo.ChartInfoId, UniqueCode: chartInfo.UniqueCode, ChartType: chartInfo.ChartType, } return } // Delete // @Title 图表-删除 // @Description 图表-删除 // @Param request body data_manage.DeleteChartReq true "type json string" // @Success 200 {object} // @router /delete [post] func (this *ChartInfoController) Delete() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.DeleteChartReq 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 = "请选择图表" return } err, errMsg := services.DeleteChart(req.ChartInfoId) if err != nil { br.Msg = errMsg br.ErrMsg = err.Error() return } br.Ret = 200 br.Success = true br.Msg = "删除成功" } // UserChartList // @Title 根据用户权限获取图表分类 // @Description 根据用户权限获取图表分类 // @Param Keyword query string true "关键词搜索" // @Success 200 {object} models.ChartClassifyListResp // @router /user/chart_list [get] func (this *ChartInfoController) UserChartList() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() resp := new(models.ChartListResp) pageSize, _ := this.GetInt("PageSize") currentIndex, _ := this.GetInt("CurrentIndex") userMobile := this.GetString("UserMobile") businessCode := this.GetString("BusinessCode") userTelAreaCode := this.GetString("UserTelAreaCode") keyword := this.GetString("Keyword") if userMobile == "" { br.Msg = "请选择用户" return } if businessCode == "" { br.Msg = "请选择商户" return } var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = utils.StartIndex(currentIndex, pageSize) allChartInfo := make([]*models.ChartInfo, 0) page := paging.GetPaging(currentIndex, pageSize, 0) // 获取用户信息和用户权限 userInfo, err := models.GetUserByBusinessCodeAndMobile(businessCode, userMobile, userTelAreaCode) if err != nil { if err.Error() == utils.ErrNoRow() { resp.ChartInfoList = allChartInfo resp.Paging = page br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp return } br.Msg = "获取用户信息失败" br.ErrMsg = "获取用户信息失败,Err:" + err.Error() return } //获取用户有权限的分类ID permissionClassifyIds, err := services.GetPermissionClassifyIdByUserId(userInfo.UserId) if err != nil { br.Msg = "获取用户权限失败" br.ErrMsg = "获取用户权限失败,Err:" + err.Error() return } if len(permissionClassifyIds) == 0 { resp.ChartInfoList = allChartInfo resp.Paging = page br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp return } condition := "" pars := make([]interface{}, 0) var total int64 if keyword != "" { allChartInfo, total, err = services.EsSearchChartInfo(keyword, []int{}, []int{utils.CHART_SOURCE_DEFAULT}, permissionClassifyIds, startSize, pageSize) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } } else { condition += " AND chart_classify_id in (" + utils.GetOrmInReplace(len(permissionClassifyIds)) + ")" pars = append(pars, permissionClassifyIds) allChartInfo, err = models.GetChartInfoByConditionPage(utils.CHART_SOURCE_DEFAULT, condition, pars, startSize, pageSize) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取图表信息失败,Err:" + err.Error() return } total, err = models.GetChartInfoTotalByCondition(utils.CHART_SOURCE_DEFAULT, condition, pars) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取图表总数失败,Err:" + err.Error() return } } page = paging.GetPaging(currentIndex, pageSize, int(total)) resp.ChartInfoList = allChartInfo resp.Paging = page br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // CommonChartInfoDetailFromUniqueCode // @Title 根据编码获取图表详情 // @Description 根据编码获取图表详情接口 // @Param UniqueCode query int true "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc" // @Param IsCache query bool true "是否走缓存,默认false" // @Param Token query string true "东吴小程序token" // @Param Source query int true "查询来源 1:东吴" // @Success 200 {object} data_manage.ChartInfoDetailFromUniqueCodeResp // @router /common/from_unique_code [get] func (this *ChartInfoController) CommonChartInfoDetailFromUniqueCode() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() uniqueCode := this.GetString("UniqueCode") if uniqueCode == "" { br.Msg = "参数错误" br.ErrMsg = "参数错误,uniqueCode is empty" return } //是否走缓存 isCache, _ := this.GetBool("IsCache") key := utils.CACHE_CHART_INFO_DATA + uniqueCode resp := new(models.ChartInfoDetailResp) //判断是否有缓存 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 { br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp fmt.Println("source redis") return } } } } chartInfo, err := models.GetChartInfoViewByUniqueCode(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 } //var resp interface{} var isOk bool var msg, errMsg string switch chartInfo.Source { case utils.CHART_SOURCE_DEFAULT: resp, isOk, msg, errMsg = GetChartInfoDetailFromUniqueCode(chartInfo, key) default: br.Msg = "错误的图表" br.ErrMsg = "错误的图表" return } if !isOk { br.Msg = msg br.ErrMsg = errMsg return } if resp != nil && resp.ChartInfo != nil && resp.ChartInfo.ChartInfoId != 0 { resp.ChartInfo.HaveOperaAuth = true } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // GetChartInfoDetailFromUniqueCode 根据编码获取图表详情 func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfoView, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) { resp = new(models.ChartInfoDetailResp) // 获取主题样式 chartTheme, err := services.GetChartThemeConfig(chartInfo.ChartThemeId, chartInfo.Source, chartInfo.ChartType) if err != nil { msg = "获取失败" errMsg = "获取主题信息失败,Err:" + err.Error() return } chartInfo.ChartThemeStyle = chartTheme.Config chartInfo.ChartThemeId = chartTheme.ChartThemeId chartInfoId := chartInfo.ChartInfoId mappingList, err := models.GetChartEdbMappingList(chartInfoId) if err != nil { msg = "获取失败" errMsg = "获取图表,指标信息失败,Err:" + err.Error() return } dateType := chartInfo.DateType startDate := chartInfo.StartDate endDate := chartInfo.EndDate startYear := chartInfo.StartYear seasonStartDate := chartInfo.SeasonStartDate seasonEndDate := chartInfo.SeasonEndDate calendar := chartInfo.Calendar chartType := chartInfo.ChartType if calendar == "" { calendar = "公历" } if chartType == 2 { startDate = seasonStartDate endDate = seasonEndDate if dateType <= 0 { if startDate != "" { dateType = 5 } else { dateType = utils.DateTypeNYears } } } else { if dateType <= 0 { dateType = 3 } } yearMax := 0 if dateType == utils.DateTypeNYears { for _, v := range mappingList { if v.LatestDate != "" { lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate) if tErr != nil { msg = "获取失败" errMsg = "获取图表日期信息失败,Err:" + tErr.Error() return } if lastDateT.Year() > yearMax { yearMax = lastDateT.Year() } } } } startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax) if chartInfo.ChartType == 2 { chartInfo.StartDate = startDate chartInfo.EndDate = endDate chartInfo.Calendar = calendar } extraConfigStr := chartInfo.ExtraConfig // 柱方图的一些配置 var barConfig models.BarChartInfoReq if 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, tmpErrMsg := services.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig) if err != nil { msg = "获取失败" if tmpErrMsg != `` { msg = tmpErrMsg } errMsg = "获取图表,指标信息失败,Err:" + err.Error() return } // 单位 if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 { chartInfo.Unit = yDataList[0].Unit chartInfo.UnitEn = yDataList[0].UnitEn } 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, ",") } // 图表的指标来源 sourceNameList, sourceNameEnList := services.GetEdbSourceByEdbInfoIdList(edbList) chartInfo.ChartSource = strings.Join(sourceNameList, ",") chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",") resp.ChartInfo = chartInfo resp.EdbInfoList = edbList resp.XEdbIdValue = xEdbIdValue resp.YDataList = yDataList resp.DataResp = dataResp if utils.Re == nil { jsonData, _ := json.Marshal(resp) utils.Rc.Put(key, jsonData, 10*time.Minute) } isOk = true return }