|
@@ -71,21 +71,35 @@ func (s *StoreEntry) CalvingCreate(ctx context.Context, req *pasturePb.EventCalv
|
|
|
}
|
|
|
|
|
|
cow := cowList[0]
|
|
|
+ newEventCalving := &model.EventCalving{}
|
|
|
+ if err = s.DB.Model(new(model.EventCalving)).Where("cow_id = ?", cow.Id).Where("lact = ?", cow.Lact).First(newEventCalving).Error; err != nil {
|
|
|
+ return xerr.Custom("该母牛信息不存在")
|
|
|
+ }
|
|
|
|
|
|
if err = s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
// 母牛信息
|
|
|
- newCalving := model.NewEventCalving(cow, req)
|
|
|
- if err = tx.Create(newCalving).Error; err != nil {
|
|
|
+ if err = tx.Model(new(model.EventCalving)).
|
|
|
+ Where("id = ?", newEventCalving.Id).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "reality_day": time.Unix(int64(req.CalvingAt), 0).Format(model.LayoutTime),
|
|
|
+ "day_age": cow.DayAge,
|
|
|
+ "lact": cow.Lact + 1,
|
|
|
+ "pregnancy_age": cow.PregnancyAge,
|
|
|
+ "calving_level": req.CalvingLevel,
|
|
|
+ "bull_number": cow.LastBullNumber,
|
|
|
+ "child_number": len(req.CalfItemList),
|
|
|
+ }).
|
|
|
+ Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
// 犊牛信息
|
|
|
- newCalvingCalfList := model.NewEventCalvingCalf(cow.Id, newCalving.Id, req)
|
|
|
+ newCalvingCalfList := model.NewEventCalvingCalf(cow.Id, newEventCalving.Id, req)
|
|
|
for _, v := range newCalvingCalfList {
|
|
|
if v.IsLive == pasturePb.IsShow_No || v.IsAdoption == pasturePb.IsShow_No {
|
|
|
continue
|
|
|
}
|
|
|
// 留养犊牛
|
|
|
- newCow := model.NewCalfCow(cow.Id, cow.LastBullId, v)
|
|
|
+ newCow := model.NewCalfCow(cow.Id, cow.LastBullNumber, v)
|
|
|
if err = tx.Create(newCow).Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
@@ -100,7 +114,7 @@ func (s *StoreEntry) CalvingCreate(ctx context.Context, req *pasturePb.EventCalv
|
|
|
"lact": cow.Lact + 1,
|
|
|
"breed_status": pasturePb.BreedStatus_Calving,
|
|
|
"is_pregnant": pasturePb.IsShow_No,
|
|
|
- "calving_at": time.Now().Unix(),
|
|
|
+ "calving_at": 0,
|
|
|
"last_calving_at": time.Now().Unix(),
|
|
|
}).Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
@@ -129,15 +143,13 @@ func (s *StoreEntry) PregnantCheckList(ctx context.Context, req *pasturePb.Searc
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
- systemUserList, _ := s.SystemUserList(ctx)
|
|
|
- pregnantCheckResult := s.PregnantCheckResultEnumList()
|
|
|
- pregnantCheckMethod := s.PregnantCheckMethodEnumList()
|
|
|
-
|
|
|
+ pregnantCheckResultMap := s.PregnantCheckResultMap()
|
|
|
+ pregnantCheckMethodMap := s.PregnantCheckMethodMap()
|
|
|
return &pasturePb.PregnantCheckEventResponse{
|
|
|
Code: http.StatusOK,
|
|
|
Message: "ok",
|
|
|
Data: &pasturePb.SearchPregnantCheckData{
|
|
|
- List: model.EventPregnantCheckSlice(pregnantCheckList).ToPB(systemUserList, pregnantCheckResult, pregnantCheckMethod),
|
|
|
+ List: model.EventPregnantCheckSlice(pregnantCheckList).ToPB(pregnantCheckResultMap, pregnantCheckMethodMap),
|
|
|
Total: int32(count),
|
|
|
PageSize: pagination.PageSize,
|
|
|
Page: pagination.Page,
|
|
@@ -153,71 +165,111 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
|
|
|
if err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
- eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
|
|
|
- currentUser, _ := s.GetCurrentSystemUser(ctx)
|
|
|
+ systemUser, _ := s.GetSystemUserById(ctx, int64(req.StaffMemberId))
|
|
|
|
|
|
+ pregnantCheckDay := time.Unix(int64(req.PregnantCheckAt), 0).Format(model.LayoutTime)
|
|
|
// 更新怀孕牛只
|
|
|
updatePregnantCowIds := make([]int64, 0)
|
|
|
// 更新流产牛只
|
|
|
updateAbortCowIds := make([]int64, 0)
|
|
|
// 更新空怀牛只
|
|
|
updateEmptyCowIds := make([]int64, 0)
|
|
|
+ cowIds := make([]int64, 0)
|
|
|
for _, cow := range cowList {
|
|
|
- // 过滤掉没有配种状态的牛只 todo 是否需要返回前端提示用户
|
|
|
+ // 过滤掉没有配种状态的牛只
|
|
|
if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
|
|
|
continue
|
|
|
}
|
|
|
- var count int64 = 0
|
|
|
+
|
|
|
+ itemEventPregnantCheck := &model.EventPregnantCheck{}
|
|
|
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 {
|
|
|
+ Order("id desc").First(itemEventPregnantCheck).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
|
|
|
+ if itemEventPregnantCheck.PregnantCheckName == model.PregnantCheckForFirst {
|
|
|
updateAbortCowIds = append(updateAbortCowIds, cow.Id)
|
|
|
- } else {
|
|
|
- pregnantCheckResult = pasturePb.PregnantCheckResult_InCheck_UnPregnant
|
|
|
+ }
|
|
|
+ if itemEventPregnantCheck.PregnantCheckName == model.PregnantCheckForSecond {
|
|
|
updateEmptyCowIds = append(updateEmptyCowIds, cow.Id)
|
|
|
}
|
|
|
}
|
|
|
- eventPregnantCheckList = append(eventPregnantCheckList, model.NewEventPregnantCheck(cow, currentUser, req, pregnantCheckResult))
|
|
|
+ cowIds = append(cowIds, cow.Id)
|
|
|
}
|
|
|
|
|
|
if err = s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
- if err = tx.Create(eventPregnantCheckList).Error; err != nil {
|
|
|
+ // 更新孕检事件表
|
|
|
+ if err = tx.Model(new(model.EventPregnantCheck)).
|
|
|
+ Where("id IN ?", cowIds).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "reality_day": pregnantCheckDay,
|
|
|
+ "pregnant_check_result": req.PregnantCheckResult,
|
|
|
+ "pregnant_check_method": req.PregnantCheckMethod,
|
|
|
+ "operation_id": systemUser.Id,
|
|
|
+ "operation_name": systemUser.Name,
|
|
|
+ "remarks": req.Remarks,
|
|
|
+ "is_pregnant": req.PregnantCheckResult,
|
|
|
+ }).Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
+ // 更新牛只信息和配种事件表怀孕状态
|
|
|
+ if len(updatePregnantCowIds) > 0 {
|
|
|
+ if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updatePregnantCowIds).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "breed_status": pasturePb.BreedStatus_Pregnant,
|
|
|
+ "last_pregnant_check_at": pregnantCheckDay,
|
|
|
+ "is_pregnant": pasturePb.IsShow_Ok,
|
|
|
+ }).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
|
|
|
- // 抽象公共方法来更新牛只状态
|
|
|
- err = s.updateCowStatus(tx, updatePregnantCowIds, pasturePb.BreedStatus_Pregnant, pasturePb.MatingResult_Pregnant)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updatePregnantCowIds).
|
|
|
+ Group("cow_id").Select("MAX(id) as id").
|
|
|
+ Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Pregnant}).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
}
|
|
|
+ // 更新牛只信息和配种事件表流产状态
|
|
|
+ if len(updateAbortCowIds) > 0 {
|
|
|
+ if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updateAbortCowIds).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "breed_status": pasturePb.BreedStatus_Abort,
|
|
|
+ "last_pregnant_check_at": pregnantCheckDay,
|
|
|
+ "is_pregnant": pasturePb.IsShow_Ok,
|
|
|
+ }).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
|
|
|
- err = s.updateCowStatus(tx, updateAbortCowIds, pasturePb.BreedStatus_Abort, pasturePb.MatingResult_Abort)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updateAbortCowIds).
|
|
|
+ Group("cow_id").Select("MAX(id) as id").
|
|
|
+ Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Abort}).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
}
|
|
|
+ // 更新牛只信息和配种事件表空怀状态
|
|
|
+ if len(updateEmptyCowIds) > 0 {
|
|
|
+ if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updateEmptyCowIds).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "breed_status": pasturePb.BreedStatus_Empty,
|
|
|
+ "last_pregnant_check_at": pregnantCheckDay,
|
|
|
+ "is_pregnant": pasturePb.IsShow_Ok,
|
|
|
+ }).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
|
|
|
- err = s.updateCowStatus(tx, updateEmptyCowIds, pasturePb.BreedStatus_Empty, pasturePb.MatingResult_Empty)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updateEmptyCowIds).
|
|
|
+ Group("cow_id").Select("MAX(id) as id").
|
|
|
+ Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Empty}).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
return nil
|
|
|
}); err != nil {
|
|
|
return xerr.WithStack(err)
|
|
@@ -226,28 +278,6 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
|
|
|
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
|
|
|
-}
|
|
|
-
|
|
|
func (s *StoreEntry) MatingList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.MatingEventResponse, error) {
|
|
|
matingList := make([]*model.EventMating, 0)
|
|
|
var count int64 = 0
|
|
@@ -379,7 +409,11 @@ func (s *StoreEntry) MatingCreate(ctx context.Context, req *pasturePb.EventMatin
|
|
|
|
|
|
if err = tx.Table(new(model.Cow).TableName()).
|
|
|
Where("id IN ?", cowIds).
|
|
|
- UpdateColumn("breed_status", pasturePb.BreedStatus_Breeding).Error; err != nil {
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "breed_status": pasturePb.BreedStatus_Breeding,
|
|
|
+ "last_bull_number": req.FrozenSemenNumber,
|
|
|
+ "last_mating_at": int64(req.MatingAt),
|
|
|
+ }).Error; err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
|