Browse Source

Merge branch 'hotfix/fix_chart_season' of eta_server/eta_mobile into master

xyxie 1 year ago
parent
commit
8198fadad2
2 changed files with 206 additions and 70 deletions
  1. 170 0
      models/data_manage/edb_data_quarter.go
  2. 36 70
      services/data/chart_info.go

+ 170 - 0
models/data_manage/edb_data_quarter.go

@@ -185,6 +185,176 @@ func AddCalculateQuarterV4(dataList []*EdbDataList) (result *EdbDataResult, err
 	return
 }
 
+// AddCalculateQuarterV6 指标季度数据计算(季节性图表)
+func AddCalculateQuarterV6(dataList []*EdbDataList) (result *EdbDataResult, err error) {
+	var errMsg string
+	defer func() {
+		if errMsg != "" {
+			fmt.Println("errMsg:", errMsg)
+		}
+	}()
+
+	endDate := dataList[len(dataList)-1].DataTime
+	endDateForm, err := time.Parse(utils.FormatDate, endDate)
+	if err != nil {
+		return result, err
+	}
+	thisMonth := int(endDateForm.Month())
+
+	result = new(EdbDataResult)
+	var yearArr []int
+	yearMap := make(map[int]int)
+	var cureentDate time.Time
+	if thisMonth < 11 {
+		for k, v := range dataList {
+			dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
+			if err != nil {
+				errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
+				return result, err
+			}
+			if k == len(dataList)-1 {
+				cureentDate = dateTime
+			}
+			year := dateTime.Year()
+			if _, ok := yearMap[year]; !ok {
+				yearArr = append(yearArr, year)
+			}
+			yearMap[year] = year
+		}
+	} else {
+		for k, v := range dataList {
+			dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
+			if err != nil {
+				errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
+				return result, err
+			}
+			if k == len(dataList)-1 {
+				cureentDate = dateTime
+			}
+			year := dateTime.Year() + 1
+			if _, ok := yearMap[year]; !ok {
+				yearArr = append(yearArr, year)
+			}
+			yearMap[year] = year
+		}
+	}
+	//排序
+	fmt.Println("yearArr:", yearArr)
+	thisYear := cureentDate.Year()
+	//thisMonth := int(cureentDate.Month())
+
+	fmt.Println("thisMonth:", thisMonth)
+	for ky, vy := range yearArr {
+		fmt.Printf("line 432:ky:%d, vy:%d, thisYear:%d, thisMonth:%d", ky, vy, thisYear, thisMonth)
+		fmt.Println("")
+		if thisMonth < 11 {
+			currentYearCjnl := strconv.Itoa(thisYear) + "-01-01"               //当前年份春节农历
+			currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历
+			currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl)
+			if err != nil {
+				errMsg = "生成当前春节失败,Err:" + err.Error()
+				return result, err
+			}
+
+			preYear := vy
+			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
+			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
+			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
+			if err != nil {
+				errMsg = "生成历史年份春节失败,Err:" + err.Error()
+				return result, err
+			}
+			day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
+
+			fmt.Println("day:", day, currentYearCjglDate, preYearCjglDate)
+
+			items := new(EdbDataItems)
+			items.BetweenDay = int(day) //公历日期换算成农历,需要减除的天数
+			items.Year = preYear
+			for _, v := range dataList {
+				dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
+				if err != nil {
+					errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
+					return result, err
+				}
+				newDate := dateTime.AddDate(0, 0, int(day))
+				timestamp := newDate.UnixNano() / 1e6
+				item := new(EdbDataList)
+				item.DataTime = newDate.Format(utils.FormatDate)
+				item.EdbInfoId = v.EdbInfoId
+				item.Value = v.Value
+				item.EdbDataId = v.EdbDataId
+				item.DataTimestamp = timestamp
+				items.Items = append(items.Items, item)
+			}
+			result.List = append(result.List, items)
+		} else {
+			nextYear := thisYear + 1
+			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
+			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
+
+			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
+			if err != nil {
+				errMsg = "生成当前春节失败,Err:" + err.Error()
+				return result, err
+			}
+			preYear := vy
+			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
+			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
+			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
+			if err != nil {
+				errMsg = "生成历史年份春节失败,Err:" + err.Error()
+				return result, err
+			}
+			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
+
+			fmt.Println("day:", day, nextYearCjglDate, preYearCjglDate)
+
+			items := new(EdbDataItems)
+			items.BetweenDay = int(day) //公历日期换算成农历,需要减除的天数
+			items.Year = preYear
+			fmt.Println("preYear:", preYear, "ky:", ky, "yearArrLen:", len(yearArr))
+			//if ky+1 < len(yearArr) {
+			for _, v := range dataList {
+				dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
+				if err != nil {
+					errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
+					return result, err
+				}
+				newDate := dateTime.AddDate(0, 0, int(day))
+				timestamp := newDate.UnixNano() / 1e6
+				item := new(EdbDataList)
+				item.DataTime = newDate.Format(utils.FormatDate)
+				item.EdbInfoId = v.EdbInfoId
+				item.Value = v.Value
+				item.EdbDataId = v.EdbDataId
+				item.DataTimestamp = timestamp
+				items.Items = append(items.Items, item)
+			}
+			result.List = append(result.List, items)
+			/*} else {
+				for _, v := range dataList {
+					dateTime, err := time.Parse(utils.FormatDate, v.DataTime)
+					if err != nil {
+						errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime
+						return result, err
+					}
+					timestamp := dateTime.UnixNano() / 1e6
+					item := new(EdbDataList)
+					item.DataTime = dateTime.Format(utils.FormatDate)
+					item.EdbInfoId = v.EdbInfoId
+					item.Value = v.Value
+					item.EdbDataId = v.EdbDataId
+					item.DataTimestamp = timestamp
+					items.Items = append(items.Items, item)
+				}
+				result.List = append(result.List, items)
+			}*/
+		}
+	}
+	return
+}
+
 type EdbDataItems struct {
 	Items                []*EdbDataList
 	Year                 int

+ 36 - 70
services/data/chart_info.go

@@ -308,7 +308,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 					result := new(data_manage.EdbDataResult)
 					item.DataList = result
 				} else {
-					result, tmpErr := data_manage.AddCalculateQuarterV4(dataList)
+					result, tmpErr := data_manage.AddCalculateQuarterV6(dataList)
 					if tmpErr != nil {
 						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 						return
@@ -561,12 +561,14 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	//判断横轴的两个时间之间是不是跨年了,如果跨年了,则横轴截止年份比起始年份+1,如果不跨年,截止年份等于起始年份
 	//根据数据确定最早的年份,和最近年份
 	//根据横轴的日期,汇总所有的年份
+
 	startYear := result.List[0].Year
 	/*if jumpYear == 1 {
 		if startYear != calendarPreYear {
 			startYear = startYear - 1
 		}
 	}*/
+
 	itemLength := len(result.List[length-1].Items)
 	//获取数据的最新日期
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
@@ -611,7 +613,6 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 			//如果最新的日期在起始日之前,则跳出循环
 			break
 		}
-		
 		if endT.Year() > nowYear {
 			//如果最新的日期比真实年份要大,则数据全部按照最大的年份补齐
 			nowYear = endT.Year()
@@ -622,6 +623,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 			ShowName:  showName,
 		}
 		dataMap[showName] = item
+		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
 		chartLegendMap[showName] = idx
 		idx++
 		if lastDateT.Before(endT) {
@@ -645,6 +647,14 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 
 	//判断哪些点应该落在同一条时间线上
 	maxY := lastDateT.Year()
+	changeFlag := false
+	if lastDateT.Month() >= 11 {
+		maxY = maxY + 1
+	}
+	if maxY < nowYear {
+		changeFlag = true
+		maxY = nowYear
+	}
 	endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
 	endTmpT, _ := time.Parse(utils.FormatDate, endTmp)
 	minY := maxY
@@ -654,9 +664,10 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	startTmp := fmt.Sprintf("%d-%s", minY, xStartDate)
 	startTmpT, _ := time.Parse(utils.FormatDate, startTmp)
 
+	fmt.Println("横轴截取日" + startTmpT.Format(utils.FormatDate) + " " + endTmpT.Format(utils.FormatDate))
 	for name, dateItem := range dataMap {
 		lv, ok1 := yearDataListMap[dateItem.EndDate.Year()]
-		if dateItem.EndDate.Year() > lastDateT.Year() {
+		if changeFlag {
 			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
 		}
 		if !ok1 {
@@ -671,78 +682,27 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 				Value:         item.Value,
 			}
 			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
-			year := dataTimeT.Year()
-			newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
-			if dateItem.EndDate.Year() > maxY {
-				if (dateItem.StartDate.Before(dataTimeT) && dateItem.EndDate.After(dataTimeT)) || dateItem.StartDate == dataTimeT || dateItem.EndDate == dataTimeT {
-					if jumpYear == 1 {
-						//计算前一年最大的日期, 只补齐数据到去年
-						beforeYearMaxDate := fmt.Sprintf("%d-12-31", dateItem.StartDate.Year())
-						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
-						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
-							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
-						} else {
-							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
-						}
-					} else {
-						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
-					}
-					timestamp := newItemDate.UnixNano() / 1e6
-					tmpVal.DataTimestamp = timestamp
-					tmpV := &tmpVal
-					if findVal, ok := quarterMap[name]; !ok {
-						findVal = append(findVal, tmpV)
-						quarterMap[name] = findVal
-					} else {
-						findVal = append(findVal, tmpV)
-						quarterMap[name] = findVal
-					}
-					if lv.Year >= latestDateYear {
-						// 切割的日期时间字符串
-						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
-						if item.DataTime == cuttingDataTimeStr {
-							dateItem.CuttingDataTimestamp = timestamp
-							dataMap[name] = dateItem
-						}
-					}
+			if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
+				tmpV := &tmpVal
+				if findVal, ok := quarterMap[name]; !ok {
+					findVal = append(findVal, tmpV)
+					quarterMap[name] = findVal
+				} else {
+					findVal = append(findVal, tmpV)
+					quarterMap[name] = findVal
 				}
-			} else {
-				if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
-					if jumpYear == 1 {
-						//计算前一年最大的日期, 只补齐数据到去年
-						beforeYearMaxDate := fmt.Sprintf("%d-12-31", startTmpT.Year())
-						beforeYearMaxDateT, _ := time.Parse(utils.FormatDate, beforeYearMaxDate)
-						if dataTimeT.Before(beforeYearMaxDateT) || dataTimeT == beforeYearMaxDateT {
-							newItemDate = dataTimeT.AddDate(nowYear-year-1, 0, 0)
-						} else {
-							newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
-						}
-					} else {
-						newItemDate = dataTimeT.AddDate(nowYear-year, 0, 0)
-					}
-					timestamp := newItemDate.UnixNano() / 1e6
-					tmpVal.DataTimestamp = timestamp
-					tmpV := &tmpVal
-					if findVal, ok := quarterMap[name]; !ok {
-						findVal = append(findVal, tmpV)
-						quarterMap[name] = findVal
-					} else {
-						findVal = append(findVal, tmpV)
-						quarterMap[name] = findVal
-					}
-					if lv.Year >= latestDateYear {
-						// 切割的日期时间字符串
-						cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
-						if item.DataTime == cuttingDataTimeStr {
-							dateItem.CuttingDataTimestamp = timestamp
-							dataMap[name] = dateItem
-						}
+				if lv.Year >= latestDateYear {
+					// 切割的日期时间字符串
+					cuttingDataTimeStr := latestDate.AddDate(0, 0, lv.BetweenDay).Format(utils.FormatDate)
+					if item.DataTime == cuttingDataTimeStr {
+						dateItem.CuttingDataTimestamp = tmpVal.DataTimestamp
+						dataMap[name] = dateItem
 					}
 				}
 			}
 		}
-
 	}
+
 	for k, v := range dataMap {
 		itemList := quarterMap[k]
 		quarterItem := new(data_manage.QuarterData)
@@ -755,7 +715,13 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 		}
 		quarterItem.DataList = itemList
 		quarterItem.CuttingDataTimestamp = v.CuttingDataTimestamp
-
+		//如果等于最后的实际日期,那么将切割时间戳记录
+		if quarterItem.CuttingDataTimestamp == 0 {
+			//如果大于最后的实际日期,那么第一个点就是切割的时间戳
+			if latestDate.Before(v.StartDate) && len(itemList) > 0 {
+				quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
+			}
+		}
 		quarterDataList = append(quarterDataList, quarterItem)
 	}