package data import ( "errors" "fmt" "hongze/hongze_chart_lib/models" "hongze/hongze_chart_lib/models/data_manage" "hongze/hongze_chart_lib/services/alarm_msg" "hongze/hongze_chart_lib/utils" "sort" "time" ) // ChartInfoRefreshV1 图表刷新 func ChartInfoRefreshV1(chartInfoId int) (err error) { var errmsg string defer func() { if err != nil { go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers) fmt.Println("ChartInfoRefresh Err:" + errmsg) } }() baseEdbInfoArr, calculateInfoArr, err := data_manage.GetChartInfoRefreshData(chartInfoId) if err != nil { errmsg = "获取需要刷新的指标失败:Err:" + err.Error() return } var startDate string newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0) baseMap := make(map[int]*data_manage.EdbInfo) for _, bv := range baseEdbInfoArr { // 如果不是普通指标,那么过滤 if bv.EdbInfoType != 0 { continue } if _, ok := baseMap[bv.EdbInfoId]; !ok { newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv) } baseMap[bv.EdbInfoId] = bv } fmt.Println("calculateInfoArr:", len(calculateInfoArr)) newCalculateInfoArr := make([]*data_manage.EdbInfo, 0) calculateMap := make(map[int]*data_manage.EdbInfo) var calculateArr []int for _, bv := range calculateInfoArr { if _, ok := calculateMap[bv.EdbInfoId]; !ok { newCalculateInfoArr = append(newCalculateInfoArr, bv) calculateArr = append(calculateArr, bv.EdbInfoId) } calculateMap[bv.EdbInfoId] = bv } sort.Ints(calculateArr) for _, bv := range newBaseEdbInfoArr { source := bv.Source edbInfoId := bv.EdbInfoId edbCode := bv.EdbCode startDate = bv.StartDate frequency := bv.Frequency if bv.StartDate == "0000-00-00" { continue } sTime, err := time.Parse(utils.FormatDate, bv.EndDate) if err != nil { return err } var limitDay int startDate := "" switch frequency { case "日度": limitDay = utils.DATA_REFRESH case "周度": limitDay = utils.DATA_REFRESH * 7 case "月度": limitDay = utils.DATA_REFRESH * 30 case "季度": limitDay = utils.DATA_REFRESH * 90 case "年度": limitDay = utils.DATA_REFRESH * 365 default: limitDay = utils.DATA_REFRESH } startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate) fmt.Println("source:", source) respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate) if err != nil { errmsg = errors.New("RefreshEdbData Err:" + err.Error()).Error() return err } if respItem.Ret != 200 { errmsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error() return err } //maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode) //if err != nil { // return err //} //if maxAndMinItem != nil { // err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem) // if err != nil { // return err // } //} } //刷新相关计算指标 for _, v := range calculateArr { edbInfo := calculateMap[v] if edbInfo == nil { return err } startDate = edbInfo.StartDate source := edbInfo.Source if source == utils.DATA_SOURCE_CALCULATE { startDate = edbInfo.StartDate sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate) if err != nil { return err } startDate = sTime.Format(utils.FormatDate) } result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate) if err != nil { fmt.Println(v, "RefreshEdbCalculateData err", time.Now()) errmsg = "RefreshEdbCalculateData Err:" + err.Error() return err } if result.Ret != 200 { fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg) errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg) return fmt.Errorf("刷新失败" + errmsg) } fmt.Println("end calculateArr:", v, time.Now()) } return err } // GetFrequencyEn 获取频度的英文版 func GetFrequencyEn(frequency string) (frequencyEn string) { switch frequency { case "日度": frequencyEn = "day" return case "周度": frequencyEn = "week" return case "旬度": frequencyEn = "ten days" return case "月度": frequencyEn = "month" return case "季度": frequencyEn = "quarter" return case "年度": frequencyEn = "year" return } return } func GetLeadUnitEn(unit string) (unitEn string) { switch unit { case "天": unitEn = "day" return case "周": unitEn = "week" return case "月": unitEn = "month" return case "季": unitEn = "quarter" return case "年": unitEn = "year" return } return } // GetChartEdbData 获取图表的指标数据 func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping) (edbList []*models.ChartEdbInfoMapping, err error) { edbList = make([]*models.ChartEdbInfoMapping, 0) for _, v := range mappingList { //fmt.Println("v:", v.EdbInfoId) item := new(models.ChartEdbInfoMapping) item.EdbInfoId = v.EdbInfoId item.SourceName = v.SourceName item.Source = v.Source item.EdbCode = v.EdbCode item.EdbName = v.EdbName item.EdbNameEn = v.EdbNameEn item.Frequency = v.Frequency item.FrequencyEn = GetFrequencyEn(v.Frequency) if v.Unit != `无` { item.Unit = v.Unit } item.UnitEn = v.UnitEn item.StartDate = v.StartDate item.EndDate = v.EndDate item.ModifyTime = v.ModifyTime item.EdbInfoCategoryType = v.EdbInfoCategoryType item.PredictChartColor = v.PredictChartColor if chartInfoId <= 0 { item.IsAxis = 1 item.LeadValue = 0 item.LeadUnit = "" //item.ChartEdbMappingId = 0 item.ChartInfoId = 0 item.IsOrder = false item.EdbInfoType = 1 item.ChartStyle = "" item.ChartColor = "" item.ChartWidth = 0 item.MaxData = v.MaxValue item.MinData = v.MinValue } else { item.IsAxis = v.IsAxis item.EdbInfoType = v.EdbInfoType item.LeadValue = v.LeadValue item.LeadUnit = v.LeadUnit item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit) //item.ChartEdbMappingId = v.ChartEdbMappingId item.ChartInfoId = v.ChartInfoId item.ChartStyle = v.ChartStyle item.ChartColor = v.ChartColor item.ChartWidth = v.ChartWidth item.IsOrder = v.IsOrder item.MaxData = v.MaxData item.MinData = v.MinData } item.LatestValue = v.LatestValue item.LatestDate = v.LatestDate item.UniqueCode = v.UniqueCode var startDateReal string var diffSeconds int64 if chartType == 2 { //季节性图 startDateReal = startDate } else { if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标 var startTimeRealTemp time.Time startDateParse, _ := time.Parse(utils.FormatDate, startDate) switch v.LeadUnit { case "天": startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue) case "月": startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0) case "季": startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0) case "周": startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue) case "年": startTimeRealTemp = startDateParse.AddDate(-v.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 } } //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate) calendarPreYear := 0 if calendar == "农历" { newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal) if err != nil { fmt.Println("time.Parse:" + err.Error()) } calendarPreYear = newStartDateReal.Year() - 1 newStartDateReal = newStartDateReal.AddDate(-1, 0, 0) startDateReal = newStartDateReal.Format(utils.FormatDate) } dataList := make([]*models.EdbDataList, 0) //fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate) switch v.EdbInfoCategoryType { case 0: dataList, err = models.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate) case 1: dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, false) default: err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType)) } if err != nil { return } if diffSeconds != 0 && v.EdbInfoType == 0 { dataListLen := len(dataList) for i := 0; i < dataListLen; i++ { dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds } } if chartType == 2 { latestDateStr := v.LatestDate //实际数据的截止日期 latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate) if tmpErr != nil { err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate)) return } latestDateYear := latestDate.Year() //实际数据截止年份 if calendar == "农历" { if len(dataList) <= 0 { result := new(models.EdbDataResult) item.DataList = result } else { result, tmpErr := models.AddCalculateQuarterV5(dataList) if tmpErr != nil { err = errors.New("获取农历数据失败,Err:" + tmpErr.Error()) return } // 处理季节图的截止日期 for k, edbDataItems := range result.List { var cuttingDataTimestamp int64 // 切割的日期时间字符串 cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate) //如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳 if edbDataItems.Year >= latestDateYear { for _, tmpData := range edbDataItems.Items { if tmpData.DataTime == cuttingDataTimeStr { cuttingDataTimestamp = tmpData.DataTimestamp break } } } edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp result.List[k] = edbDataItems } if result.List[0].Year != calendarPreYear { itemList := make([]*models.EdbDataList, 0) items := new(models.EdbDataItems) //items.Year = calendarPreYear items.Items = itemList newResult := new(models.EdbDataResult) newResult.List = append(newResult.List, items) newResult.List = append(newResult.List, result.List...) item.DataList = newResult } else { item.DataList = result } } } else { currentYear := time.Now().Year() quarterDataList := make([]*models.QuarterData, 0) quarterMap := make(map[int][]*models.EdbDataList) var quarterArr []int for _, v := range dataList { itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime) if tmpErr != nil { err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime) return } year := itemDate.Year() newItemDate := itemDate.AddDate(currentYear-year, 0, 0) timestamp := newItemDate.UnixNano() / 1e6 v.DataTimestamp = timestamp if findVal, ok := quarterMap[year]; !ok { quarterArr = append(quarterArr, year) findVal = append(findVal, v) quarterMap[year] = findVal } else { findVal = append(findVal, v) quarterMap[year] = findVal } } for _, v := range quarterArr { itemList := quarterMap[v] quarterItem := new(models.QuarterData) quarterItem.Year = v quarterItem.DataList = itemList //如果等于最后的实际日期,那么将切割时间戳记录 if v == latestDateYear { var cuttingDataTimestamp int64 for _, tmpData := range itemList { if tmpData.DataTime == latestDateStr { cuttingDataTimestamp = tmpData.DataTimestamp break } } quarterItem.CuttingDataTimestamp = cuttingDataTimestamp } else if v > latestDateYear { //如果大于最后的实际日期,那么第一个点就是切割的时间戳 if len(itemList) > 0 { quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100 } } quarterDataList = append(quarterDataList, quarterItem) } item.DataList = quarterDataList } } else { item.DataList = dataList } edbList = append(edbList, item) } return } // ChartInfoRefreshV2 图表刷新 // @author Roc // @datetime 2022-09-16 10:15:38 // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成 只获取使用的指标id,然后遍历去调用“指标刷新服务” func ChartInfoRefreshV2(chartInfoId int) (err error) { var errmsg string defer func() { if err != nil { go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3) //go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers) fmt.Println("ChartInfoRefresh Err:" + errmsg) } }() edbMappingList, err := data_manage.GetChartEdbMappingList(chartInfoId) if err != nil { errmsg = "获取需要刷新的指标失败:Err:" + err.Error() return } edbIdList := make([]int, 0) for _, v := range edbMappingList { edbIdList = append(edbIdList, v.EdbInfoId) } // 批量刷新 err = EdbInfoRefreshAllFromBase(edbIdList, false) if err != nil { return } return }