neck_ring.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/config"
  5. "kpt-pasture/model"
  6. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  7. "gitee.com/xuyiping_admin/pkg/xerr"
  8. )
  9. type SumData struct {
  10. sumRemain int32
  11. sumIntake int32
  12. sumInactive int32
  13. sumGasp int32
  14. sumOther int32
  15. sumActive int32
  16. }
  17. // NeckRingMergeData 把
  18. func (e *Entry) NeckRingMergeData() error {
  19. cfg := config.Options()
  20. limit := cfg.NeckRingLimit
  21. if limit <= 0 {
  22. limit = 10000
  23. }
  24. neckRingList := make([]*model.NeckRingOriginal, 0)
  25. if err := e.DB.Model(new(model.NeckRingOriginal)).
  26. Where("h1.is_show = ?", pasturePb.IsShow_No).
  27. Limit(int(limit)).
  28. Find(&neckRingList).Error; err != nil {
  29. return xerr.WithStack(err)
  30. }
  31. if len(neckRingList) <= 0 {
  32. return nil
  33. }
  34. neckRingIds := make([]int64, 0)
  35. // 更新已处理过的id
  36. defer func() {
  37. if len(neckRingIds) > 0 {
  38. e.DB.Model(new(model.NeckRingOriginal)).Where("id IN ?", neckRingIds).Update("is_show", pasturePb.IsShow_Ok)
  39. }
  40. }()
  41. originalMapData := make(map[string]*model.NeckRingOriginal)
  42. baseHours := int32(6)
  43. // 合并成2个小时的
  44. for _, v := range neckRingList {
  45. if v.ActiveDate == "" {
  46. continue
  47. }
  48. neckRingIds = append(neckRingIds, v.Id)
  49. mapKey := fmt.Sprintf("%s-%s-%d", v.Imei, v.ActiveDate, v.FrameId)
  50. if _, ok := originalMapData[mapKey]; ok {
  51. if v.ActiveDateType == pasturePb.ActiveTimeType_Twenty_Minutes {
  52. baseHours = 1
  53. }
  54. originalMapData[mapKey].Remain *= baseHours
  55. originalMapData[mapKey].Intake *= baseHours
  56. originalMapData[mapKey].Inactive *= baseHours
  57. originalMapData[mapKey].Gasp *= baseHours
  58. originalMapData[mapKey].Other *= baseHours
  59. originalMapData[mapKey].Active *= baseHours
  60. } else {
  61. originalMapData[mapKey] = v
  62. }
  63. }
  64. iemMap := make(map[string]*model.NeckRingOriginal)
  65. for _, v := range originalMapData {
  66. mapKey := fmt.Sprintf("%s-%s", v.Imei, v.ActiveDate)
  67. if _, ok := iemMap[mapKey]; ok {
  68. originalMapData[mapKey].Remain += v.Remain
  69. originalMapData[mapKey].Intake += v.Intake
  70. originalMapData[mapKey].Inactive += v.Inactive
  71. originalMapData[mapKey].Gasp += v.Gasp
  72. originalMapData[mapKey].Other += v.Other
  73. originalMapData[mapKey].Active += v.Active
  74. } else {
  75. iemMap[mapKey] = v
  76. }
  77. }
  78. sumIemMap := make(map[string]*SumData)
  79. for k, v := range iemMap {
  80. if sumIemMap[k] == nil {
  81. sumIemMap[k] = &SumData{
  82. sumRemain: v.Remain / baseHours,
  83. sumIntake: v.Intake / baseHours,
  84. sumInactive: v.Inactive / baseHours,
  85. sumGasp: v.Gasp / baseHours,
  86. sumOther: v.Other / baseHours,
  87. sumActive: v.Active / baseHours,
  88. }
  89. }
  90. }
  91. return nil
  92. }