package crontab import ( "encoding/json" "kpt-pasture/model" "sort" "time" "gorm.io/gorm" "gitee.com/xuyiping_admin/pkg/xerr" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" ) // GenerateCalendarBySameTimePlan 生成同期计划的牛只 func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) (err error) { if len(cowList) <= 0 { return nil } newCowList := make([]*model.Cow, 0) for _, cow := range cowList { if ok := e.IsExistSameTimeCow(cow, sameTime); ok { continue } newCowList = append(newCowList, cow) } if len(newCowList) <= 0 || len(sameTime.CollateNodes) <= 0 { return nil } collateNodes := make([]*pasturePb.CollateNode, 0) err = json.Unmarshal([]byte(sameTime.CollateNodes), &collateNodes) if err != nil { return xerr.WithStack(err) } // 排序 sort.Slice(collateNodes, func(i, j int) bool { return collateNodes[i].Id < collateNodes[j].Id }) showDay := time.Now() newSameTimeCowDetailList := make([]*model.EventCowSameTime, 0) newEventMatingList := make([]*model.EventMating, 0) for i, collateNode := range collateNodes { if i > 0 { showDay = showDay.AddDate(0, 0, int(collateNode.NextNodeDay)) } calendarType := pasturePb.CalendarType_PG histCount := int64(0) if collateNode.SameTimeType == pasturePb.SameTimeType_TAI { calendarType = pasturePb.CalendarType_Mating histCount = e.GetTowardTaiCowSum(sameTime.PastureId) newEventMatingItems := model.NewEventMatingList(sameTime.PastureId, newCowList, showDay.Unix(), pasturePb.ExposeEstrusType_Same_Time) newEventMatingList = append(newEventMatingList, newEventMatingItems...) } else { if collateNode.SameTimeType == pasturePb.SameTimeType_RnGH { calendarType = pasturePb.CalendarType_RnGH } histCount = e.GetTowardSameTimeCowSum(sameTime, collateNode.SameTimeType) newEventCowSameTimeList := model.NewEventCowSameTimeList(sameTime.PastureId, newCowList, sameTime, showDay.Unix(), collateNode.SameTimeType) newSameTimeCowDetailList = append(newSameTimeCowDetailList, newEventCowSameTimeList...) } allCount := int32(len(newCowList)) + int32(histCount) e.CreatedCalendar(sameTime.PastureId, calendarType, showDay.Format(model.LayoutDate2), allCount) } zaplog.Info("GenerateCalendarBySameTimePlan", zap.Any("cowList", cowList), zap.Any("newSameTimeCowDetailList", newSameTimeCowDetailList), zap.Any("newEventMatingList", newEventMatingList), ) if err = e.DB.Transaction(func(tx *gorm.DB) error { // 创建牛只同期详情表 if len(newSameTimeCowDetailList) > 0 { if err = tx.Create(newSameTimeCowDetailList).Error; err != nil { return xerr.WithStack(err) } } // 创建牛只配种表 if len(newEventMatingList) > 0 { if err = tx.Create(newEventMatingList).Error; err != nil { return xerr.WithStack(err) } } return nil }); err != nil { return xerr.WithStack(err) } return nil } // GetTowardSameTimeCowSum 获取历史未打激素牛只总数量 func (e *Entry) GetTowardSameTimeCowSum(sameTime *model.SameTime, sameTimeType pasturePb.SameTimeType_Kind) int64 { res := int64(0) if err := e.DB.Model(&model.EventCowSameTime{}). Where("status = ?", pasturePb.IsShow_No). Where("pasture_id = ?", sameTime.PastureId). Where("same_time_id = ?", sameTime.Id). Where("same_time_type = ?", sameTimeType). Count(&res).Error; err != nil { zaplog.Error("GetTowardSameTimeCowSum", zap.Any("err", err)) } return res } // GetTowardTaiCowSum 获取历史未配种牛只总数量 func (e *Entry) GetTowardTaiCowSum(pastureId int64) int64 { res := int64(0) if err := e.DB.Model(&model.EventMating{}). Where("pasture_id = ?", pastureId). Where("status = ?", pasturePb.IsShow_No). Count(&res).Error; err != nil { zaplog.Error("GetTowardTaiCowSum", zap.Any("err", err)) } return res }