package crontab import ( "fmt" "kpt-pasture/config" "kpt-pasture/model" "math" "gorm.io/gorm" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/xerr" ) // NeckRingMergeData 把 func (e *Entry) NeckRingMergeData() error { cfg := config.Options() limit := cfg.NeckRingLimit if limit <= 0 { limit = 10000 } neckRingList := make([]*model.NeckRingOriginal, 0) if err := e.DB.Model(new(model.NeckRingOriginal)). Where("h1.is_show = ?", pasturePb.IsShow_No). Limit(int(limit)). Find(&neckRingList).Error; err != nil { return xerr.WithStack(err) } if len(neckRingList) <= 0 { return nil } neckRingIds := make([]int64, 0) originalMapData := make(map[string]*model.NeckRingOriginalMerge) // 合并成2个小时的 for _, v := range neckRingList { neckRingIds = append(neckRingIds, v.Id) xframeId := int(math.Floor(float64(v.FrameId)/10) * 2) 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 if _, ok := originalMapData[mapKey]; !ok { originalMapData[mapKey] = new(model.NeckRingOriginalMerge) } v.IsAvgHours() originalMapData[mapKey].IsMageData(v) } // 算平均值 sumAvgImei := make(map[string]*model.NeckRingOriginalMerge) for key, _ := range originalMapData { if _, ok := originalMapData[key]; !ok { sumAvgImei[key] = new(model.NeckRingOriginalMerge) } sumAvgImei[key].SumAvg() } if err := e.DB.Transaction(func(tx *gorm.DB) error { // 更新已处理过的id if len(neckRingIds) > 0 { if err := tx.Model(new(model.NeckRingOriginal)). Where("id IN ?", neckRingIds). Update("is_show", pasturePb.IsShow_Ok). Error; err != nil { return xerr.WithStack(err) } } // 插入新的数据,如果存在则合并更新 newNeckActiveHabitList := model.NeckRingOriginalMap(sumAvgImei).ForMatData(e.GetCowInfoByImei) if len(newNeckActiveHabitList) > 0 { if err := tx.Create(newNeckActiveHabitList).Error; err != nil { return xerr.WithStack(err) } } return nil }); err != nil { return xerr.WithStack(err) } return nil }