|
@@ -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
|
|
|
}
|