neck_ring_warning.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. )
  13. func (s *StoreEntry) EstrusCowList(ctx context.Context, req *pasturePb.EstrusItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EstrusResponse, error) {
  14. userModel, err := s.GetUserModel(ctx)
  15. if err != nil {
  16. return nil, xerr.WithStack(err)
  17. }
  18. systemBasic, err := s.FindSystemBasic(ctx, userModel.AppPasture.Id, model.EstrusWaringDays)
  19. if err != nil {
  20. return nil, xerr.WithStack(err)
  21. }
  22. nowTime := time.Now()
  23. startTime := time.Unix(util.TimeParseLocalUnix(nowTime.Format(model.LayoutDate2)), 0).Format(model.LayoutTime)
  24. entTime := time.Unix(util.TimeParseLocalEndUnix(nowTime.AddDate(0, 0, 1).Format(model.LayoutDate2)), 0).Format(model.LayoutTime)
  25. var count int64
  26. neckRingEstrusList := make([]*model.NeckRingEstrusWarning, 0)
  27. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.NeckRingEstrusWarning).TableName())).
  28. Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
  29. Where("b.last_mating_at < UNIX_TIMESTAMP(a.date_time)").
  30. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  31. Where("b.is_not_mating = ?", pasturePb.IsShow_No).
  32. Where("a.level >= ?", pasturePb.EstrusLevel_Low).
  33. Where("a.pasture_id = ?", userModel.AppPasture.Id).
  34. Where("a.date_time BETWEEN ? AND ?", startTime, entTime).
  35. Where(s.DB.Where("b.last_mating_at < UNIX_TIMESTAMP(a.first_time)").
  36. Or(s.DB.Where("b.last_mating_at = ?", 0).
  37. Where("b.calving_age > ?", systemBasic.MinValue).
  38. Or("b.lact = ?", 0))).
  39. Where("a.is_show = ?", pasturePb.IsShow_Ok)
  40. if len(req.EarNumber) > 0 {
  41. pref.Where("a.ear_number = ?", req.EarNumber)
  42. }
  43. if req.Level > 0 {
  44. pref.Where("a.level = ?", req.Level)
  45. }
  46. if len(req.PenIds) > 0 {
  47. penIds := strings.Split(util.ArrayInt32ToStrings(req.PenIds, ","), ",")
  48. pref.Where("b.pen_id IN ?", penIds)
  49. }
  50. if err = pref.Order("a.level DESC").
  51. Count(&count).
  52. Limit(int(pagination.PageSize)).
  53. Offset(int(pagination.PageOffset)).
  54. Find(&neckRingEstrusList).Error; err != nil {
  55. return nil, xerr.WithStack(err)
  56. }
  57. cowMap := make(map[int64]*model.Cow)
  58. eventLogMap := make(map[int64]string)
  59. cowIds := make([]int64, 0)
  60. for _, v := range neckRingEstrusList {
  61. cowIds = append(cowIds, v.CowId)
  62. lastEventLog := s.GetCowLastEvent(userModel.AppPasture.Id, v.CowId, pasturePb.EventCategory_Breed)
  63. if lastEventLog != nil {
  64. eventLogMap[v.CowId] = lastEventLog.EventDescription
  65. }
  66. }
  67. if len(cowIds) > 0 {
  68. cowList, _ := s.GetCowInfoByCowIds(ctx, userModel.AppPasture.Id, cowIds)
  69. for _, cow := range cowList {
  70. cowMap[cow.Id] = cow
  71. }
  72. }
  73. return &pasturePb.EstrusResponse{
  74. Code: http.StatusOK,
  75. Msg: "ok",
  76. Data: &pasturePb.EstrusData{
  77. List: model.NeckRingEstrusWarningSlice(neckRingEstrusList).ToPB(cowMap, eventLogMap),
  78. Total: int32(count),
  79. PageSize: pagination.PageSize,
  80. Page: pagination.Page,
  81. },
  82. }, nil
  83. }