package crontab import ( "kpt-pasture/model" "kpt-pasture/util" "time" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" ) func (e *Entry) InsertMilkDaily() error { pastureList := e.FindPastureList() if pastureList == nil || len(pastureList) == 0 { return nil } for _, pasture := range pastureList { // 获取最大记录日期或默认日期 pastureId := pasture.Id var maxDateTime string if err := e.DB.Model(new(model.MilkDaily)). Where("pasture_id = ?", pastureId). Select("IFNULL(MAX(heat_date) + INTERVAL 1 DAY, CURDATE() - INTERVAL 1 MONTH) AS max_date_time"). Scan(&maxDateTime).Error; err != nil { zaplog.Error("InsertMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err)) continue } maxDate, err := util.TimeParseLocal(model.LayoutDate2, maxDateTime) if err != nil { zaplog.Error("InsertMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err)) continue } e.ProcessMilkDaily(pastureId, maxDate) } return nil } func (e *Entry) ProcessMilkDaily(pastureId int64, maxDate time.Time) { nowTime := time.Now().Local() // 处理每一天的数据 for maxDate.Before(nowTime) { // 处理有胎次的奶牛 if err := e.processCowsWithLact(maxDate); err != nil { zaplog.Error("ProcessMilkDaily", zap.Any("processCowsWithFetal", err)) } // 处理无胎次的奶牛 if err := e.processCowsWithNoLact(maxDate); err != nil { zaplog.Error("ProcessMilkDaily", zap.Any("processCowsWithoutFetal", err)) } // 日期加1天 maxDate = maxDate.AddDate(0, 0, 1) } } func (e *Entry) UpdateMilkDaily(pastureId int64, maxDateTime string) error { //yesterday := time.Now().Local().AddDate(0, 0, -1).Format(model.LayoutDate2) return nil } // 处理有胎次的奶牛 func (e *Entry) processCowsWithLact(recordDate time.Time) error { // 查询有胎次且在记录日期前有记录的奶牛 cowList := make([]*model.Cow, 0) if err := e.DB.Model(new(model.Cow)). Where("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("lact > ?", 0). Where("last_calving_at <= ?", recordDate.Local().Unix()). Find(&cowList).Error; err != nil { return err } // 批量插入数据 milkDailyList := make([]*model.MilkDaily, 0) for _, cow := range cowList { calvingDate := "" if cow.LastCalvingAt > 0 { calvingDate = time.Unix(cow.LastCalvingAt, 0).Local().Format(model.LayoutDate2) } milkDaily := &model.MilkDaily{ CowId: cow.Id, Lact: cow.Lact, PastureId: cow.PastureId, EarNumber: cow.EarNumber, CalvingDate: calvingDate, HeatDate: recordDate.Format(model.LayoutDate2), LactationAge: cow.LactationAge, PenId: cow.PenId, PenName: cow.PenName, BreedStatus: cow.BreedStatus, } milkDailyList = append(milkDailyList, milkDaily) } if len(milkDailyList) > 0 { if err := e.DB.Model(new(model.MilkDaily)). Create(&milkDailyList).Error; err != nil { return err } } return nil } // 处理无胎次的奶牛 func (e *Entry) processCowsWithNoLact(recordDate time.Time) error { // 查询无胎次且EID1>0的奶牛 cowList := make([]*model.Cow, 0) err := e.DB.Model(new(model.Cow)). //Select("c.intCowId as cow_id, c.intPastureId as pasture_id, c.varCowCode as cow_code,c.dateBirthDate as birth_date, c.intCurBar as cur_bar"). //Where("(c.dateLeave IS NULL OR c.dateLeave > ?) AND c.intCurFetal = 0 AND c.EID1 > 0", recordDate). Where("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("lact = ?", 0). Where("neck_ring_number != ?", ""). Find(&cowList).Error if err != nil { return err } // 批量插入数据 milkDailyList := make([]*model.MilkDaily, 0) for _, cow := range cowList { birthDate, calvingDate := "", "" if cow.BirthAt > 0 { birthDate = time.Unix(cow.BirthAt, 0).Local().Format(model.LayoutDate2) } if cow.LastCalvingAt > 0 { calvingDate = time.Unix(cow.LastCalvingAt, 0).Local().Format(model.LayoutDate2) } milkDaily := &model.MilkDaily{ CowId: cow.Id, Lact: cow.Lact, PastureId: cow.PastureId, EarNumber: cow.EarNumber, BirthDate: birthDate, CalvingDate: calvingDate, LactationAge: cow.LactationAge, HeatDate: recordDate.Format(model.LayoutDate2), PenId: cow.PenId, PenName: cow.PenName, } milkDailyList = append(milkDailyList, milkDaily) } if len(milkDailyList) > 0 { if err = e.DB.Model(new(model.MilkDaily)).Create(&milkDailyList).Error; err != nil { return err } } return nil }