neck_ring.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/config"
  5. "kpt-pasture/model"
  6. "math"
  7. "gorm.io/gorm"
  8. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. )
  11. // NeckRingMergeData 把
  12. func (e *Entry) NeckRingMergeData() error {
  13. cfg := config.Options()
  14. limit := cfg.NeckRingLimit
  15. if limit <= 0 {
  16. limit = 10000
  17. }
  18. neckRingList := make([]*model.NeckRingOriginal, 0)
  19. if err := e.DB.Model(new(model.NeckRingOriginal)).
  20. Where("h1.is_show = ?", pasturePb.IsShow_No).
  21. Limit(int(limit)).
  22. Find(&neckRingList).Error; err != nil {
  23. return xerr.WithStack(err)
  24. }
  25. if len(neckRingList) <= 0 {
  26. return nil
  27. }
  28. neckRingIds := make([]int64, 0)
  29. originalMapData := make(map[string]*model.NeckRingOriginalMerge)
  30. // 合并成2个小时的
  31. for _, v := range neckRingList {
  32. neckRingIds = append(neckRingIds, v.Id)
  33. xframeId := int(math.Floor(float64(v.FrameId)/10) * 2)
  34. mapKey := fmt.Sprintf("%s%s%s%s%d", v.Imei, model.JoinKey, v.ActiveDate, model.JoinKey, xframeId) // 0001-2023-12-04-0 0001-2023-12-03-4
  35. if _, ok := originalMapData[mapKey]; !ok {
  36. originalMapData[mapKey] = new(model.NeckRingOriginalMerge)
  37. }
  38. v.IsAvgHours()
  39. originalMapData[mapKey].IsMageData(v)
  40. }
  41. // 算平均值
  42. sumAvgImei := make(map[string]*model.NeckRingOriginalMerge)
  43. for key, _ := range originalMapData {
  44. if _, ok := originalMapData[key]; !ok {
  45. sumAvgImei[key] = new(model.NeckRingOriginalMerge)
  46. }
  47. sumAvgImei[key].SumAvg()
  48. }
  49. if err := e.DB.Transaction(func(tx *gorm.DB) error {
  50. // 更新已处理过的id
  51. if len(neckRingIds) > 0 {
  52. if err := tx.Model(new(model.NeckRingOriginal)).
  53. Where("id IN ?", neckRingIds).
  54. Update("is_show", pasturePb.IsShow_Ok).
  55. Error; err != nil {
  56. return xerr.WithStack(err)
  57. }
  58. }
  59. // 插入新的数据,如果存在则合并更新
  60. newNeckActiveHabitList := model.NeckRingOriginalMap(sumAvgImei).ForMatData(e.GetCowInfoByImei)
  61. if len(newNeckActiveHabitList) > 0 {
  62. if err := tx.Create(newNeckActiveHabitList).Error; err != nil {
  63. return xerr.WithStack(err)
  64. }
  65. }
  66. return nil
  67. }); err != nil {
  68. return xerr.WithStack(err)
  69. }
  70. return nil
  71. }