|
@@ -41,7 +41,9 @@ func (s *StoreEntry) CalvingList(ctx context.Context, req *pasturePb.SearchEvent
|
|
|
calvingIds = append(calvingIds, v.Id)
|
|
|
}
|
|
|
calvingCalfList := make([]*model.CalvingCalf, 0)
|
|
|
- if err := s.DB.Model(new(model.CalvingCalf)).Where("calving_id IN ?", calvingIds).Find(&calvingCalfList).Error; err != nil {
|
|
|
+ if err := s.DB.Model(new(model.CalvingCalf)).
|
|
|
+ Where("calving_id IN ?", calvingIds).
|
|
|
+ Find(&calvingCalfList).Error; err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
@@ -157,13 +159,90 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
|
|
|
eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
|
|
|
currentUser, _ := s.GetCurrentSystemUser(ctx)
|
|
|
|
|
|
+ // 更新怀孕牛只
|
|
|
+ updatePregnantCowIds := make([]int64, 0)
|
|
|
+ // 更新流产牛只
|
|
|
+ updateAbortCowIds := make([]int64, 0)
|
|
|
+ // 更新空怀牛只
|
|
|
+ updateEmptyCowIds := make([]int64, 0)
|
|
|
for _, cow := range cowList {
|
|
|
- eventPregnantCheckList = append(eventPregnantCheckList, model.NewEventPregnantCheck(cow, currentUser, req))
|
|
|
+ // 过滤掉没有配种状态的牛只 todo 是否需要返回前端提示用户
|
|
|
+ if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ var count int64 = 0
|
|
|
+ if err = s.DB.Model(new(model.EventPregnantCheck)).
|
|
|
+ Where("lact = ?", cow.Lact).
|
|
|
+ Where("cow_id = ?", cow.Id).
|
|
|
+ Order("id desc").Limit(1).Count(&count).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ pregnantCheckResult := req.PregnantCheckResult
|
|
|
+ if req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
|
|
|
+ if count > 0 {
|
|
|
+ pregnantCheckResult = pasturePb.PregnantCheckResult_Recheck_Pregnant
|
|
|
+ } else {
|
|
|
+ pregnantCheckResult = pasturePb.PregnantCheckResult_InCheck_Pregnant
|
|
|
+ }
|
|
|
+ updatePregnantCowIds = append(updatePregnantCowIds, cow.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ if req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant {
|
|
|
+ if count > 0 {
|
|
|
+ pregnantCheckResult = pasturePb.PregnantCheckResult_Recheck_UnPregnant
|
|
|
+ updateAbortCowIds = append(updateAbortCowIds, cow.Id)
|
|
|
+ } else {
|
|
|
+ pregnantCheckResult = pasturePb.PregnantCheckResult_InCheck_UnPregnant
|
|
|
+ updateEmptyCowIds = append(updateEmptyCowIds, cow.Id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ eventPregnantCheckList = append(eventPregnantCheckList, model.NewEventPregnantCheck(cow, currentUser, req, pregnantCheckResult))
|
|
|
}
|
|
|
|
|
|
- if err := s.DB.Create(eventPregnantCheckList).Error; err != nil {
|
|
|
+ if err = s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
+ if err = tx.Create(eventPregnantCheckList).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 抽象公共方法来更新牛只状态
|
|
|
+ err = s.updateCowStatus(tx, updatePregnantCowIds, pasturePb.BreedStatus_Pregnant, pasturePb.MatingResult_Pregnant)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ err = s.updateCowStatus(tx, updateAbortCowIds, pasturePb.BreedStatus_Abort, pasturePb.MatingResult_Abort)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ err = s.updateCowStatus(tx, updateEmptyCowIds, pasturePb.BreedStatus_Empty, pasturePb.MatingResult_Empty)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ }); err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// 抽象公共方法来更新牛只状态
|
|
|
+func (s *StoreEntry) updateCowStatus(tx *gorm.DB, cowIds []int64, breedStatus pasturePb.BreedStatus_Kind, matingResult pasturePb.MatingResult_Kind) error {
|
|
|
+ if len(cowIds) > 0 {
|
|
|
+ if err := tx.Model(&model.Cow{}).Where("cow_id IN ?", cowIds).
|
|
|
+ Updates(map[string]interface{}{"breed_status": breedStatus}).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := tx.Model(&model.EventMating{}).Where("cow_id IN ?", cowIds).
|
|
|
+ Group("cow_id").Select("MAX(id) as id").
|
|
|
+ Updates(map[string]interface{}{"mating_result": matingResult}).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
return nil
|
|
|
}
|
|
|
|
|
@@ -216,13 +295,15 @@ func (s *StoreEntry) MatingCreate(ctx context.Context, req *pasturePb.EventMatin
|
|
|
sameTimeCowIds := make([]int64, 0)
|
|
|
matingInsertList := make([]*model.EventMating, 0)
|
|
|
matingUpdateIds := make([]int64, 0)
|
|
|
+ cowIds := make([]int64, 0)
|
|
|
nowTime := time.Now()
|
|
|
for _, cow := range cowList {
|
|
|
var count int64 = 0
|
|
|
itemEventMating := &model.EventMating{}
|
|
|
if err = s.DB.Where("lact = ?", cow.Lact).
|
|
|
- Where("mating_at <= ").
|
|
|
- Where("cow_id = ?", cow.Id).First(itemEventMating).Count(&count).Error; err != nil {
|
|
|
+ Where("cow_id = ?", cow.Id).
|
|
|
+ Order("id desc").
|
|
|
+ First(itemEventMating).Count(&count).Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
@@ -250,6 +331,8 @@ func (s *StoreEntry) MatingCreate(ctx context.Context, req *pasturePb.EventMatin
|
|
|
if sameTimeCow.Id > 0 {
|
|
|
sameTimeCowIds = append(sameTimeCowIds, sameTimeCow.Id)
|
|
|
}
|
|
|
+
|
|
|
+ cowIds = append(cowIds, cow.Id)
|
|
|
}
|
|
|
|
|
|
if err = s.DB.Transaction(func(tx *gorm.DB) error {
|
|
@@ -295,6 +378,12 @@ func (s *StoreEntry) MatingCreate(ctx context.Context, req *pasturePb.EventMatin
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
+ if err = tx.Table(new(model.Cow).TableName()).
|
|
|
+ Where("id IN ?", cowIds).
|
|
|
+ UpdateColumn("breed_status", pasturePb.BreedStatus_Breeding).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
return nil
|
|
|
}); err != nil {
|
|
|
return xerr.WithStack(err)
|