package crontab import ( "encoding/json" "kpt-pasture/model" "kpt-pasture/module/backend" "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) (int32, error) { if len(cowList) <= 0 { return 0, nil } newCowList := make([]*model.Cow, 0) for _, cow := range cowList { if ok := e.IsExistSameTimeCow(cow, sameTime); ok { zaplog.Info("GenerateCalendarBySameTimePlan", zap.Any("sameTime", sameTime), zap.Any("cow", cow)) continue } newCowList = append(newCowList, cow) } calendarList := make([]*model.Calendar, 0) newSameTimeCowDetailList := make([]*model.SameTimeCowDetail, 0) if len(sameTime.CollateNodes) > 0 { collateNodes := make([]*pasturePb.CollateNode, 0) var _ = json.Unmarshal([]byte(sameTime.CollateNodes), &collateNodes) nowTime := time.Now() for i, collateNode := range collateNodes { showDay := nowTime.Format(model.LayoutDate2) if i > 0 { showDay = nowTime.Add(time.Hour * 24 * time.Duration(collateNode.NextNodeDay)).Format(model.LayoutDate2) } calendarName := backend.CalendarTypeMap()[pasturePb.CalendarType_PG] calendarType := pasturePb.CalendarType_PG if collateNode.SameTimeType == pasturePb.SameTimeType_RnGH { calendarName = backend.CalendarTypeMap()[pasturePb.CalendarType_RnGH] calendarType = pasturePb.CalendarType_RnGH } if collateNode.SameTimeType == pasturePb.SameTimeType_TAI { calendarName = backend.CalendarTypeMap()[pasturePb.CalendarType_Mating] calendarType = pasturePb.CalendarType_Mating } histCount := e.GetTowardSameTimeCowSum(sameTime.Id, collateNode.SameTimeType) calendarList = append(calendarList, &model.Calendar{ Name: calendarName, CalendarType: calendarType, Count: int32(len(newCowList)) + int32(histCount), ShowDay: showDay, IsShow: pasturePb.IsShow_Ok, }) newSameTimeCowDetailList = append( newSameTimeCowDetailList, model.NewSameTimeCowDetailList(newCowList, sameTime.Id, showDay, collateNode.SameTimeType)..., ) } } newSameTimeCowList := model.NewSameTimeCowList(newCowList, sameTime) if err := e.DB.Transaction(func(tx *gorm.DB) error { // 创建牛只同期日历表 if err := tx.Create(calendarList).Error; err != nil { return xerr.WithStack(err) } // 创建牛只同期总表 if err := tx.Create(newSameTimeCowList).Error; err != nil { return xerr.WithStack(err) } if err := tx.Create(newSameTimeCowDetailList).Error; err != nil { return xerr.WithStack(err) } return nil }); err != nil { return 0, xerr.WithStack(err) } return int32(len(newCowList)), nil } func (e *Entry) getWorkOrderCalendar(name string) []*model.Calendar { res := make([]*model.Calendar, 0) if err := e.DB.Where("name = ?", name). Where("is_show = ?", pasturePb.IsShow_Ok). Find(&res).Error; err != nil { zaplog.Error("getWorkOrderCalendar", zap.Any("err", err)) } return res } // GetTowardSameTimeCowSum 获取历史未打激素牛只总数量 func (e *Entry) GetTowardSameTimeCowSum(sameTimeId int64, sameTimeType pasturePb.SameTimeType_Kind) int64 { res := int64(0) if err := e.DB.Model(&model.SameTimeCowDetail{}). Where("status = ?", pasturePb.IsShow_No). Where("same_time_id = ?", sameTimeId). Where("same_time_type = ?", sameTimeType). Count(&res).Error; err != nil { zaplog.Error("GetTowardSameTimeCowSum", zap.Any("err", err)) } return res }