| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 | 
							- package backend
 
- import (
 
- 	"context"
 
- 	"encoding/json"
 
- 	"fmt"
 
- 	"kpt-pasture/model"
 
- 	"net/http"
 
- 	"strings"
 
- 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 
- 	"gitee.com/xuyiping_admin/pkg/xerr"
 
- 	"gorm.io/gorm"
 
- )
 
- func (s *StoreEntry) PregnantCheckList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.PregnantCheckEventResponse, error) {
 
- 	pregnantCheckList := make([]*model.EventPregnantCheck, 0)
 
- 	var count int64 = 0
 
- 	pref := s.DB.Table(new(model.EventPregnantCheck).TableName())
 
- 	if len(req.CowId) > 0 {
 
- 		cowIds := strings.Split(req.CowId, ",")
 
- 		pref.Where("cow_id IN ?", cowIds)
 
- 	}
 
- 	if err := pref.Order("id desc").
 
- 		Count(&count).Limit(int(pagination.PageSize)).
 
- 		Offset(int(pagination.PageOffset)).
 
- 		Find(&pregnantCheckList).Error; err != nil {
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	pregnantCheckResultMap := s.PregnantCheckResultMap()
 
- 	pregnantCheckMethodMap := s.PregnantCheckMethodMap()
 
- 	return &pasturePb.PregnantCheckEventResponse{
 
- 		Code:    http.StatusOK,
 
- 		Message: "ok",
 
- 		Data: &pasturePb.SearchPregnantCheckData{
 
- 			List:     model.EventPregnantCheckSlice(pregnantCheckList).ToPB(pregnantCheckResultMap, pregnantCheckMethodMap),
 
- 			Total:    int32(count),
 
- 			PageSize: pagination.PageSize,
 
- 			Page:     pagination.Page,
 
- 		},
 
- 	}, nil
 
- }
 
- func (s *StoreEntry) PregnantCheckCreateBatch(ctx context.Context, req *pasturePb.EventPregnantCheckBatch) error {
 
- 	pregnantCheckBatchModelList, err := s.PregnantCheckCreateCheck(ctx, req)
 
- 	if err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	currentUser, err := s.GetCurrentSystemUser(ctx)
 
- 	if err != nil {
 
- 		return xerr.Customf("获取当前用户失败: %s", err.Error())
 
- 	}
 
- 	penMap := s.PenMap(ctx)
 
- 	// 新增孕检牛只
 
- 	newEventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
 
- 	// 更新孕检牛只
 
- 	newPregnantCheckBatchModelList := make([]*PregnantCheckBatchModel, 0)
 
- 	for _, item := range pregnantCheckBatchModelList {
 
- 		itemEventPregnantCheck, err := s.GetEventPregnantCheckIsExIstByCowId(ctx, item.Cow)
 
- 		if err != nil {
 
- 			return xerr.WithStack(err)
 
- 		}
 
- 		// 孕检清单里面没有的,需要新增孕检事件
 
- 		eventCheckModel := model.NewEventPregnantCheck2(&model.EventPregnantCheck2{
 
- 			Cow:                 item.Cow,
 
- 			OperationUser:       item.OperationUser,
 
- 			CurrentUser:         currentUser,
 
- 			PregnantCheckAt:     int64(item.PregnantCheckAt),
 
- 			PregnantCheckMethod: item.PregnantCheckMethod,
 
- 			PregnantCheckResult: item.PregnantCheckResult,
 
- 			Remarks:             item.Remarks,
 
- 		}, penMap)
 
- 		if itemEventPregnantCheck.Id <= 0 {
 
- 			newEventPregnantCheckList = append(newEventPregnantCheckList, eventCheckModel)
 
- 		} else {
 
- 			item.EventPregnancyCheck = itemEventPregnantCheck
 
- 			newPregnantCheckBatchModelList = append(newPregnantCheckBatchModelList, item)
 
- 		}
 
- 	}
 
- 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
 
- 		// 新增孕检事件
 
- 		if len(newEventPregnantCheckList) > 0 {
 
- 			if err = tx.Create(newEventPregnantCheckList).Error; err != nil {
 
- 				return xerr.WithStack(err)
 
- 			}
 
- 		}
 
- 		for _, item := range newPregnantCheckBatchModelList {
 
- 			breedStatus := pasturePb.BreedStatus_Pregnant
 
- 			isPregnant := pasturePb.IsShow_Ok
 
- 			if item.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant {
 
- 				breedStatus = pasturePb.BreedStatus_Empty
 
- 				isPregnant = pasturePb.IsShow_No
 
- 			}
 
- 			// 更新上一次配种结果数据,如何是复检无胎则更新为流产
 
- 			if item.EventPregnancyCheck.PregnantCheckName == model.PregnantCheckForSecond {
 
- 				breedStatus = pasturePb.BreedStatus_Abort
 
- 			}
 
- 			// 更新牛只基本信息
 
- 			if err = tx.Model(&model.Cow{}).
 
- 				Where("cow_id = ?", item.Cow.Id).
 
- 				Updates(map[string]interface{}{
 
- 					"breed_status":           breedStatus,
 
- 					"last_pregnant_check_at": item.PregnantCheckAt,
 
- 					"is_pregnant":            isPregnant,
 
- 				}).Error; err != nil {
 
- 				return xerr.WithStack(err)
 
- 			}
 
- 			if err = tx.Model(new(model.EventMating)).
 
- 				Where("id = (?)", fmt.Sprintf(`
 
- 					SELECT id FROM event_mating where cow_id = %d AND status = %d ORDER BY id DESC LIMIT 1
 
- 				`, item.Cow.Id, pasturePb.IsShow_Ok)).
 
- 				Updates(map[string]interface{}{
 
- 					"mating_result":    breedStatus,
 
- 					"mating_result_at": item.PregnantCheckAt,
 
- 				}).Error; err != nil {
 
- 				return xerr.WithStack(err)
 
- 			}
 
- 			// 更新孕检事件表
 
- 			if err = tx.Model(new(model.EventPregnantCheck)).
 
- 				Where("id = ?", item.EventPregnancyCheck.Id).
 
- 				Updates(map[string]interface{}{
 
- 					"reality_day":           item.PregnantCheckAt,
 
- 					"pregnant_check_result": item.PregnantCheckResult,
 
- 					"pregnant_check_method": item.PregnantCheckMethod,
 
- 					"operation_id":          item.OperationUser.Id,
 
- 					"operation_name":        item.OperationUser.Name,
 
- 					"message_id":            currentUser.Id,
 
- 					"message_name":          currentUser.Name,
 
- 					"remarks":               item.Remarks,
 
- 					"status":                pasturePb.IsShow_Ok,
 
- 				}).Error; err != nil {
 
- 				return xerr.WithStack(err)
 
- 			}
 
- 		}
 
- 		return nil
 
- 	}); err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	return nil
 
