| 
					
				 | 
			
			
				@@ -1,5 +1,16 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -14,6 +25,135 @@ func (e *Entry) InsertMilkDaily() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *Entry) ProcessMilkDaily(pastureId int64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//nowTime := time.Now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取最大记录日期或默认日期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	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("ProcessMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nowTime := time.Now().Local() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if maxDateTime == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		zaplog.Error("ProcessMilkDaily", zap.Any("pastureId", pastureId), zap.Any("maxDateTime", maxDateTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	maxDate, err := util.TimeParseLocal(model.LayoutDate2, maxDateTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		zaplog.Error("ProcessMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 处理每一天的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	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) 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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |