neck_ring_warning.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "net/http"
  8. "strings"
  9. "time"
  10. "gorm.io/gorm"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. "gitee.com/xuyiping_admin/pkg/xerr"
  13. )
  14. func (s *StoreEntry) EstrusOrAbortionCowList(ctx context.Context, req *pasturePb.WarningItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EstrusResponse, error) {
  15. userModel, err := s.GetUserModel(ctx)
  16. if err != nil {
  17. return nil, xerr.WithStack(err)
  18. }
  19. var count int64
  20. neckRingEstrusList := make([]*model.NeckRingEstrusWarning, 0)
  21. var pref *gorm.DB
  22. switch req.Kind {
  23. case "abortion":
  24. pref, err = s.AbortionWarningQuery(ctx, userModel.AppPasture.Id)
  25. if err != nil {
  26. return nil, xerr.WithStack(err)
  27. }
  28. default:
  29. pref, err = s.EstrusWarningQuery(ctx, userModel.AppPasture.Id)
  30. if err != nil {
  31. return nil, xerr.WithStack(err)
  32. }
  33. }
  34. if len(req.EarNumber) > 0 {
  35. pref.Where("a.ear_number = ?", req.EarNumber)
  36. }
  37. if req.Level > 0 {
  38. pref.Where("a.level = ?", req.Level)
  39. }
  40. if len(req.PenIds) > 0 {
  41. penIds := strings.Split(util.ArrayInt32ToStrings(req.PenIds, ","), ",")
  42. pref.Where("b.pen_id IN ?", penIds)
  43. }
  44. if err = pref.Order("a.level DESC").
  45. Count(&count).
  46. Limit(int(pagination.PageSize)).
  47. Offset(int(pagination.PageOffset)).
  48. Find(&neckRingEstrusList).Error; err != nil {
  49. return nil, xerr.WithStack(err)
  50. }
  51. cowMap := make(map[int64]*model.Cow)
  52. eventLogMap := make(map[int64]string)
  53. cowIds := make([]int64, 0)
  54. for _, v := range neckRingEstrusList {
  55. cowIds = append(cowIds, v.CowId)
  56. lastEventLog := s.GetCowLastEvent(userModel.AppPasture.Id, v.CowId, pasturePb.EventCategory_Breed)
  57. if lastEventLog != nil {
  58. eventLogMap[v.CowId] = lastEventLog.EventDescription
  59. }
  60. }
  61. if len(cowIds) > 0 {
  62. cowList, _ := s.GetCowInfoByCowIds(ctx, userModel.AppPasture.Id, cowIds)
  63. for _, cow := range cowList {
  64. cowMap[cow.Id] = cow
  65. }
  66. }
  67. return &pasturePb.EstrusResponse{
  68. Code: http.StatusOK,
  69. Msg: "ok",
  70. Data: &pasturePb.EstrusData{
  71. List: model.NeckRingEstrusWarningSlice(neckRingEstrusList).ToPB(cowMap, eventLogMap),
  72. Total: int32(count),
  73. PageSize: pagination.PageSize,
  74. Page: pagination.Page,
  75. },
  76. }, nil
  77. }
  78. func (s *StoreEntry) EstrusWarningQuery(ctx context.Context, pastureId int64) (*gorm.DB, error) {
  79. nowTime := time.Now()
  80. startTime := time.Unix(util.TimeParseLocalUnix(nowTime.Format(model.LayoutDate2)), 0).Format(model.LayoutTime)
  81. entTime := time.Unix(util.TimeParseLocalEndUnix(nowTime.AddDate(0, 0, 1).Format(model.LayoutDate2)), 0).Format(model.LayoutTime)
  82. systemBasic, err := s.FindSystemBasic(ctx, pastureId, model.EstrusWaringDays)
  83. if err != nil {
  84. return nil, xerr.WithStack(err)
  85. }
  86. return s.DB.Table(fmt.Sprintf("%s as a", new(model.NeckRingEstrusWarning).TableName())).
  87. Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
  88. Where("b.last_mating_at < UNIX_TIMESTAMP(a.date_time)").
  89. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  90. Where("b.is_forbidden_mating = ?", pasturePb.IsShow_No).
  91. Where("a.level >= ?", pasturePb.EstrusLevel_Low).
  92. Where("a.pasture_id = ?", pastureId).
  93. Where("a.date_time BETWEEN ? AND ?", startTime, entTime).
  94. Where(s.DB.Where("b.last_mating_at < UNIX_TIMESTAMP(a.first_time)").
  95. Or(s.DB.Where("b.last_mating_at = ?", 0).
  96. Where("b.calving_age > ?", systemBasic.MinValue).
  97. Or("b.lact = ?", 0))).
  98. Where("a.is_show = ?", pasturePb.IsShow_Ok), nil
  99. }
  100. func (s *StoreEntry) AbortionWarningQuery(ctx context.Context, pastureId int64) (*gorm.DB, error) {
  101. return s.DB.Table(fmt.Sprintf("%s as a", new(model.NeckRingEstrusWarning).TableName())).
  102. Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
  103. Where("b.pregnancy_age BETWEEN ? AND ?", 1, 260).
  104. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  105. Where("b.is_pregnant = ?", pasturePb.IsShow_Ok).
  106. Where("a.level >= ?", pasturePb.EstrusLevel_Middle).
  107. Where("a.pasture_id = ?", pastureId).
  108. Where("a.is_show = ?", pasturePb.IsShow_Ok), nil
  109. }