datastat.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package main
  2. import (
  3. "runtime/debug"
  4. "sync/atomic"
  5. "time"
  6. "github.com/sirupsen/logrus"
  7. "lc/common/models"
  8. "lc/common/util"
  9. )
  10. var (
  11. StatYestodayStartMinute = 30
  12. StatCurrentdayStartMinute = 10
  13. isRunning int32 = 0
  14. )
  15. // CalcLightingRate 临时使用
  16. func CalcLightingRate( /*t*/ time.Time) {
  17. t, err1 := util.MlParseTime("2020-08-04 00:00:00")
  18. if err1 == nil {
  19. for !t.After(util.MlNow()) {
  20. models.CalcLightingRate(t)
  21. t = t.AddDate(0, 0, 1)
  22. }
  23. }
  24. }
  25. func GetNext15minite(t time.Time) time.Time {
  26. t = t.Add(-time.Duration(t.Second()) * time.Second) //去掉秒钟部分
  27. t = t.Add(-time.Duration(t.Nanosecond()) * time.Nanosecond) //去掉秒钟部分
  28. if t.Minute()%15 == 0 {
  29. return t
  30. }
  31. m := t.Minute()
  32. next := 0
  33. t = t.Add(-time.Duration(t.Minute()) * time.Minute) //去掉分钟部分
  34. if m > 0 && m < 15 {
  35. next = 15
  36. } else if m > 15 && m < 30 {
  37. next = 30
  38. } else if m > 30 && m < 45 {
  39. next = 45
  40. } else if m > 45 && m < 60 {
  41. next = 60
  42. }
  43. t = t.Add(time.Duration(next) * time.Minute)
  44. return t
  45. }
  46. func StatData(args ...interface{}) interface{} {
  47. if !atomic.CompareAndSwapInt32(&isRunning, 0, 1) {
  48. logrus.Info("StatData 已有实例在运行,直接退出")
  49. return nil
  50. }
  51. defer atomic.StoreInt32(&isRunning, 0)
  52. defer func() {
  53. if err := recover(); err != nil {
  54. logrus.Error("StatData发生异常:", err)
  55. logrus.Error("StatData发生异常,堆栈:", string(debug.Stack()))
  56. time.Sleep(time.Second)
  57. gopool.Add(StatData, 1)
  58. }
  59. }()
  60. LastHour := util.BeginningOfHour().Add(1 * time.Hour)
  61. LastDay := util.BeginningOfDay()
  62. NextCalcMinuteRate := GetNext15minite(util.MlNow())
  63. //小于0点半启动,则还需要统计昨日的
  64. if time.Now().Minute() < StatYestodayStartMinute && time.Now().Hour() == 0 {
  65. LastDay = LastDay.Add(-24 * time.Hour)
  66. }
  67. //小于整点过10分启动,则需要统计当日的
  68. if time.Now().Minute() < StatCurrentdayStartMinute {
  69. LastHour = LastHour.Add(-1 * time.Hour)
  70. }
  71. for {
  72. //每天0点半执行昨日统计
  73. if util.BeginningOfDay().After(LastDay) && time.Now().Minute() > StatYestodayStartMinute {
  74. if err := models.StatDay(LastDay); err != nil {
  75. logrus.Errorf("统计日[%s]数据错误:%s", LastDay.Format("2006-01-02 15:04:05"), err.Error())
  76. }
  77. //统计昨日能耗
  78. if err := models.StatDayEnergy(util.MlNow(), 1); err != nil {
  79. logrus.Errorf("统计日能耗[%s]数据错误:%s", LastDay.Format("2006-01-02 15:04:05"), err.Error())
  80. }
  81. //统计当月能耗
  82. if err := models.StatMonthEnergy(util.MlNow(), 0); err != nil {
  83. logrus.Errorf("统计日能耗[%s]数据错误:%s", LastDay.Format("2006-01-02 15:04:05"), err.Error())
  84. }
  85. //月初第一天,还需要计算上月的统计
  86. if util.MlNow().Day() == 1 {
  87. if err := models.StatMonthEnergy(util.MlNow(), 1); err != nil {
  88. logrus.Errorf("统计月能耗[%s]数据错误:%s", LastDay.Format("2006-01-02 15:04:05"), err.Error())
  89. }
  90. }
  91. LastDay = util.BeginningOfDay()
  92. }
  93. //每日7点后整点过10分执行当日统计
  94. if time.Now().After(LastHour) && time.Now().Minute() >= StatCurrentdayStartMinute && time.Now().Hour() >= 6 {
  95. if err := models.StatDay(util.BeginningOfDay()); err != nil {
  96. logrus.Errorf("统计日[%s]数据错误:%s", LastHour.Format("2006-01-02 15:04:05"), err.Error())
  97. }
  98. //统计当日能耗
  99. if err := models.StatDayEnergy(util.MlNow(), 0); err != nil {
  100. logrus.Errorf("统计日能耗[%s]数据错误:%s", LastDay.Format("2006-01-02 15:04:05"), err.Error())
  101. }
  102. //每日8点统计昨日亮灯时长
  103. if time.Now().Hour() == 8 {
  104. tt := util.New(LastHour).BeginningOfDay().Add(-24 * time.Hour)
  105. err := models.CalcLightingRate(tt)
  106. if err != nil {
  107. return nil
  108. }
  109. }
  110. LastHour = LastHour.Add(1 * time.Hour)
  111. }
  112. //每15分钟统计一次小时亮灯率
  113. if util.MlNow().After(NextCalcMinuteRate) {
  114. err := models.CalcLightingMiniteRate(NextCalcMinuteRate)
  115. if err != nil {
  116. return nil
  117. }
  118. NextCalcMinuteRate = NextCalcMinuteRate.Add(time.Duration(15) * time.Minute)
  119. }
  120. time.Sleep(5 * time.Second)
  121. }
  122. return 0
  123. }