edb_data.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package data
  2. import (
  3. "eta_gn/eta_chart_lib/models"
  4. "eta_gn/eta_chart_lib/utils"
  5. "time"
  6. )
  7. func GetEdbDataTbzForSeason(frequency string, tmpDataList []*models.EdbDataList, startDateTime time.Time) (dataList []*models.EdbDataList, minValue, maxValue float64, err error) {
  8. dataList = make([]*models.EdbDataList, 0)
  9. var dateArr []string
  10. dataMap := make(map[string]*models.EdbDataList)
  11. for _, v := range tmpDataList {
  12. dateArr = append(dateArr, v.DataTime)
  13. dataMap[v.DataTime] = v
  14. }
  15. for _, av := range dateArr {
  16. currentItem, ok := dataMap[av]
  17. if !ok {
  18. continue
  19. }
  20. tmpItem := *currentItem
  21. var isOk bool //是否计算出来结果
  22. currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
  23. if tmpErr != nil {
  24. err = tmpErr
  25. return
  26. }
  27. if !startDateTime.IsZero() && currentDate.Before(startDateTime) {
  28. continue
  29. }
  30. preDate := currentDate.AddDate(-1, 0, 0)
  31. preDateStr := preDate.Format(utils.FormatDate)
  32. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  33. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  34. isOk = true
  35. } else {
  36. if frequency == "月度" { //向上和向下,各找一个月
  37. for i := 0; i <= 35; i++ {
  38. nextDateDay := preDate.AddDate(0, 0, i)
  39. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  40. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  41. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  42. isOk = true
  43. break
  44. } else {
  45. preDateDay := preDate.AddDate(0, 0, -i)
  46. preDateDayStr := preDateDay.Format(utils.FormatDate)
  47. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  48. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  49. isOk = true
  50. break
  51. }
  52. }
  53. }
  54. } else if frequency == "季度" || frequency == "年度" {
  55. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  56. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  57. isOk = true
  58. break
  59. }
  60. } else {
  61. nextDateDay := preDate.AddDate(0, 0, 1)
  62. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  63. preDateDay := preDate.AddDate(0, 0, -1)
  64. preDateDayStr := preDateDay.Format(utils.FormatDate)
  65. for i := 0; i < 35; i++ {
  66. if i >= 1 {
  67. nextDateDay = nextDateDay.AddDate(0, 0, i)
  68. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  69. }
  70. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  71. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  72. isOk = true
  73. break
  74. } else {
  75. if i >= 1 {
  76. preDateDay = preDate.AddDate(0, 0, -i)
  77. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  78. }
  79. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  80. tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
  81. isOk = true
  82. break
  83. }
  84. }
  85. }
  86. }
  87. }
  88. if isOk {
  89. if tmpItem.Value > maxValue {
  90. maxValue = tmpItem.Value
  91. }
  92. if tmpItem.Value < minValue {
  93. minValue = tmpItem.Value
  94. }
  95. dataList = append(dataList, &tmpItem)
  96. }
  97. }
  98. return
  99. }