- }
 
- func (s *StoreEntry) AbortionCreate(ctx context.Context, req *pasturePb.EventAbortionRequest) error {
 
- 	cow, err := s.GetCowInfoByCowId(ctx, int64(req.CowId))
 
- 	if err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	systemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
 
- 	if err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	req.OperationName = systemUser.Name
 
- 	abortionReasonsMap := s.AbortionReasonsMap()
 
- 	newEventAbortion := model.NewEventAbortion(cow, req, abortionReasonsMap)
 
- 	lastCowMating := &model.EventMating{}
 
- 	if err = s.DB.Model(new(model.EventMating)).Where("cow_id = ?", cow.Id).
 
- 		Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
 
- 		Order("id desc").First(lastCowMating).Error; err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
 
- 		// 创建牛只流产事件数据
 
- 		if err = tx.Create(newEventAbortion).Error; err != nil {
 
- 			return xerr.WithStack(err)
 
- 		}
 
- 		// 更新牛只状态
 
- 		if err = tx.Model(new(model.Cow)).Where("id = ?", req.CowId).
 
- 			Updates(map[string]interface{}{
 
- 				"is_pregnant":      pasturePb.IsShow_No,
 
- 				"last_abortion_at": req.AbortionAt,
 
- 				"breed_status":     pasturePb.BreedStatus_Abort,
 
- 			}).Error; err != nil {
 
- 			return xerr.WithStack(err)
 
- 		}
 
- 		// 更新最近一次配种结果为流产
 
- 		if err = tx.Model(new(model.EventMating)).
 
- 			Where("id = ?", lastCowMating.Id).
 
- 			Updates(map[string]interface{}{
 
- 				"mating_result":    pasturePb.MatingResult_Abort,
 
- 				"mating_result_at": req.AbortionAt,
 
- 			}).Error; err != nil {
 
- 		}
 
- 		return nil
 
- 	}); err != nil {
 
- 		return xerr.WithStack(err)
 
- 	}
 
- 	return nil
 
- }
 
- func (s *StoreEntry) AbortionCreateBatch(ctx context.Context, req *pasturePb.EventAbortionBatch) error {
 
- 	if len(req.Item) <= 0 {
 
- 		return xerr.WithStack(xerr.New("流产数据不能为空"))
 
- 	}
 
- 	errors := make(map[int32]error)
 
- 	for _, v := range req.Item {
 
- 		if err := s.AbortionCreate(ctx, v); err != nil {
 
- 			errors[v.CowId] = err
 
- 		}
 
- 	}
 
- 	if len(errors) > 0 {
 
- 		b, _ := json.Marshal(errors)
 
- 		return xerr.WithStack(xerr.Customf("部分流产数据创建失败: %s", string(b)))
 
- 	}
 
- 	return nil
 
- }
 
- func (s *StoreEntry) AbortionList(
 
- 	ctx context.Context,
 
- 	req *pasturePb.SearchEventRequest,
 
- 	pagination *pasturePb.PaginationModel,
 
- ) (*pasturePb.EventAbortionResponse, error) {
 
- 	abortionList := make([]*model.EventAbortion, 0)
 
- 	var count int64 = 0
 
- 	pref := s.DB.Model(new(model.EventAbortion))
 
- 	if len(req.CowId) > 0 {
 
- 		cowIds := strings.Split(req.CowId, ",")
 
- 		pref.Where("cow_id IN ?", cowIds)
 
- 	}
 
- 	if err := pref.Order("id desc").
 
- 		Count(&count).Limit(int(pagination.PageSize)).
 
- 		Offset(int(pagination.PageOffset)).
 
- 		Find(&abortionList).Error; err != nil {
 
- 		return nil, xerr.WithStack(err)
 
- 	}
 
- 	return &pasturePb.EventAbortionResponse{
 
- 		Code:    http.StatusOK,
 
- 		Message: "ok",
 
- 		Data: &pasturePb.EventAbortionData{
 
- 			List:     model.AbortionSlice(abortionList).ToPB(),
 
- 			Total:    int32(count),
 
- 			PageSize: pagination.PageSize,
 
- 			Page:     pagination.Page,
 
- 		},
 
- 	}, nil
 
- }
 
 
  |