package crontab import ( "fmt" "kpt-pasture/config" "kpt-pasture/model" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/xerr" ) type SumData struct { sumRemain int32 sumIntake int32 sumInactive int32 sumGasp int32 sumOther int32 sumActive int32 } // 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) // 更新已处理过的id defer func() { if len(neckRingIds) > 0 { e.DB.Model(new(model.NeckRingOriginal)).Where("id IN ?", neckRingIds).Update("is_show", pasturePb.IsShow_Ok) } }() originalMapData := make(map[string]*model.NeckRingOriginal) baseHours := int32(6) // 合并成2个小时的 for _, v := range neckRingList { if v.ActiveDate == "" { continue } neckRingIds = append(neckRingIds, v.Id) mapKey := fmt.Sprintf("%s-%s-%d", v.Imei, v.ActiveDate, v.FrameId) if _, ok := originalMapData[mapKey]; ok { if v.ActiveDateType == pasturePb.ActiveTimeType_Twenty_Minutes { baseHours = 1 } originalMapData[mapKey].Remain *= baseHours originalMapData[mapKey].Intake *= baseHours originalMapData[mapKey].Inactive *= baseHours originalMapData[mapKey].Gasp *= baseHours originalMapData[mapKey].Other *= baseHours originalMapData[mapKey].Active *= baseHours } else { originalMapData[mapKey] = v } } iemMap := make(map[string]*model.NeckRingOriginal) for _, v := range originalMapData { mapKey := fmt.Sprintf("%s-%s", v.Imei, v.ActiveDate) if _, ok := iemMap[mapKey]; ok { originalMapData[mapKey].Remain += v.Remain originalMapData[mapKey].Intake += v.Intake originalMapData[mapKey].Inactive += v.Inactive originalMapData[mapKey].Gasp += v.Gasp originalMapData[mapKey].Other += v.Other originalMapData[mapKey].Active += v.Active } else { iemMap[mapKey] = v } } sumIemMap := make(map[string]*SumData) for k, v := range iemMap { if sumIemMap[k] == nil { sumIemMap[k] = &SumData{ sumRemain: v.Remain / baseHours, sumIntake: v.Intake / baseHours, sumInactive: v.Inactive / baseHours, sumGasp: v.Gasp / baseHours, sumOther: v.Other / baseHours, sumActive: v.Active / baseHours, } } } return nil }