package crontab import ( "fmt" "kpt-pasture/model" "math" "sort" "time" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" ) // UpdateCowWeeklyHigh 更新牛只周活动量 func (e *Entry) UpdateCowWeeklyHigh(pastureId int64, cow *model.Cow) int32 { highData, err := e.GetSystemNeckRingConfigure(pastureId, model.High) if err != nil || highData == nil || highData.Value <= 0 { return 0 } minWeeklyActive, er := e.GetSystemNeckRingConfigure(pastureId, model.MinWeeklyActive) if er != nil || minWeeklyActive == nil || minWeeklyActive.Value <= 0 { return 0 } weeklyActiveModelList := make([]*model.WeeklyActiveModel, 0) nowTime := time.Now().Local() startTime := nowTime.AddDate(0, 0, -7).Format(model.LayoutDate2) endTime := nowTime.AddDate(0, 0, -1).Format(model.LayoutDate2) selectStr := fmt.Sprintf(`cow_id,heat_date,count(1) AS nb,IF(ROUND(AVG(high))>%d, ROUND(AVG(high)), %d) AS high`, minWeeklyActive.Value, minWeeklyActive.Value) if err = e.DB.Model(new(model.NeckActiveHabit)). Select(selectStr). Where("pasture_id = ?", pastureId). Where("cow_id = ?", cow.Id). Where("heat_date BETWEEN ? AND ?", startTime, endTime). Where("high > ?", highData.Value). Having("nb > ?", 8). Order("high"). Group("heat_date"). Find(&weeklyActiveModelList).Error; err != nil { zaplog.Error("crontab", zap.Any("UpdateCowWeeklyHigh", err)) return 0 } if len(weeklyActiveModelList) < 3 { return 0 } // 1. 先按High值排序 sort.Slice(weeklyActiveModelList, func(i, j int) bool { return weeklyActiveModelList[i].High < weeklyActiveModelList[j].High }) countHigh := len(weeklyActiveModelList) sumHigh := int32(0) minHigh := weeklyActiveModelList[0].High maxHigh := weeklyActiveModelList[countHigh-1].High for _, v := range weeklyActiveModelList { sumHigh += v.High } diff := 0 x := int32(0) if countHigh > 3 { diff = 3 x = weeklyActiveModelList[1].High } else if countHigh == 3 { diff = 2 } else { return 0 } avgHigh := float64(sumHigh-minHigh-maxHigh-x) / float64(countHigh-diff) return int32(math.Round(avgHigh)) }